instcat.sql accidentally ran on x64 SQL2005 SP2 Server

  • I was trying to use xp_cmdshell to execute all scripts in a folder and my code accidentally ran C:\Windows\System32\instcat.sql on the SQL2005 server I was on. There are many strange messages in the output file like the one below. Did this fry all the 2005 master SP's? All the searches I could find online about this script is that you run it on SQL 2000 machines when trying to connect a linked server with 2005. But is it bad if it's run on a 2005 server? I've tried to trace version history online of this file and it seems it only goes up to SQL2000 SP4 so I assume that it must have screwed up something. Many thanks.

    creating sp_oledb_indexinfo

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_oledb_indexinfo, Line 59

    There is already an object named 'sp_oledb_indexinfo' in the database.

  • Denny Cherry where are you when I need you!

  • great so, can't find anything about impact of running this on 2005 except you shouldn't and that it is supposed to be in the install directory of sql which it isn't in 2005(http://support.microsoft.com/kb/906954/). guess i'm going to restore the master database tonight = awesome.

  • creating sp_oledb_indexinfo

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_oledb_indexinfo, Line 59

    There is already an object named 'sp_oledb_indexinfo' in the database.

    Hi djspchless,

    I don't know how serious is your problem. Is your server still working? The message you are getting is only telling you that the stored procedure already exist. If your server is running fine I don't know if you really need torestore the master, but I'm not 100% sure. I will like to get more information about your situation. Could you please add some more info.

  • hi Ignacio,

    thanks for the reply. yes the server is still working but this is a dev/test server, so i don't know if or when the API of our application will hit the catalog stored procedures in the master database and potentially bomb out. when i reviewed the output of the instcat.sql, i compared a few sp's in the master database from this server with our server in production which was untouched and found no differences. but i only checked a few. my searches today have led me to believe that this script was published by microsoft until sql server 2000 sp4, then it was discarded i think, not 100% sure though. in any case, the output file is huge as the script updates all catalog stored procedures in the master database, but what i'm worried about is that it rebuilt these procedures on a 2005 server back to a version of a 2000 server. The script is located in C:\Windows\System32\instcat.sql which is weird, because microsofts website says it should be in \\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Install. It's like an artifact from an upgrade to 2005, or service pack, I don't know. The date of the instcat.sql file is 2/18/2007 8:00AM and unlikely to have been edited since this matched exact time on two different 2005 servers we have when I checked. This doesn't reference to any date stamps microsoft has on their site about previous versions of this script. At least none i could find. I've spent so much time researching this now though i think restoring the master database would just be an easier solution as the support for running this script on a 2005 server seems to be scarce. If there's any other info you'd like to know please ask.

  • Hi, I will like to see what the script does. Could you please let me now where to find it. Can you see in the output file if anything was updated?

  • After further consideration from your post, instead of restoring the master I've decided to sift through the output of the script and manually search exactly what it did. I figure it will be a good thing to know if i'm ever troubleshooting a different server. Tomorrow I'll post two replies, one with the script and one with the output. Thanks again.

  • Your welcome!

  • /*** SCRIPT C:\WINDOWS\SYSTEM32\INSTCAT.SQL (2/18/2007 8:00 AM) ***/

    /*

    ** INSTCAT.SQL

    ** Installs catalog stored procedures on the Microsoft SQL Server.

    ** Copyright Microsoft, Inc. 1994 - 2000

    ** All Rights Reserved.

    **

    ** Owners:

    **

    ** <owner current="true" primary="true">iliak</owner>

    */

    /****************************************************************************/

    /* This portion sets up the ability to perform all the functions in this */

    /* script */

    /****************************************************************************/

    go

    use master

    go

    dump tran master with no_log

    go

    set quoted_identifier on

    go

    if (exists (select * from sysobjects

    where name = 'sp_configure' and type = 'P '))

    begin

    execute sp_configure 'update',1

    end

    reconfigure with override

    go

    exec sp_MS_upd_sysobj_category 1 /*Capture datetime for use below.*/

    go

    /*

    ** If old versions of tables exist, drop them.

    */

    if (exists (select * from sysobjects

    where name = 'MSdatatype_info' and type = 'U '))

    drop table MSdatatype_info

    go

    if (exists (select * from sysobjects

    where name = 'MSdatatype_info_ext' and type = 'U '))

    drop table MSdatatype_info_ext

    go

    if (exists (select * from sysobjects

    where name = 'MStable_types' and type = 'U '))

    drop table MStable_types

    go

    if (exists (select * from sysobjects

    where name = 'MSserver_info' and type = 'U '))

    drop table MSserver_info

    go

    if (exists (select * from sysobjects

    where name = 'spt_table_types' and type = 'U '))

    drop table spt_table_types

    go

    /*

    ** If tables or procs already exist, drop them.

    */

    if (exists (select * from sysobjects

    where name = 'spt_datatype_info' and type = 'U '))

    drop table spt_datatype_info

    go

    if (exists (select * from sysobjects

    where name = 'spt_datatype_info_ext' and type = 'U '))

    drop table spt_datatype_info_ext

    go

    if (exists (select * from sysobjects

    where name = 'sp_add_server_sortinfo' and type = 'P '))

    drop proc sp_add_server_sortinfo

    go

    if (exists (select * from sysobjects

    where name = 'sp_add_server_sortinfo75' and type = 'P '))

    drop proc sp_add_server_sortinfo75

    go

    if (exists (select * from sysobjects

    where name = 'spt_server_info' and type = 'U '))

    drop table spt_server_info

    go

    if (exists (select * from sysobjects

    where name = 'sp_tables' and type = 'P '))

    drop proc sp_tables

    go

    if (exists (select * from sysobjects

    where name = 'sp_statistics' and type = 'P '))

    drop proc sp_statistics

    go

    if (exists (select * from sysobjects

    where name = 'sp_columns' and type = 'P '))

    drop proc sp_columns

    go

    if (exists (select * from sysobjects

    where name = 'sp_fkeys' and type = 'P '))

    drop proc sp_fkeys

    go

    if (exists (select * from sysobjects

    where name = 'sp_pkeys' and type = 'P '))

    drop proc sp_pkeys

    dump tran master with no_log

    go

    go

    if (exists (select * from sysobjects

    where name = 'sp_stored_procedures' and type = 'P '))

    drop proc sp_stored_procedures

    go

    if (exists (select * from sysobjects

    where name = 'sp_sproc_columns' and type = 'P '))

    drop proc sp_sproc_columns

    go

    if (exists (select * from sysobjects

    where name = 'sp_table_privileges' and type = 'P '))

    drop proc sp_table_privileges

    go

    if (exists (select * from sysobjects

    where name = 'sp_column_privileges' and type = 'P '))

    drop proc sp_column_privileges

    go

    dump tran master with no_log

    go

    if (exists (select * from sysobjects

    where name = 'sp_server_info' and type = 'P '))

    drop proc sp_server_info

    go

    if (exists (select * from sysobjects

    where name = 'sp_datatype_info' and type = 'P '))

    drop proc sp_datatype_info

    go

    if (exists (select * from sysobjects

    where name = 'sp_special_columns' and type = 'P '))

    drop proc sp_special_columns

    go

    if (exists (select * from sysobjects

    where name = 'sp_databases' and type = 'P '))

    drop proc sp_databases

    go

    dump tran master with no_log

    go

    if (exists (select * from sysobjects

    where name = 'sp_ddopen' and type = 'P '))

    drop proc sp_ddopen

    go

    if (exists (select * from sysobjects

    where name = 'sp_tableswc' and type = 'P '))

    drop proc sp_tableswc

    go

    if (exists (select * from sysobjects

    where name = 'sp_tablecollations' and type = 'P'))

    drop proc sp_tablecollations

    go

    if (exists (select * from sysobjects

    where name = 'sp_bcp_dbcmptlevel' and type = 'P'))

    drop proc sp_bcp_dbcmptlevel

    go

    dump tran master with no_log

    go

    if (exists (select * from sysobjects

    where name = 'spt_provider_types' and type = 'U '))

    begin

    drop table spt_provider_types

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_catalogs_rowset' and type = 'P '))

    begin

    drop procedure sp_catalogs_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_column_privileges_rowset' and type = 'P '))

    begin

    drop procedure sp_column_privileges_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_columns_rowset' and type = 'P '))

    begin

    drop procedure sp_columns_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_check_constraints_rowset' and type = 'P '))

    begin

    drop procedure sp_check_constraints_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_check_constbytable_rowset' and type = 'P '))

    begin

    drop procedure sp_check_constbytable_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_foreign_keys_rowset' and type = 'P '))

    begin

    drop procedure sp_foreign_keys_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_indexes_rowset' and type = 'P '))

    begin

    drop procedure sp_indexes_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_primary_keys_rowset' and type = 'P '))

    begin

    drop procedure sp_primary_keys_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_procedure_params_rowset' and type = 'P '))

    begin

    drop procedure sp_procedure_params_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_procedures_rowset' and type = 'P '))

    begin

    drop procedure sp_procedures_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_provider_types_rowset' and type = 'P '))

    begin

    drop procedure sp_provider_types_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_schemata_rowset' and type = 'P '))

    begin

    drop procedure sp_schemata_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_statistics_rowset' and type = 'P '))

    begin

    drop procedure sp_statistics_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_tables_rowset' and type = 'P '))

    begin

    drop procedure sp_tables_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_tables_info_rowset' and type = 'P '))

    begin

    drop procedure sp_tables_info_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_tables_info_rowset_64' and type = 'P '))

    begin

    drop procedure sp_tables_info_rowset_64

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_table_constraints_rowset' and type = 'P '))

    begin

    drop proc sp_table_constraints_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_table_privileges_rowset' and type = 'P '))

    begin

    drop proc sp_table_privileges_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_linkedservers_rowset' and type = 'P '))

    begin

    drop proc sp_linkedservers_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_table_statistics_rowset' and type = 'P '))

    begin

    drop proc sp_table_statistics_rowset

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_column_constraints' and type = 'P '))

    begin

    drop proc sp_oledb_column_constraints

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_indexinfo' and type = 'P '))

    begin

    drop proc sp_oledb_indexinfo

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_ro_usrname' and type = 'P '))

    begin

    drop proc sp_oledb_ro_usrname

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_deflang' and type = 'P '))

    begin

    drop proc sp_oledb_deflang

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_defdb' and type = 'P '))

    begin

    drop proc sp_oledb_defdb

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_database' and type = 'P '))

    begin

    drop proc sp_oledb_database

    dump tran master with no_log

    end

    go

    if (exists (select * from sysobjects

    where name = 'sp_oledb_language' and type = 'P '))

    begin

    drop proc sp_oledb_language

    dump tran master with no_log

    end

    go

    print 'creating table spt_datatype_info_ext'

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Pre 6.0 server */

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following error.'

    create table spt_datatype_info_ext (

    user_type smallint not null,

    CREATE_PARAMS varchar(32) null,

    AUTO_INCREMENT smallint null,

    typename varchar(32))

    end

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* 6.0 or later server */

    create table spt_datatype_info_ext (

    user_type smallint not null,

    CREATE_PARAMS varchar(32) null,

    AUTO_INCREMENT smallint null,

    typename sysname) /* from systypes, to avoid xusertype hard-code */

    end

    go

    grant select on spt_datatype_info_ext to public

    go

    insert into spt_datatype_info_ext

    /* CHAR user_type, create_params, auto_increment */

    values (1, 'length' ,0, 'char')

    insert into spt_datatype_info_ext

    /* VARCHAR user_type, create_params, auto_increment */

    values (2, 'max length' ,0, 'varchar')

    insert into spt_datatype_info_ext

    /* BINARY user_type, create_params, auto_increment */

    values (3, 'length' ,0, 'binary')

    insert into spt_datatype_info_ext

    /* VARBINARY user_type, create_params, auto_increment */

    values (4, 'max length' ,0, 'varbinary')

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Add 6.0 data types */

    insert into spt_datatype_info_ext

    /* DECIMAL user_type, create_params, auto_increment */

    values (26, 'precision,scale' ,0, 'decimal')

    insert into spt_datatype_info_ext

    /* NUMERIC user_type, create_params, auto_increment */

    values (25, 'precision,scale' ,0, 'numeric')

    insert into spt_datatype_info_ext

    /* DECIMAL IDENTITY user_type, create_params, auto_increment */

    values (26, 'precision' ,1, 'decimal')

    insert into spt_datatype_info_ext

    /* NUMERIC IDENTITY user_type, create_params, auto_increment */

    values (25, 'precision' ,1, 'numeric')

    end

    else /* Pre 6.0 server, add SYSNAME create param */

    begin

    insert into spt_datatype_info_ext

    /* SYSNAME user_type, create_param, auto_increments */

    values (18, 'max length' ,0, 'sysname')

    end

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Update usertypes for 8.0 server */

    begin tran

    insert into spt_datatype_info_ext

    /* NCHAR user_type, create_params, auto_increment */

    values (0, 'length' ,0, 'nchar')

    insert into spt_datatype_info_ext

    /* NVARCHAR user_type, create_params, auto_increment */

    values (0, 'max length' ,0, 'nvarchar')

    /* SET user_type TO SPHINX VALUES */

    update spt_datatype_info_ext set user_type = xusertype

    from spt_datatype_info_ext e, systypes t where t.name = e.typename

    commit tran

    end

    go

    create unique clustered index datatypeinfoextclust on spt_datatype_info_ext(user_type,AUTO_INCREMENT)

    go

    print 'creating table spt_datatype_info'

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Pre 6.0 server */

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following error.'

    create table spt_datatype_info (

    ss_dtype tinyint not null,

    fixlen int null, /* datatype len for variable, else null */

    ODBCVer tinyint null, /* version if needed, else null */

    TYPE_NAME varchar(32) not null,

    DATA_TYPE smallint not null,

    data_precision int null,

    numeric_scale smallint null, /* min scale if 6.0 */

    RADIX smallint null,

    length int null,

    LITERAL_PREFIX varchar(32) null,

    LITERAL_SUFFIX varchar(32) null,

    CREATE_PARAMS varchar(32) null,

    NULLABLE smallint not null,

    CASE_SENSITIVE smallint not null,

    SEARCHABLE smallint not null,

    UNSIGNED_ATTRIBUTE smallint null,

    MONEY smallint not null,

    AUTO_INCREMENT smallint null,

    LOCAL_TYPE_NAME varchar(32) null,

    charbin tinyint null, /* 0 for char/binary types, NULL for all others */

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null)

    end

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* 6.0 or later server */

    create table spt_datatype_info (

    ss_dtype tinyint not null,

    fixlen int null, /* datatype len for variable, else null */

    ODBCVer tinyint null, /* version if needed, else null */

    TYPE_NAME sysname not null,

    DATA_TYPE smallint not null,

    data_precision int null,

    numeric_scale smallint null, /* min scale if 6.0 */

    RADIX smallint null,

    length int null,

    LITERAL_PREFIX varchar(32) null,

    LITERAL_SUFFIX varchar(32) null,

    CREATE_PARAMS varchar(32) null,

    NULLABLE smallint not null,

    CASE_SENSITIVE smallint not null,

    SEARCHABLE smallint not null,

    UNSIGNED_ATTRIBUTE smallint null,

    MONEY smallint not null,

    AUTO_INCREMENT smallint null,

    LOCAL_TYPE_NAME sysname null,

    charbin tinyint null, /* 0 for char/binary types, NULL for all others */

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null)

    end

    go

    grant select on spt_datatype_info to public

    go

    /* Get case sensitivity */

    if 'A' = 'A' /* create dummy begin block */

    begin

    declare @case smallint

    begin tran

    select @case = 0

    select @case = 1 where 'a' <> 'A'

    /* Local Binary */

    insert into spt_datatype_info values

    (45,null,null,'binary',-2,null,null,null,null,'0x',null,'length',1,0,2,null,0,null,'binary',0,-2,null)

    /* Local Bit */

    insert into spt_datatype_info values

    (50,null,null,'bit',-7,1,0,null,1,null,null,null,0,0,2,null,0,null,'bit',null,-7,null)

    /* Local Char */

    insert into spt_datatype_info values

    (47,null,null,'char',1,null,null,null,null,'''','''','length',1,@case,3,null,0,null,'char',0,1,null)

    /* Local Datetime */

    insert into spt_datatype_info values

    (61,8,2,'datetime',11,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)

    insert into spt_datatype_info values

    (61,8,3,'datetime',93,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)

    /* Local Smalldatetime */

    insert into spt_datatype_info values

    (58,4,2,'smalldatetime',11,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)

    insert into spt_datatype_info values

    (58,4,3,'smalldatetime',93,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)

    /* Local Float */

    insert into spt_datatype_info values

    (62,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)

    insert into spt_datatype_info values

    (62,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)

    /* Local Real */

    insert into spt_datatype_info values

    (59,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)

    insert into spt_datatype_info values

    (59,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)

    /* Local Smallmoney */

    insert into spt_datatype_info values

    (122,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)

    /* Local Money */

    insert into spt_datatype_info values

    (60,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)

    /* Local Int */

    insert into spt_datatype_info values

    (56,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)

    commit tran

    end

    go

    if 'A' = 'A' /* create dummy begin block */

    begin

    declare @case smallint

    begin tran

    select @case = 0

    select @case = 1 where 'a' <> 'A'

    /* Local Smallint */

    insert into spt_datatype_info values

    (52,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)

    insert into spt_datatype_info values

    (52,2,1,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)

    /* Local Tinyint */

    insert into spt_datatype_info values

    (48,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)

    /* Local Text */

    insert into spt_datatype_info values

    (35,null,null,'text',-1,2147483647,null,null,2147483647,'''','''',null,1,@case,1,null,0,null,'text',0,-1,null)

    /* Local Varbinary */

    insert into spt_datatype_info values

    (37,null,null,'varbinary',-3,null,null,null,null,'0x',null,'max length',1,0,2,null,0,null,'varbinary',0,-3,null)

    /* Local Varchar */

    insert into spt_datatype_info values

    (39,null,null,'varchar',12,null,null,null,null,'''','''','max length',1,@case,3,null,0,null,'varchar',0,12,null)

    /* Local Image */

    insert into spt_datatype_info values

    (34,null,null,'image',-4,2147483647,null,null,2147483647,'0x',null,null,1,0,0,null,0,null,'image',0,-4,null)

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Add 6.0 data types */

    /* Local Decimal */

    insert into spt_datatype_info values /* sql server type is 'decimaln' */

    (55,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)

    /* Local Numeric */

    insert into spt_datatype_info values /* sql server type is 'numericn' */

    (63,null,null,'numeric',2 ,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)

    /* Identity attribute data types */

    /* Identity Int */

    insert into spt_datatype_info values

    (56,null,null,'int identity',4,10,0,10,null,null,null,null,0,0,2,0,0,1,'int identity',null,4,null)

    /* Identity Smallint */

    insert into spt_datatype_info values

    (52,null,null,'smallint identity',5,5,0,10,null,null,null,null,0,0,2,0,0,1,'smallint identity',null,5,null)

    /* Identity Tinyint */

    insert into spt_datatype_info values

    (48,null,null,'tinyint identity',-6,3,0,10,null,null,null,null,0,0,2,1,0,1,'tinyint identity',null,-6,null)

    /* Identity Numeric */

    insert into spt_datatype_info values /* sql server type is 'decmaln' */

    (55,null,null,'decimal() identity',3,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'decimal() identity',null,3,null)

    /* Identity Numeric */

    insert into spt_datatype_info values /* sql server type is 'decmaln' */

    (63,null,null,'numeric() identity',2,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'numeric() identity',null,2,null)

    end

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Add nullable type for non-8.0 server */

    /* Local Datetimn */

    insert into spt_datatype_info values

    (111,4,2,'smalldatetime',11,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)

    insert into spt_datatype_info values

    (111,4,3,'smalldatetime',93,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)

    insert into spt_datatype_info values /* sql server type is 'datetimn' */

    (111,8,2,'datetime',11,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)

    insert into spt_datatype_info values

    (111,8,3,'datetime',93,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)

    /* Local Floatn */

    insert into spt_datatype_info values /* sql server type is 'floatn' */

    (109,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)

    insert into spt_datatype_info values

    (109,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)

    insert into spt_datatype_info values /* sql server type is 'floatn' */

    (109,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)

    insert into spt_datatype_info values

    (109,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)

    /* Local Moneyn */

    insert into spt_datatype_info values /* sql server type is 'moneyn' */

    (110,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)

    insert into spt_datatype_info values /* sql server type is 'moneyn' */

    (110,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)

    /* Local Intn */

    insert into spt_datatype_info values /* sql server type is 'intn' */

    (38,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)

    insert into spt_datatype_info values /* sql server type is 'intn' */

    (38,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)

    insert into spt_datatype_info values

    (38,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Add 6.0 data types */

    /* Local Decimaln */

    insert into spt_datatype_info values /* sql server type is 'decimaln' */

    (106,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)

    insert into spt_datatype_info values /* sql server type is 'decmaln' */

    (106,null,null,'decimal() identity',3,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'decimal() identity',null,3,null)

    /* Local Numericn */

    insert into spt_datatype_info values /* sql server type is 'numericn' */

    (108,null,null,'numeric',2,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)

    insert into spt_datatype_info values /* sql server type is 'decmaln' */

    (108,null,null,'numeric() identity',2,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'numeric() identity',null,2,null)

    end

    end

    commit tran

    end

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin

    declare @ncase smallint

    select @ncase = 0

    select @ncase = 1 where N'a' <> N'A'

    /* Local Timestamp */

    insert into spt_datatype_info values

    (0,null,null,'timestamp',-2,8,null,null,null,'0x',null,null,1,0,2,null,0,null,'timestamp',0,-2,null)

    /* Local GUID */

    insert into spt_datatype_info values

    (0,null,null,'uniqueidentifier',-11,36,null,null,null,'''','''',null,1,0,2,null,0,null,'uniqueidentifier',NULL,-11,null)

    /* Local NChar */

    insert into spt_datatype_info values

    (0,null,null,'nchar',-8,null,null,null,null,'N''','''','length',1,@ncase,3,null,0,null,'nchar',0,-8,null)

    /* Local NVarchar */

    insert into spt_datatype_info values

    (0,null,null,'nvarchar',-9,null,null,null,null,'N''','''','max length',1,@ncase,3,null,0,null,'nvarchar',0,-9,null)

    /* Local NText */

    insert into spt_datatype_info values

    (0,null,null,'ntext',-10,2147483646,null,null,2147483646,'N''','''',null,1,@ncase,1,null,0,null,'ntext',0,-10,null)

    if (charindex('8.00', @@version) > 0)

    begin

    -- /* Local BIGINT */

    insert into spt_datatype_info values

    (127,8,null,'bigint',-5,19,0,10,null,null,null,null,1,0,2,0,0,0,'bigint',null,-5,null)

    -- /* Identity BIGINT */

    insert into spt_datatype_info values

    (127,8,null,'bigint identity',-5,19,0,10,null,null,null,null,0,0,2,0,0,1,'bigint identity',null,-5,null)

    -- /* sql_variant */

    insert into spt_datatype_info values

    (

    98, --ss_dtype

    null, --fixlen

    null, --ODBCVer

    'sql_variant', --TYPE_NAME

    -150, --SQL DATA TYPE

    8000, --data_precision

    0, --numeric_scale

    10, --RADIX

    8000, --length

    null, --PREFIX

    null, --SUFFIX

    null, --Create Params

    1, --Nullable

    0, --Case sensitive

    2, --Searchable

    null, --UNSIGNED_ATTRIBUTE

    0, --MONEY

    null, --AUTO_INCREMENT

    'sql_variant', --LOCAL TYPE NAME

    0, --CHARBIN

    -150, --SQL_DATA_TYPE

    null --SQL_DATETIME_SUB

    )

    end

    update spt_datatype_info set NULLABLE = 1

    where TYPE_NAME = 'bit'

    update spt_datatype_info set ss_dtype = isnull((select distinct xtype from systypes

    where TYPE_NAME like name+'%'),0)

    end

    go

    create unique clustered index datatypeinfoclust on spt_datatype_info(ss_dtype,fixlen,ODBCVer,AUTO_INCREMENT)

    go

    dump tran master with no_log

    go

    print 'creating table spt_server_info'

    go

    create table spt_server_info (

    attribute_id int NOT NULL,

    attribute_name varchar(60) NOT NULL,

    attribute_value varchar(255) NOT NULL)

    go

    create unique clustered index serverinfoclust on spt_server_info(attribute_id)

    go

    if (charindex('7.00', @@version) = 0 and charindex('8.00', @@version) = 0)

    begin

    drop procedure sp_add_server_sortinfo /* not used by other servers */

    drop procedure sp_add_server_sortinfo75 /* not used by older servers */

    dump tran master with no_log

    end

    go

    insert into spt_server_info

    values (1,'DBMS_NAME','Microsoft SQL Server')

    insert into spt_server_info

    values (2,'DBMS_VER',@@version)

    insert into spt_server_info

    values (10,'OWNER_TERM','owner')

    insert into spt_server_info

    values (11,'TABLE_TERM','table')

    insert into spt_server_info

    values (12,'MAX_OWNER_NAME_LENGTH','30')

    insert into spt_server_info

    values (13,'TABLE_LENGTH','30')

    insert into spt_server_info

    values (14,'MAX_QUAL_LENGTH','30')

    insert into spt_server_info

    values (15,'COLUMN_LENGTH','30')

    if 'A' = 'a' /* If not case sensitive server */

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','MIXED')

    end

    else

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','SENSITIVE')

    end

    insert into spt_server_info

    values (17,'TX_ISOLATION','2')

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin /* Add 6.0 collation sequence */

    insert into spt_server_info

    select 18,'COLLATION_SEQ',

    'charset='+t2.name+' sort_order='+t1.name

    +' charset_num='+rtrim(convert(char(4),t1.csid))+

    ' sort_order_num='+rtrim(convert(char(4),t1.id))

    from syscharsets t1, syscharsets t2, sysconfigures t3

    where t1.csid=t2.id and t1.id=t3.value and t3.config=1123

    end

    else

    begin /* Add 4.2x collation sequence */

    insert into spt_server_info

    select 18,'COLLATION_SEQ',

    'charset='+t2.name+' sort_order='+t1.name

    +' charset_num='+rtrim(convert(char(4),t1.csid))+

    ' sort_order_num='+rtrim(convert(char(4),t1.id))

    from syscharsets t1, syscharsets t2, sysconfigures t3

    where t1.csid=t2.id and t1.id=t3.value and t3.config=123

    end

    insert into spt_server_info

    values (19,'SAVEPOINT_SUPPORT','Y')

    insert into spt_server_info

    values (20,'MULTI_RESULT_SETS','Y')

    insert into spt_server_info

    values (22,'ACCESSIBLE_TABLES','Y')

    insert into spt_server_info

    values (100,'USERID_LENGTH','30')

    insert into spt_server_info

    values (101,'QUALIFIER_TERM','database')

    insert into spt_server_info

    values (102,'NAMED_TRANSACTIONS','Y')

    insert into spt_server_info

    values (103,'SPROC_AS_LANGUAGE','Y')

    insert into spt_server_info

    values (104,'ACCESSIBLE_SPROC','Y')

    insert into spt_server_info

    values (105,'MAX_INDEX_COLS','16')

    insert into spt_server_info

    values (106,'RENAME_TABLE','Y')

    insert into spt_server_info

    values (107,'RENAME_COLUMN','Y')

    if (charindex('8.00', @@version) > 0)

    begin

    /* Columns may be dropped on 8.0 or later */

    insert into spt_server_info

    values (108,'DROP_COLUMN','Y')

    end

    else

    begin

    insert into spt_server_info

    values (108,'DROP_COLUMN','N')

    end

    if (charindex('8.00', @@version) > 0)

    begin

    /* Columns size may be changed on 8.0 or later */

    insert into spt_server_info

    values (109,'INCREASE_COLUMN_LENGTH','Y')

    end

    else

    begin

    insert into spt_server_info

    values (109,'INCREASE_COLUMN_LENGTH','N')

    end

    if (charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    insert into spt_server_info

    values (110,'DDL_IN_TRANSACTION','N')

    end

    else

    begin

    insert into spt_server_info

    values (110,'DDL_IN_TRANSACTION','Y')

    end

    if (charindex('8.00', @@version) > 0)

    begin

    /* Descending indexes allowed on 8.0 or later */

    insert into spt_server_info

    values (111,'DESCENDING_INDEXES','Y')

    end

    else

    begin

    insert into spt_server_info

    values (111,'DESCENDING_INDEXES','N')

    end

    insert into spt_server_info

    values (112,'SP_RENAME','Y')

    insert into spt_server_info

    values (113,'REMOTE_SPROC','Y')

    insert into spt_server_info

    values (500,'SYS_SPROC_VERSION',convert(varchar(9), serverproperty ('ProductVersion')))

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Update values for 8.0 server */

    update spt_server_info set attribute_value = '128'

    where attribute_id in (12,13,14,15,100)

    end

    go

    grant select on spt_server_info to public

    go

    print 'creating sp_column_privileges'

    go

    /* Procedure for pre 6.50 server */

    CREATE PROCEDURE sp_column_privileges (

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null,

    @column_name varchar(96) = null) /* 3*32 */

    as

    set nocount on

    declare @table_id int

    DECLARE @full_table_name varchar(65) /* 2*32 + 1 */

    declare @low smallint /* range of userids to check */

    declare @high smallint

    declare @owner_uid smallint

    select @low = 0, @high = 32767

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    select @table_id = object_id(@full_table_name)

    if (@@trancount <> 0)

    begin /* If inside a transaction */

    raiserror 20003 '~~Rush_6~~'

    return

    end

    /*

    ** We need to create a table which will contain a row for every row to

    ** be returned to the client.

    */

    create table #column_priv1(

    COLUMN_NAME varchar(32) NOT NULL,

    grantor smallint NOT NULL,

    grantee smallint NOT NULL,

    select_privilege bit,

    select_grantable bit,

    insert_privilege bit,

    insert_grantable bit,

    update_privilege bit,

    update_grantable bit,

    references_privilege bit,

    references_grantable bit,

    uid smallint NOT NULL,

    gid smallint NOT NULL)

    /*

    ** insert a row for the table owner (who has all permissions)

    */

    select @owner_uid = (

    select uid

    from sysobjects

    where id = @table_id)

    if (charindex('6.00', @@version) > 0)

    begin

    insert into #column_priv1

    select

    c.name,

    u.uid,

    @owner_uid,

    0,

    1,

    0,

    1,

    0,

    1,

    0,

    1,

    @owner_uid,

    0

    from syscolumns c, sysusers u

    where id = @table_id

    and c.number = 0

    and u.uid = 1 /* grantor is dbo of database */

    end

    else

    begin

    insert into #column_priv1

    select

    c.name,

    u.uid,

    @owner_uid,

    0,

    1,

    0,

    1,

    0,

    1,

    0,

    0,

    @owner_uid,

    0

    from syscolumns c, sysusers u

    where id = @table_id

    and c.number = 0

    and u.uid = 1 /* grantor is dbo of database */

    end

    /*

    ** now stick in a row for every column for every user in the database

    ** we will need to weed out those who have no permissions later

    ** (and yes this is a cartesion product: the uid field in sysprotects

    ** can also have a group id, in which case we need to extend those

    ** privileges to all group members).

    */

    insert into #column_priv1

    select distinct

    c.name,

    o.uid,

    u.uid,

    0,

    0,

    0,

    0,

    0,

    0,

    0,

    0,

    u.uid,

    u.gid

    from sysusers u, syscolumns c, sysobjects o

    where o.id = @table_id

    and c.id = o.id

    and c.number = 0

    and u.gid <> u.uid

    and u.uid <> @owner_uid

    /*

    ** we need to create another temporary table to contain all the various

    ** protection information for the table in question

    */

    create table #protects (

    uid smallint NOT NULL,

    grantor smallint NOT NULL,

    action tinyint NOT NULL,

    protecttype tinyint NOT NULL,

    name varchar(32) NOT NULL)

    insert into #protects

    select

    p.uid,

    p.uid,

    p.action,

    p.protecttype,

    isnull(col_name(id, c.number), '~All')

    from

    sysprotects p,

    master.dbo.spt_values c,

    master.dbo.spt_values a,

    master.dbo.spt_values b

    where

    convert(tinyint, substring(isnull(p.columns, 0x1), c.low, 1))

    & c.high <> 0

    and c.number <= (

    select count(*)

    from syscolumns

    where id = @table_id)

    and c.type = 'P'

    and a.type = 'T'

    and a.number = p.action

    and p.action in (193,195,197,26)

    and b.type = 'T'

    and b.number = p.protecttype

    and p.id = @table_id

    and p.uid between @low and @high

    update #column_priv1

    set select_privilege = 1

    from #protects p

    where

    p.protecttype = 205

    and p.action = 193

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 193

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and ( uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set insert_privilege = 1

    from #protects p

    where

    p.protecttype = 205

    and p.action = 195

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 195

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set update_privilege = 1

    from #protects p

    where

    p.protecttype = 205

    and p.action = 197

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where protecttype = 206

    and action = 197

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set references_privilege = 1

    from #protects p

    where

    p.protecttype = 205

    and p.action = 26

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where protecttype = 206

    and action = 26

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set select_grantable = 1

    from #protects p

    where

    p.protecttype = 204

    and p.action = 193

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 193

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and ( uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set insert_grantable = 1

    from #protects p

    where

    p.protecttype = 204

    and p.action = 195

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 195

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and ( uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set update_grantable = 1

    from #protects p

    where

    p.protecttype = 204

    and p.action = 197

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 197

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and ( uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    update #column_priv1

    set references_grantable = 1

    from #protects p

    where

    p.protecttype = 204

    and p.action = 26

    and (p.name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and (p.uid = 0

    or p.uid = #column_priv1.gid

    or p.uid = #column_priv1.uid)

    and not exists (

    select * from #protects

    where

    protecttype = 206

    and action = 26

    and (name = #column_priv1.COLUMN_NAME

    or name = '~All')

    and ( uid = 0

    or uid = #column_priv1.gid

    or uid = #column_priv1.uid))

    create table #column_priv2(

    COLUMN_NAME varchar(32) NOT NULL,

    grantor smallint NULL,

    grantee smallint NOT NULL,

    PRIVILEGE varchar(32) NOT NULL,

    IS_GRANTABLE varchar(3) NULL)

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'SELECT',

    'NO'

    from #column_priv1

    where select_privilege = 1 and select_grantable = 0

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'INSERT',

    'NO'

    from #column_priv1

    where insert_privilege = 1 and insert_grantable = 0

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'UPDATE',

    'NO'

    from #column_priv1

    where update_privilege = 1 and update_grantable = 0

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'REFERENCES',

    'NO'

    from #column_priv1

    where references_privilege = 1 and references_grantable = 0

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'SELECT',

    'YES'

    from #column_priv1

    where select_grantable = 1

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'INSERT',

    'YES'

    from #column_priv1

    where insert_grantable = 1

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'UPDATE',

    'YES'

    from #column_priv1

    where update_grantable = 1

    insert into #column_priv2

    select

    COLUMN_NAME,

    grantor,

    grantee,

    'REFERENCES',

    'YES'

    from #column_priv1

    where references_grantable = 1

    select

    convert(varchar(32),db_name()) TABLE_QUALIFIER,

    convert(varchar(32),user_name(@owner_uid)) TABLE_OWNER,

    @table_name TABLE_NAME,

    COLUMN_NAME,

    convert(varchar(32),user_name(grantor)) GRANTOR,

    convert(varchar(32),user_name(grantee)) GRANTEE,

    PRIVILEGE,

    IS_GRANTABLE

    from #column_priv2

    where COLUMN_NAME like @column_name

    order by 4, 7

    go

    if (charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.50 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_column_privileges

    go

    /* Procedure for 6.50 server */

    CREATE PROCEDURE sp_column_privileges (

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null,

    @column_name varchar(96) = null) /* 3*32 */

    as

    declare @table_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    select @table_id = object_id(@table_name)

    end

    else

    begin /* Qualified table name */

    select @table_id = object_id(@table_owner + '.' + @table_name)

    end

    select

    convert(varchar(32),db_name()) TABLE_QUALIFIER,

    convert(varchar(32),user_name(o.uid)) TABLE_OWNER,

    @table_name TABLE_NAME,

    convert(varchar(32),c.name) COLUMN_NAME,

    convert(varchar(32),user_name(p.grantor)) GRANTOR,

    convert(varchar(32),user_name(u.uid)) GRANTEE,

    convert (varchar(32),case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert (varchar(3),case when p.protecttype = 205 then 'NO'

    else 'YES'

    end) IS_GRANTABLE

    from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c

    where

    c.id = @table_id

    and c.name like @column_name

    and c.id = p.id

    and c.id = o.id

    and case substring(p.columns, 1, 1) & 1

    when NULL then 255 /* all columns have permission */

    when 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))

    end

    & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns

    where id = @table_id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or

    (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case substring(p1.columns, 1, 1) & 1

    when NULL then 255 /* all columns have permission */

    when 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))

    end

    & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    convert(varchar(32),db_name()) TABLE_QUALIFIER,

    convert(varchar(32),user_name(o.uid)) TABLE_OWNER,

    @table_name TABLE_NAME,

    convert(varchar(32),col_name(@table_id, c.colid)) COLUMN_NAME,

    convert(varchar(32),user_name(u.uid)) grantor,

    convert(varchar(32),user_name(o.uid)) grantee,

    convert (varchar(32),case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),'YES') IS_GRANTABLE

    from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    c.id = @table_id

    and c.name like @column_name

    and c.id = o.id

    and u.uid = 1 /* grantor is dbo of database */

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 7

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_column_privileges

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_column_privileges (

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null,

    @column_name nvarchar(384) = null) /* 3*128 */

    as

    declare @table_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    select @table_id = object_id(quotename(@table_name))

    end

    else

    begin /* Qualified table name */

    if @table_owner = N''

    begin /* If empty owner name */

    select @table_id = 0

    end

    else

    begin

    select @table_id = object_id(quotename(@table_owner) +

    '.' + quotename(@table_name))

    end

    end

    select

    convert(sysname,db_name()) TABLE_QUALIFIER,

    convert(sysname,user_name(o.uid)) TABLE_OWNER,

    @table_name TABLE_NAME,

    convert(sysname,c.name) COLUMN_NAME,

    convert(sysname,user_name(p.grantor)) GRANTOR,

    convert(sysname,user_name(u.uid)) GRANTEE,

    convert (varchar(32),case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert (varchar(3),case when p.protecttype = 205 then 'NO'

    else 'YES'

    end) IS_GRANTABLE

    from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m

    where

    c.id = @table_id

    and c.name like @column_name

    and c.id = p.id

    and c.id = o.id

    and case substring(p.columns, 1, 1) & 1

    when NULL then 255 /* all columns have permission */

    when 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))

    end

    & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns

    where id = @table_id) /* ranges from 1 to # of columns in table */

    and v.type = N'P'

    and v.number = c.colid

    /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or

    (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case substring(p1.columns, 1, 1) & 1

    when NULL then 255 /* all columns have permission */

    when 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))

    end

    & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    convert(sysname,db_name()) TABLE_QUALIFIER,

    convert(sysname,user_name(o.uid)) TABLE_OWNER,

    @table_name TABLE_NAME,

    convert(sysname,col_name(@table_id, c.colid)) COLUMN_NAME,

    convert(sysname,user_name(u.uid)) grantor,

    convert(sysname,user_name(o.uid)) grantee,

    convert (varchar(32),case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),'YES') IS_GRANTABLE

    from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    c.id = @table_id

    and c.name like @column_name

    and c.id = o.id

    and u.uid = 1 /* grantor is 'dbo' of database */

    and v.type = N'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 7

    go

    grant execute on sp_column_privileges to public

    go

    dump tran master with no_log

    go

    print 'creating sp_columns'

    go

    /* Procedure for pre-6.0 server */

    CREATE PROCEDURE sp_columns (

    @table_name varchar(96),

    @table_owner varchar(96) = null,

    @table_qualifier varchar(32) = null,

    @column_name varchar(96) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @full_table_name varchar(193)

    DECLARE @table_id int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    if @table_name is null

    begin /* If table name not supplied, match all */

    select @table_name = '%'

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if ((charindex('%',@full_table_name) = 0) and

    (charindex('_',@full_table_name) = 0) and

    @table_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the table name */

    SELECT

    TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),

    TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    TABLE_NAME = convert(varchar(32),o.name),

    COLUMN_NAME = convert(varchar(32),c.name),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    "PRECISION" = isnull(d.data_precision, convert(int,c.length)),

    LENGTH = isnull(d.length, convert(int,c.length)),

    SCALE = d.numeric_scale,

    d.RADIX,

    NULLABLE = /* set nullability from status flag */

    convert(smallint, convert(bit, c.status&8)),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    syscomments m,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @table_id

    AND c.id = o.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND o.type <> 'P'

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.cdefault *= m.id

    AND m.colid = 1

    ORDER BY 17

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the table name */

    if @table_owner is null /* If owner not supplied, match all */

    select @table_owner = '%'

    SELECT

    TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),

    TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    TABLE_NAME = convert(varchar(32),o.name),

    COLUMN_NAME = convert(varchar(32),c.name),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    "PRECISION" = isnull(d.data_precision, convert(int,c.length)),

    LENGTH = isnull(d.length, convert(int,c.length)),

    SCALE = d.numeric_scale,

    d.RADIX,

    NULLABLE = /* set nullability from status flag */

    convert(smallint, convert(bit, c.status&8)),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    syscomments m,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @table_name

    AND user_name(o.uid) like @table_owner

    AND o.id = c.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND o.type <> 'P'

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.cdefault *= m.id

    AND m.colid = 1

    ORDER BY 2, 3, 17

    end

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following error.'

    end

    else

    drop proc sp_columns

    go

    /* Procedure for 6.0 and 6.50 server */

    CREATE PROCEDURE sp_columns (

    @table_name varchar(96),

    @table_owner varchar(96) = null,

    @table_qualifier varchar(32) = null,

    @column_name varchar(96) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @full_table_name varchar(193)

    DECLARE @table_id int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_name is null

    begin

    /* If table name not supplied, match all */

    select @table_name = '%'

    end

    if @table_owner is null

    begin

    /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin

    /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if ((charindex('%',@full_table_name) = 0) and

    (charindex('[',@full_table_name) = 0) and

    (charindex('_',@full_table_name) = 0) and

    @table_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the table name */

    SELECT

    TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),

    TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    TABLE_NAME = convert(varchar(32),o.name),

    COLUMN_NAME = convert(varchar(32),c.name),

    DATA_TYPE = d.DATA_TYPE,

    TYPE_NAME = convert(varchar(32),

    case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end),

    "PRECISION" = convert(int,

    case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else isnull(convert(int,c.prec), 2147483647)

    end),

    LENGTH = convert(int,

    case

    when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */

    c.prec+2

    else

    isnull(d.length, c.length)

    end),

    SCALE = convert(smallint, c.scale),

    RADIX = d.RADIX,

    NULLABLE = /* set nullability from status flag */

    convert(smallint, convert(bit, c.status&8)),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    SQL_DATA_TYPE = d.SQL_DATA_TYPE,

    SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    syscomments m,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @table_id

    AND c.id = o.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND o.type <> 'P'

    AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.cdefault *= m.id

    AND m.colid = 1

    ORDER BY 17

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the table name */

    if @table_owner is null /* If owner not supplied, match all */

    select @table_owner = '%'

    SELECT

    TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),

    TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    TABLE_NAME = convert(varchar(32),o.name),

    COLUMN_NAME = convert(varchar(32),c.name),

    DATA_TYPE = d.DATA_TYPE,

    TYPE_NAME = convert(varchar(32),

    case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end),

    "PRECISION" = convert(int,

    case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else isnull(convert(int,c.prec), 2147483647)

    end),

    LENGTH = convert(int,

    case

    when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */

    c.prec+2

    else

    isnull(d.length, c.length)

    end),

    SCALE = convert(smallint, c.scale),

    RADIX = d.RADIX,

    NULLABLE = /* set nullability from status flag */

    convert(smallint, convert(bit, c.status&8)),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    SQL_DATA_TYPE = d.SQL_DATA_TYPE,

    SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647) + d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    syscomments m,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @table_name

    AND user_name(o.uid) like @table_owner

    AND o.id = c.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND o.type <> 'P'

    AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.cdefault *= m.id

    AND m.colid = 1

    ORDER BY 2, 3, 17

    end

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_columns

    go

    /* Procedure for 7.0 server */

    CREATE PROCEDURE sp_columns (

    @table_name nvarchar(384),

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null,

    @column_name nvarchar(384) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @full_table_name nvarchar(769)

    DECLARE @table_id int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_name is null

    begin /* If table name not supplied, match all */

    select @table_name = '%'

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if ((isnull(charindex('%', @full_table_name),0) = 0) and

    (isnull(charindex('[', @table_name),0) = 0) and

    (isnull(charindex('[', @table_owner),0) = 0) and

    (isnull(charindex('_', @full_table_name),0) = 0) and

    @table_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the table name */

    SELECT

    TABLE_QUALIFIER = convert(sysname,DB_NAME()),

    TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    d.DATA_TYPE,

    convert (sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),

    substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),

    SS_DATA_TYPE = c.type

    FROM

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c

    LEFT OUTER JOIN syscomments m on c.cdefault = m.id

    AND m.colid = 1

    WHERE

    o.id = @table_id

    AND c.id = o.id

    AND t.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    ORDER BY 17

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the table name */

    if @table_owner is null /* If owner not supplied, match all */

    select @table_owner = '%'

    SELECT

    TABLE_QUALIFIER = convert(sysname,DB_NAME()),

    TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    d.DATA_TYPE,

    convert (sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),

    rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c

    LEFT OUTER JOIN syscomments m on c.cdefault = m.id

    AND m.colid = 1

    WHERE

    o.name like @table_name

    AND user_name(o.uid) like @table_owner

    AND o.id = c.id

    AND t.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    ORDER BY 2, 3, 17

    end

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_columns

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_columns (

    @table_name nvarchar(384),

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null,

    @column_name nvarchar(384) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @full_table_name nvarchar(769)

    DECLARE @table_id int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_name is null

    begin /* If table name not supplied, match all */

    select @table_name = '%'

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if ((isnull(charindex('%', @full_table_name),0) = 0) and

    (isnull(charindex('[', @table_name),0) = 0) and

    (isnull(charindex('[', @table_owner),0) = 0) and

    (isnull(charindex('_', @full_table_name),0) = 0) and

    @table_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the table name */

    SELECT

    TABLE_QUALIFIER = convert(sysname,DB_NAME()),

    TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    d.DATA_TYPE,

    convert (sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME collate database_default

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),

    substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),

    SS_DATA_TYPE = c.type

    FROM

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c

    LEFT OUTER JOIN syscomments m on c.cdefault = m.id

    AND m.colid = 1

    WHERE

    o.id = @table_id

    AND c.id = o.id

    AND t.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    ORDER BY 17

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the table name */

    if @table_owner is null /* If owner not supplied, match all */

    select @table_owner = '%'

    SELECT

    TABLE_QUALIFIER = convert(sysname,DB_NAME()),

    TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    d.DATA_TYPE,

    convert (sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME collate database_default

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = text,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    IS_NULLABLE = convert(varchar(254),

    rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c

    LEFT OUTER JOIN syscomments m on c.cdefault = m.id

    AND m.colid = 1

    WHERE

    o.name like @table_name

    AND user_name(o.uid) like @table_owner

    AND o.id = c.id

    AND t.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    ORDER BY 2, 3, 17

    end

    go

    grant execute on sp_columns to public

    go

    dump tran master with no_log

    go

    print 'creating sp_databases'

    go

    /* Procedure for pre-7.0 server */

    create proc sp_databases

    as

    set nocount on

    /* Use temporary table to sum up database size w/o using group by */

    create table #databases (

    DATABASE_NAME varchar(32) NOT NULL,

    size int NOT NULL)

    /* Insert row for each database */

    insert into #databases

    select

    name,

    (select sum(size) from master.dbo.sysusages

    where dbid = d.dbid)

    from master.dbo.sysdatabases d

    select

    DATABASE_NAME,

    DATABASE_SIZE = size*2, /* Convert from 2048 byte pages to K */

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from #databases

    order by 1

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_databases

    go

    /* Procedure for 8.0 server */

    create proc sp_databases

    as

    set nocount on

    declare @name sysname

    declare @sql nvarchar(600)

    /* Use temporary table to sum up database size w/o using group by */

    create table #databases (

    DATABASE_NAME sysname NOT NULL,

    size int NOT NULL)

    declare c1 cursor for

    select name from master.dbo.sysdatabases

    where has_dbaccess(name) = 1 -- Only look at databases to which we have access

    open c1

    fetch c1 into @name

    while @@fetch_status >= 0

    begin

    select @sql = 'insert into #databases

    select N'''+ @name + ''', sum(size) from '

    + QuoteName(@name) + '.dbo.sysfiles'

    /* Insert row for each database */

    execute (@SQL)

    fetch c1 into @name

    end

    deallocate c1

    select

    DATABASE_NAME,

    DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from #databases

    order by 1

    go

    grant execute on sp_databases to public

    go

    dump tran master with no_log

    go

    print 'creating sp_datatype_info'

    go

    /* Procedure for pre-6.0 server */

    create proc sp_datatype_info

    (@data_type int = 0, @ODBCVer tinyint = 2)

    as

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @data_type = 0

    select

    TYPE_NAME = t.name,

    d.DATA_TYPE,

    "PRECISION" = isnull(d.data_precision, convert(int,t.length)),

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    d.NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    LOCAL_TYPE_NAME = t.name,

    MINIMUM_SCALE = d.numeric_scale,

    MAXIMUM_SCALE = d.numeric_scale,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t

    where

    d.ss_dtype = t.type

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and t.usertype *= e.user_type

    and (t.type not in (111,109,38,110) or /* get rid of nullable types */

    t.usertype > 100)

    order by 2, 12, 11, t.usertype

    else

    select

    TYPE_NAME = t.name,

    d.DATA_TYPE,

    "PRECISION" = isnull(d.data_precision, convert(int,t.length)),

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    d.NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    LOCAL_TYPE_NAME = t.name,

    MINIMUM_SCALE = d.numeric_scale,

    MAXIMUM_SCALE = d.numeric_scale,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t

    where

    DATA_TYPE = @data_type

    and d.ss_dtype = t.type

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and t.usertype *= e.user_type

    and (t.type not in (111,109,38,110) or /* get rid of nullable types */

    t.usertype > 100)

    order by 12, 11, t.usertype

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_datatype_info

    go

    /* Procedure for 6.0 and 6.50 servers */

    create proc sp_datatype_info

    (@data_type int = 0, @ODBCVer tinyint = 2)

    as

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @data_type = 0

    select

    convert(varchar(32),case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    d.DATA_TYPE,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    when d.ss_dtype in (35,34) then 2147483647 /* TEXT/IMAGE */

    when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */

    else t.prec

    end) "PRECISION",

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    convert(smallint,case

    when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/

    else t.allownulls

    end) NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    convert(varchar(32),case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end) LOCAL_TYPE_NAME,

    convert(smallint,case

    when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale

    else d.numeric_scale

    end) MINIMUM_SCALE,

    convert(smallint,case

    when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */

    when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/

    else t.scale

    end) MAXIMUM_SCALE,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t

    where

    d.ss_dtype = t.type

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and t.usertype *= e.user_type

    and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT

    and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */

    t.usertype > 100)

    and (t.usertype <= 100 or

    isnull(d.AUTO_INCREMENT,0) = 0)

    order by 2, 12, 11, t.usertype

    else

    select

    convert(varchar(32),case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    d.DATA_TYPE,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    when d.ss_dtype in (35,34) then 2147483647 /* TEXT/IMAGE */

    when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */

    else t.prec

    end) "PRECISION",

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    convert(smallint,case

    when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/

    else t.allownulls

    end) NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    convert(varchar(32),case

    when t.usertype > 100 or t.usertype in (18,80) then t.name

    else d.TYPE_NAME

    end) LOCAL_TYPE_NAME,

    convert(smallint,case

    when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale

    else d.numeric_scale

    end) MINIMUM_SCALE,

    convert(smallint,case

    when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */

    when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/

    else t.scale

    end) MAXIMUM_SCALE,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t

    where

    d.DATA_TYPE = @data_type

    and d.ss_dtype = t.type

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and t.usertype *= e.user_type

    and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT

    and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */

    t.usertype > 100)

    and (t.usertype <= 100 or

    isnull(d.AUTO_INCREMENT,0) = 0)

    order by 12, 11, t.usertype

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_datatype_info

    go

    /* Procedure for 7.0 server */

    create proc sp_datatype_info

    (@data_type int = 0, @ODBCVer tinyint = 2)

    as

    declare @mintype int

    declare @maxtype int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @data_type = 0

    begin

    select @mintype = -32768

    select @maxtype = 32767

    end

    else

    begin

    select @mintype = @data_type

    select @maxtype = @data_type

    end

    select

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    d.DATA_TYPE,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    when type_name(d.ss_dtype) IN ('numeric','decimal') and

    t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */

    else OdbcPrec(t.xtype, t.length, t.xprec)

    end) "PRECISION",

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    convert(smallint,case

    when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/

    else TypeProperty (t.name, 'AllowsNull')

    end) NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.LOCAL_TYPE_NAME

    end) LOCAL_TYPE_NAME,

    MINIMUM_SCALE = d.numeric_scale,

    convert(smallint,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */

    when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/

    else TypeProperty (t.name, 'Scale')

    end) MAXIMUM_SCALE,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d

    INNER JOIN systypes t on d.ss_dtype = t.xtype

    LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on

    t.xusertype = e.user_type

    and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT

    where

    d.DATA_TYPE between @mintype and @maxtype

    and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and (t.xusertype <= 255 or

    isnull(d.AUTO_INCREMENT,0) = 0)

    order by 2, 12, 11,

    case

    when t.usertype=18 then 255

    else t.usertype

    end

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_datatype_info

    go

    /* Procedure for 8.0 server */

    create proc sp_datatype_info

    (@data_type int = 0, @ODBCVer tinyint = 2)

    as

    declare @mintype int

    declare @maxtype int

    if @ODBCVer <> 3

    select @ODBCVer = 2

    if @data_type = 0

    begin

    select @mintype = -32768

    select @maxtype = 32767

    end

    else

    begin

    select @mintype = @data_type

    select @maxtype = @data_type

    end

    select

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME collate database_default

    end) TYPE_NAME,

    d.DATA_TYPE,

    convert(int,case

    when d.DATA_TYPE in (6,7,-150) then d.data_precision /* FLOAT/REAL/sql_variant*/

    when d.ss_dtype in (55,63,106,108) and

    t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */

    else OdbcPrec(t.xtype, t.length, t.xprec)

    end) "PRECISION",

    d.LITERAL_PREFIX,

    d.LITERAL_SUFFIX,

    e.CREATE_PARAMS,

    convert(smallint,case

    when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/

    else TypeProperty (t.name, 'AllowsNull')

    end) NULLABLE,

    d.CASE_SENSITIVE,

    d.SEARCHABLE,

    d.UNSIGNED_ATTRIBUTE,

    d.MONEY,

    d.AUTO_INCREMENT,

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.LOCAL_TYPE_NAME collate database_default

    end) LOCAL_TYPE_NAME,

    convert(smallint,case

    when d.ss_dtype in (55,63,106,108) and t.xusertype > 255 then TypeProperty (t.name, 'Scale')

    else d.numeric_scale

    end) MINIMUM_SCALE,

    convert(smallint,case

    when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */

    when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/

    else TypeProperty (t.name, 'Scale')

    end) MAXIMUM_SCALE,

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    NUM_PREC_RADIX = convert(int,d.RADIX),

    INTERVAL_PRECISION = convert(smallint,NULL),

    USERTYPE = t.usertype

    from master.dbo.spt_datatype_info d

    INNER JOIN systypes t on d.ss_dtype = t.xtype

    LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on

    t.xusertype = e.user_type

    and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT

    where

    d.DATA_TYPE between @mintype and @maxtype

    and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    and (t.xusertype <= 255 or

    isnull(d.AUTO_INCREMENT,0) = 0)

    order by 2, 12, 11,

    case

    when t.usertype=18 then 255

    else t.usertype

    end

    go

    grant execute on sp_datatype_info to public

    go

    dump tran master with no_log

    go

    print 'creating sp_fkeys'

    go

    /* Procedure for pre-6.0 server */

    CREATE PROCEDURE sp_fkeys(

    @pktable_name varchar(32) = null,

    @pktable_owner varchar(32) = null,

    @pktable_qualifier varchar(32) = null,

    @fktable_name varchar(32) = null,

    @fktable_owner varchar(32) = null,

    @fktable_qualifier varchar(32) = null )

    as

    set nocount on

    declare @order_by_pk int

    select @order_by_pk = 0

    if (@pktable_name is null) and (@fktable_name is null)

    begin /* If neither primary key nor foreign key table names given */

    raiserror 20004 '~~Rush_25~~'

    return

    end

    if @fktable_qualifier is not null

    begin

    if db_name() <> @fktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_26~~'

    return

    end

    end

    if @pktable_qualifier is not null

    begin

    if db_name() <> @pktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_27~~'

    return

    end

    end

    if @pktable_name is null

    begin /* If table name not supplied, match all */

    select @pktable_name = '%'

    select @order_by_pk = 1

    end

    if @pktable_owner is null /* If PK owner not supplied, match all */

    select @pktable_owner = '%'

    if @fktable_name is null /* If table name not supplied, match all */

    select @fktable_name = '%'

    if @fktable_owner is null /* If FK owner not supplied, match all */

    select @fktable_owner = '%'

    if @@trancount <> 0

    begin /* If inside a transaction */

    raiserror 20003 '~~Rush_28~~'

    return

    end

    create table #fkeys(

    PKTABLE_QUALIFIER varchar(32) NULL,

    PKTABLE_OWNER varchar(32) NULL,

    PKTABLE_NAME varchar(32) NOT NULL,

    PKCOLUMN_NAME varchar(32) NOT NULL,

    FKTABLE_QUALIFIER varchar(32) NULL,

    FKTABLE_OWNER varchar(32) NULL,

    FKTABLE_NAME varchar(32) NOT NULL,

    FKCOLUMN_NAME varchar(32) NOT NULL,

    KEY_SEQ smallint NOT NULL)

    /* SQL Server supports upto 8 PK/FK relationships between 2 tables */

    /* Process syskeys for each relationship */

    /* The inserts below adds a row to the temp table for each of the

    8 possible relationships */

    insert into #fkeys

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    1

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key1

    and c2.id = k.depid

    and c2.colid = k.depkey1

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    2

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key2

    and c2.id = k.depid

    and c2.colid = k.depkey2

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    3

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key3

    and c2.id = k.depid

    and c2.colid = k.depkey3

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    4

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key4

    and c2.id = k.depid

    and c2.colid = k.depkey4

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    5

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key5

    and c2.id = k.depid

    and c2.colid = k.depkey5

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    6

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key6

    and c2.id = k.depid

    and c2.colid = k.depkey6

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    7

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key7

    and c2.id = k.depid

    and c2.colid = k.depkey7

    and o1.id = k.depid

    and o2.id = k.id

    union all

    select

    db_name(),

    user_name(o1.uid),

    object_name(k.depid),

    c2.name,

    db_name(),

    user_name(o2.uid),

    object_name(k.id),

    c1.name,

    8

    from

    syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2

    where

    c1.id = k.id

    and k.type = 2 /* Foreign type key */

    and c1.colid = k.key8

    and c2.id = k.depid

    and c2.colid = k.depkey8

    and o1.id = k.depid

    and o2.id = k.id

    if @order_by_pk = 1 /* If order by PK fields */

    select

    PKTABLE_QUALIFIER,

    PKTABLE_OWNER,

    PKTABLE_NAME,

    PKCOLUMN_NAME,

    FKTABLE_QUALIFIER,

    FKTABLE_OWNER,

    FKTABLE_NAME,

    FKCOLUMN_NAME,

    KEY_SEQ,

    UPDATE_RULE = convert(smallint, null),

    DELETE_RULE = convert(smallint,null),

    FK_NAME = convert(varchar(32),null),

    PK_NAME = convert(varchar(32),null),

    DEFERRABILITY = convert(smallint,7)

    from #fkeys

    where FKTABLE_NAME like @fktable_name

    and FKTABLE_OWNER like @fktable_owner

    and PKTABLE_NAME like @pktable_name

    and PKTABLE_OWNER like @pktable_owner

    order by 1, 2, 3, 9, 4

    else /* Order by FK fields */

    select

    PKTABLE_QUALIFIER,

    PKTABLE_OWNER,

    PKTABLE_NAME,

    PKCOLUMN_NAME,

    FKTABLE_QUALIFIER,

    FKTABLE_OWNER,

    FKTABLE_NAME,

    FKCOLUMN_NAME,

    KEY_SEQ,

    UPDATE_RULE = convert(smallint,null),

    DELETE_RULE = convert(smallint,null),

    FK_NAME = convert(varchar(32),null),

    PK_NAME = convert(varchar(32),null),

    DEFERRABILITY = convert(smallint,7)

    from #fkeys

    where FKTABLE_NAME like @fktable_name

    and FKTABLE_OWNER like @fktable_owner

    and PKTABLE_NAME like @pktable_name

    and PKTABLE_OWNER like @pktable_owner

    order by 5, 6, 7, 9, 8

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_fkeys

    go

    /* Procedure for 6.0 and 6.50 servers */

    CREATE PROCEDURE sp_fkeys(

    @pktable_name varchar(32) = null,

    @pktable_owner varchar(32) = null,

    @pktable_qualifier varchar(32) = null,

    @fktable_name varchar(32) = null,

    @fktable_owner varchar(32) = null,

    @fktable_qualifier varchar(32) = null )

    as

    set nocount on

    DECLARE @pktable_id int

    DECLARE @pkfull_table_name varchar(65) /* 2*32 +1 */

    DECLARE @fktable_id int

    DECLARE @fkfull_table_name varchar(65) /* 2*32 +1 */

    declare @order_by_pk int

    select @order_by_pk = 0

    if (@pktable_name is null) and (@fktable_name is null)

    begin /* If neither primary key nor foreign key table names given */

    raiserror (15252,-1,-1)

    return

    end

    if @fktable_qualifier is not null

    begin

    if db_name() <> @fktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_qualifier is not null

    begin

    if db_name() <> @pktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_owner is null

    begin /* If unqualified primary key table name */

    SELECT @pkfull_table_name = @pktable_name

    end

    else

    begin /* Qualified primary key table name */

    SELECT @pkfull_table_name = @pktable_owner + '.' + @pktable_name

    end

    /* Get Object ID */

    SELECT @pktable_id = object_id(@pkfull_table_name)

    if @fktable_owner is null

    begin /* If unqualified foreign key table name */

    SELECT @fkfull_table_name = @fktable_name

    end

    else

    begin /* Qualified foreign key table name */

    SELECT @fkfull_table_name = @fktable_owner + '.' + @fktable_name

    end

    /* Get Object ID */

    SELECT @fktable_id = object_id(@fkfull_table_name)

    if @fktable_name is not null

    begin

    if @fktable_id is null

    SELECT @fktable_id = 0 /* fk table not found, empty result */

    end

    if @pktable_name is null

    begin /* If table name not supplied, match all */

    select @order_by_pk = 1

    end

    else

    begin

    if @pktable_id is null

    begin

    SELECT @pktable_id = 0 /* pk table not found, empty result */

    end

    end

    if (@@trancount <> 0 and

    charindex('6.50', @@version) = 0)

    begin /* If inside a transaction */

    raiserror (15002,-1,-1,'sp_fkeys')

    return

    end

    create table #fkeys(

    pkdb_id int NOT NULL,

    pktable_id int NOT NULL,

    pkcolid int NOT NULL,

    fkdb_id int NOT NULL,

    fktable_id int NOT NULL,

    fkcolid int NOT NULL,

    KEY_SEQ smallint NOT NULL,

    fk_id int NOT NULL,

    pk_id int NOT NULL)

    /* SQL Server supports upto 16 PK/FK relationships between 2 tables */

    /* Process syskeys for each relationship */

    /* The inserts below adds a row to the temp table for each of the

    16 possible relationships */

    insert into #fkeys

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey1,

    r.fkeydbid,

    r.fkeyid,

    r.fkey1,

    1,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey2,

    r.fkeydbid,

    r.fkeyid,

    r.fkey2,

    2,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey3,

    r.fkeydbid,

    r.fkeyid,

    r.fkey3,

    3,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey4,

    r.fkeydbid,

    r.fkeyid,

    r.fkey4,

    4,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey5,

    r.fkeydbid,

    r.fkeyid,

    r.fkey5,

    5,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey6,

    r.fkeydbid,

    r.fkeyid,

    r.fkey6,

    6,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey7,

    r.fkeydbid,

    r.fkeyid,

    r.fkey7,

    7,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey8,

    r.fkeydbid,

    r.fkeyid,

    r.fkey8,

    8,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey9,

    r.fkeydbid,

    r.fkeyid,

    r.fkey9,

    9,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey10,

    r.fkeydbid,

    r.fkeyid,

    r.fkey10,

    10,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey11,

    r.fkeydbid,

    r.fkeyid,

    r.fkey11,

    11,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey12,

    r.fkeydbid,

    r.fkeyid,

    r.fkey12,

    12,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey13,

    r.fkeydbid,

    r.fkeyid,

    r.fkey13,

    13,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey14,

    r.fkeydbid,

    r.fkeyid,

    r.fkey14,

    14,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey15,

    r.fkeydbid,

    r.fkeyid,

    r.fkey15,

    15,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    union all

    select

    r.rkeydbid,

    r.rkeyid,

    r.rkey16,

    r.fkeydbid,

    r.fkeyid,

    r.fkey16,

    16,

    r.constid,

    s.constid

    from

    sysreferences r, sysconstraints s

    where r.rkeyid = s.id

    AND (s.status & 0xf) = 1

    AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)

    if @order_by_pk = 1 /* If order by PK fields */

    select

    PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),

    PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),

    PKTABLE_NAME = convert(varchar(32),o1.name),

    PKCOLUMN_NAME = convert(varchar(32),c1.name),

    FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),

    FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),

    FKTABLE_NAME = convert(varchar(32),o2.name),

    FKCOLUMN_NAME = convert(varchar(32),c2.name),

    KEY_SEQ,

    UPDATE_RULE = convert(smallint,1),

    DELETE_RULE = convert(smallint,1),

    FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),

    PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),

    DEFERRABILITY = convert(smallint,7)

    from #fkeys f,

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2

    where o1.id = f.pktable_id

    AND o2.id = f.fktable_id

    AND c1.id = f.pktable_id

    AND c2.id = f.fktable_id

    AND c1.colid = f.pkcolid

    AND c2.colid = f.fkcolid

    order by 1,2,3,9,4

    else /* Order by FK fields */

    select

    PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),

    PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),

    PKTABLE_NAME = convert(varchar(32),o1.name),

    PKCOLUMN_NAME = convert(varchar(32),c1.name),

    FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),

    FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),

    FKTABLE_NAME = convert(varchar(32),o2.name),

    FKCOLUMN_NAME = convert(varchar(32),c2.name),

    KEY_SEQ,

    UPDATE_RULE = convert(smallint,1),

    DELETE_RULE = convert(smallint,1),

    FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),

    PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),

    DEFERRABILITY = convert(smallint,7)

    from #fkeys f,

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2

    where o1.id = f.pktable_id

    AND o2.id = f.fktable_id

    AND c1.id = f.pktable_id

    AND c2.id = f.fktable_id

    AND c1.colid = f.pkcolid

    AND c2.colid = f.fkcolid

    order by 5,6,7,9,8

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_fkeys

    go

    /* Procedure for 7.0 server */

    CREATE PROCEDURE sp_fkeys(

    @pktable_name sysname = null,

    @pktable_owner sysname = null,

    @pktable_qualifier sysname = null,

    @fktable_name sysname = null,

    @fktable_owner sysname = null,

    @fktable_qualifier sysname = null )

    as

    set nocount on

    DECLARE @pktable_id int

    DECLARE @pkfull_table_name nvarchar(257) /* 2*128 + 1 */

    DECLARE @fktable_id int

    DECLARE @fkfull_table_name nvarchar(257) /* 2*128 + 1 */

    declare @order_by_pk int

    /* select 'XXX starting table creation' */

    create table #fkeysall(

    rkeyid int NOT NULL,

    rkey1 int NOT NULL,

    rkey2 int NOT NULL,

    rkey3 int NOT NULL,

    rkey4 int NOT NULL,

    rkey5 int NOT NULL,

    rkey6 int NOT NULL,

    rkey7 int NOT NULL,

    rkey8 int NOT NULL,

    rkey9 int NOT NULL,

    rkey10 int NOT NULL,

    rkey11 int NOT NULL,

    rkey12 int NOT NULL,

    rkey13 int NOT NULL,

    rkey14 int NOT NULL,

    rkey15 int NOT NULL,

    rkey16 int NOT NULL,

    fkeyid int NOT NULL,

    fkey1 int NOT NULL,

    fkey2 int NOT NULL,

    fkey3 int NOT NULL,

    fkey4 int NOT NULL,

    fkey5 int NOT NULL,

    fkey6 int NOT NULL,

    fkey7 int NOT NULL,

    fkey8 int NOT NULL,

    fkey9 int NOT NULL,

    fkey10 int NOT NULL,

    fkey11 int NOT NULL,

    fkey12 int NOT NULL,

    fkey13 int NOT NULL,

    fkey14 int NOT NULL,

    fkey15 int NOT NULL,

    fkey16 int NOT NULL,

    constid int NOT NULL,

    name sysname NOT NULL)

    create table #fkeys(

    pktable_id int NOT NULL,

    pkcolid int NOT NULL,

    fktable_id int NOT NULL,

    fkcolid int NOT NULL,

    KEY_SEQ smallint NOT NULL,

    fk_id int NOT NULL,

    PK_NAME sysname NOT NULL)

    create table #fkeysout(

    PKTABLE_QUALIFIER sysname NULL,

    PKTABLE_OWNER sysname NULL,

    PKTABLE_NAME sysname NOT NULL,

    PKCOLUMN_NAME sysname NOT NULL,

    FKTABLE_QUALIFIER sysname NULL,

    FKTABLE_OWNER sysname NULL,

    FKTABLE_NAME sysname NOT NULL,

    FKCOLUMN_NAME sysname NOT NULL,

    KEY_SEQ smallint NOT NULL,

    UPDATE_RULE smallint NULL,

    DELETE_RULE smallint NULL,

    FK_NAME sysname NULL,

    PK_NAME sysname NULL,

    DEFERRABILITY smallint null)

    /* select 'XXX starting parameter analysis' */

    select @order_by_pk = 0

    if (@pktable_name is null) and (@fktable_name is null)

    begin /* If neither primary key nor foreign key table names given */

    raiserror (15252,-1,-1)

    return

    end

    if @fktable_qualifier is not null

    begin

    if db_name() <> @fktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_qualifier is not null

    begin

    if db_name() <> @pktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_owner is null

    begin /* If unqualified primary key table name */

    SELECT @pkfull_table_name = quotename(@pktable_name)

    end

    else

    begin /* Qualified primary key table name */

    if @pktable_owner = ''

    begin /* If empty owner name */

    SELECT @pkfull_table_name = quotename(@pktable_owner)

    end

    else

    begin

    SELECT @pkfull_table_name = quotename(@pktable_owner) +

    '.' + quotename(@pktable_name)

    end

    end

    /* Get Object ID */

    SELECT @pktable_id = object_id(@pkfull_table_name)

    if @fktable_owner is null

    begin /* If unqualified foreign key table name */

    SELECT @fkfull_table_name = quotename(@fktable_name)

    end

    else

    begin /* Qualified foreign key table name */

    if @fktable_owner = ''

    begin /* If empty owner name */

    SELECT @fkfull_table_name = quotename(@fktable_owner)

    end

    else

    begin

    SELECT @fkfull_table_name = quotename(@fktable_owner) +

    '.' + quotename(@fktable_name)

    end

    end

    /* Get Object ID */

    SELECT @fktable_id = object_id(@fkfull_table_name)

    if @fktable_name is not null

    begin

    if @fktable_id is null

    SELECT @fktable_id = 0 /* fk table not found, empty result */

    end

    if @pktable_name is null

    begin /* If table name not supplied, match all */

    select @order_by_pk = 1

    end

    else

    begin

    if @pktable_id is null

    begin

    SELECT @pktable_id = 0 /* pk table not found, empty result */

    end

    end

    /* SQL Server supports upto 16 PK/FK relationships between 2 tables */

    /* Process syskeys for each relationship */

    /* First, attempt to get all 16 keys for each rel'ship, then sort

    them out with a 16-way "insert select ... union select ..." */

    /* select 'XXX starting data analysis' */

    insert into #fkeysall

    select

    r.rkeyid,

    r.rkey1, r.rkey2, r.rkey3, r.rkey4,

    r.rkey5, r.rkey6, r.rkey7, r.rkey8,

    r.rkey9, r.rkey10, r.rkey11, r.rkey12,

    r.rkey13, r.rkey14, r.rkey15, r.rkey16,

    r.fkeyid,

    r.fkey1, r.fkey2, r.fkey3, r.fkey4,

    r.fkey5, r.fkey6, r.fkey7, r.fkey8,

    r.fkey9, r.fkey10, r.fkey11, r.fkey12,

    r.fkey13, r.fkey14, r.fkey15, r.fkey16,

    r.constid,

    i.name

    from

    sysreferences r, sysobjects o, sysindexes i

    where r.constid = o.id

    AND o.xtype = 'F'

    AND r.rkeyindid = i.indid

    AND r.rkeyid = i.id

    AND r.rkeyid between isnull(@pktable_id, 0)

    and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0)

    and isnull(@fktable_id, 0x7fffffff)

    /* select count (*) as 'XXX countall' from #fkeysall */

    insert into #fkeys

    select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name

    from #fkeysall

    /* select count (*) as 'XXX count' from #fkeys */

    insert into #fkeysout

    select

    PKTABLE_QUALIFIER = convert(sysname,db_name()),

    PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),

    PKTABLE_NAME = convert(sysname,o1.name),

    PKCOLUMN_NAME = convert(sysname,c1.name),

    FKTABLE_QUALIFIER = convert(sysname,db_name()),

    FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),

    FKTABLE_NAME = convert(sysname,o2.name),

    FKCOLUMN_NAME = convert(sysname,c2.name),

    KEY_SEQ,

    UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN

    convert(smallint,0) ELSE convert(smallint,1) END,

    DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN

    convert(smallint,0) ELSE convert(smallint,1) END,

    FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),

    PK_NAME,

    DEFERRABILITY = 7 /* SQL_NOT_DEFERRABLE */

    from #fkeys f,

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2

    where o1.id = f.pktable_id

    AND o2.id = f.fktable_id

    AND c1.id = f.pktable_id

    AND c2.id = f.fktable_id

    AND c1.colid = f.pkcolid

    AND c2.colid = f.fkcolid

    /* select count (*) as 'XXX countout' from #fkeysout */

    if @order_by_pk = 1 /* If order by PK fields */

    select

    PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,

    FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,

    KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY

    from #fkeysout

    order by 1,2,3,9,4

    else /* Order by FK fields */

    select

    PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,

    FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,

    KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY

    from #fkeysout

    order by 5,6,7,9,8

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_fkeys

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_fkeys(

    @pktable_name sysname = null,

    @pktable_owner sysname = null,

    @pktable_qualifier sysname = null,

    @fktable_name sysname = null,

    @fktable_owner sysname = null,

    @fktable_qualifier sysname = null )

    as

    set nocount on

    DECLARE @pktable_id int

    DECLARE @pkfull_table_name nvarchar(257) /* 2*128 + 1 */

    DECLARE @fktable_id int

    DECLARE @fkfull_table_name nvarchar(257) /* 2*128 + 1 */

    declare @order_by_pk int

    /* select 'XXX starting table creation' */

    create table #fkeysall(

    rkeyid int NOT NULL,

    rkey1 int NOT NULL,

    rkey2 int NOT NULL,

    rkey3 int NOT NULL,

    rkey4 int NOT NULL,

    rkey5 int NOT NULL,

    rkey6 int NOT NULL,

    rkey7 int NOT NULL,

    rkey8 int NOT NULL,

    rkey9 int NOT NULL,

    rkey10 int NOT NULL,

    rkey11 int NOT NULL,

    rkey12 int NOT NULL,

    rkey13 int NOT NULL,

    rkey14 int NOT NULL,

    rkey15 int NOT NULL,

    rkey16 int NOT NULL,

    fkeyid int NOT NULL,

    fkey1 int NOT NULL,

    fkey2 int NOT NULL,

    fkey3 int NOT NULL,

    fkey4 int NOT NULL,

    fkey5 int NOT NULL,

    fkey6 int NOT NULL,

    fkey7 int NOT NULL,

    fkey8 int NOT NULL,

    fkey9 int NOT NULL,

    fkey10 int NOT NULL,

    fkey11 int NOT NULL,

    fkey12 int NOT NULL,

    fkey13 int NOT NULL,

    fkey14 int NOT NULL,

    fkey15 int NOT NULL,

    fkey16 int NOT NULL,

    constid int NOT NULL,

    name sysname collate database_default NOT NULL)

    create table #fkeys(

    pktable_id int NOT NULL,

    pkcolid int NOT NULL,

    fktable_id int NOT NULL,

    fkcolid int NOT NULL,

    KEY_SEQ smallint NOT NULL,

    fk_id int NOT NULL,

    PK_NAME sysname collate database_default NOT NULL)

    create table #fkeysout(

    PKTABLE_QUALIFIER sysname collate database_default NULL,

    PKTABLE_OWNER sysname collate database_default NULL,

    PKTABLE_NAME sysname collate database_default NOT NULL,

    PKCOLUMN_NAME sysname collate database_default NOT NULL,

    FKTABLE_QUALIFIER sysname collate database_default NULL,

    FKTABLE_OWNER sysname collate database_default NULL,

    FKTABLE_NAME sysname collate database_default NOT NULL,

    FKCOLUMN_NAME sysname collate database_default NOT NULL,

    KEY_SEQ smallint NOT NULL,

    UPDATE_RULE smallint NULL,

    DELETE_RULE smallint NULL,

    FK_NAME sysname collate database_default NULL,

    PK_NAME sysname collate database_default NULL,

    DEFERRABILITY smallint null)

    /* select 'XXX starting parameter analysis' */

    select @order_by_pk = 0

    if (@pktable_name is null) and (@fktable_name is null)

    begin /* If neither primary key nor foreign key table names given */

    raiserror (15252,-1,-1)

    return

    end

    if @fktable_qualifier is not null

    begin

    if db_name() <> @fktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_qualifier is not null

    begin

    if db_name() <> @pktable_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @pktable_owner is null

    begin /* If unqualified primary key table name */

    SELECT @pkfull_table_name = quotename(@pktable_name)

    end

    else

    begin /* Qualified primary key table name */

    if @pktable_owner = ''

    begin /* If empty owner name */

    SELECT @pkfull_table_name = quotename(@pktable_owner)

    end

    else

    begin

    SELECT @pkfull_table_name = quotename(@pktable_owner) +

    '.' + quotename(@pktable_name)

    end

    end

    /* Get Object ID */

    SELECT @pktable_id = object_id(@pkfull_table_name)

    if @fktable_owner is null

    begin /* If unqualified foreign key table name */

    SELECT @fkfull_table_name = quotename(@fktable_name)

    end

    else

    begin /* Qualified foreign key table name */

    if @fktable_owner = ''

    begin /* If empty owner name */

    SELECT @fkfull_table_name = quotename(@fktable_owner)

    end

    else

    begin

    SELECT @fkfull_table_name = quotename(@fktable_owner) +

    '.' + quotename(@fktable_name)

    end

    end

    /* Get Object ID */

    SELECT @fktable_id = object_id(@fkfull_table_name)

    if @fktable_name is not null

    begin

    if @fktable_id is null

    SELECT @fktable_id = 0 /* fk table not found, empty result */

    end

    if @pktable_name is null

    begin /* If table name not supplied, match all */

    select @order_by_pk = 1

    end

    else

    begin

    if @pktable_id is null

    begin

    SELECT @pktable_id = 0 /* pk table not found, empty result */

    end

    end

    /* SQL Server supports upto 16 PK/FK relationships between 2 tables */

    /* Process syskeys for each relationship */

    /* First, attempt to get all 16 keys for each rel'ship, then sort

    them out with a 16-way "insert select ... union select ..." */

    /* select 'XXX starting data analysis' */

    insert into #fkeysall

    select

    r.rkeyid,

    r.rkey1, r.rkey2, r.rkey3, r.rkey4,

    r.rkey5, r.rkey6, r.rkey7, r.rkey8,

    r.rkey9, r.rkey10, r.rkey11, r.rkey12,

    r.rkey13, r.rkey14, r.rkey15, r.rkey16,

    r.fkeyid,

    r.fkey1, r.fkey2, r.fkey3, r.fkey4,

    r.fkey5, r.fkey6, r.fkey7, r.fkey8,

    r.fkey9, r.fkey10, r.fkey11, r.fkey12,

    r.fkey13, r.fkey14, r.fkey15, r.fkey16,

    r.constid,

    i.name

    from

    sysreferences r, sysobjects o, sysindexes i

    where r.constid = o.id

    AND o.xtype = 'F'

    AND r.rkeyindid = i.indid

    AND r.rkeyid = i.id

    AND r.rkeyid between isnull(@pktable_id, 0)

    and isnull(@pktable_id, 0x7fffffff)

    AND r.fkeyid between isnull(@fktable_id, 0)

    and isnull(@fktable_id, 0x7fffffff)

    /* select count (*) as 'XXX countall' from #fkeysall */

    insert into #fkeys

    select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name

    from #fkeysall

    union all

    select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name

    from #fkeysall

    /* select count (*) as 'XXX count' from #fkeys */

    insert into #fkeysout

    select

    PKTABLE_QUALIFIER = convert(sysname,db_name()),

    PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),

    PKTABLE_NAME = convert(sysname,o1.name),

    PKCOLUMN_NAME = convert(sysname,c1.name),

    FKTABLE_QUALIFIER = convert(sysname,db_name()),

    FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),

    FKTABLE_NAME = convert(sysname,o2.name),

    FKCOLUMN_NAME = convert(sysname,c2.name),

    KEY_SEQ,

    UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN

    convert(smallint,0) ELSE convert(smallint,1) END,

    DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN

    convert(smallint,0) ELSE convert(smallint,1) END,

    FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),

    PK_NAME,

    DEFERRABILITY = 7 /* SQL_NOT_DEFERRABLE */

    from #fkeys f,

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2

    where o1.id = f.pktable_id

    AND o2.id = f.fktable_id

    AND c1.id = f.pktable_id

    AND c2.id = f.fktable_id

    AND c1.colid = f.pkcolid

    AND c2.colid = f.fkcolid

    /* select count (*) as 'XXX countout' from #fkeysout */

    if @order_by_pk = 1 /* If order by PK fields */

    select

    PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,

    FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,

    KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY

    from #fkeysout

    order by 1,2,3,9,4

    else /* Order by FK fields */

    select

    PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,

    FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,

    KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY

    from #fkeysout

    order by 5,6,7,9,8

    go

    grant execute on sp_fkeys to public

    go

    dump tran master with no_log

    go

    print 'creating sp_pkeys'

    go

    /* Procedure for pre-6.0 server */

    CREATE PROCEDURE sp_pkeys(

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null )

    as

    set nocount on

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    if @table_owner is null /* If owner not supplied, match all */

    select @table_owner = '%'

    if @@trancount <> 0

    begin /* If inside a transaction */

    raiserror 20003 '~~Rush_35~~'

    return

    end

    create table #pkeys(

    TABLE_QUALIFIER varchar(32) NULL,

    TABLE_OWNER varchar(32) NULL,

    TABLE_NAME varchar(32) NOT NULL,

    COLUMN_NAME varchar(32) NOT NULL,

    KEY_SEQ smallint NOT NULL)

    /* SQL Server supports upto 8 PK/FK relationships between 2 tables */

    /* Process syskeys for each relationship */

    /* The inserts below adds a row to the temp table for each of the

    8 possible relationships */

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    1

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = k.key1

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    2

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key2

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    3

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key3

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    4

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key4

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    5

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key5

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    6

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key6

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    7

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key7

    if (@@rowcount = 0)

    goto done

    insert into #pkeys

    select

    db_name(),

    (select user_name(uid) from sysobjects o where o.id = k.id),

    object_name(k.id),

    c.name,

    8

    from

    syskeys k, syscolumns c

    where

    c.id = k.id

    and k.type = 1 /* Primary type key */

    and c.colid = key8

    done:

    select

    TABLE_QUALIFIER,

    TABLE_OWNER,

    TABLE_NAME,

    COLUMN_NAME,

    KEY_SEQ,

    PK_NAME = convert(varchar(32),null)

    from #pkeys

    where TABLE_NAME = @table_name

    and TABLE_OWNER like @table_owner

    order by 1, 2, 3, 5

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following error.'

    end

    else

    drop proc sp_pkeys

    go

    /* Procedure for 6.0 and 6.50 servers */

    CREATE PROCEDURE sp_pkeys(

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null )

    as

    DECLARE @table_id int

    DECLARE @full_table_name varchar(255) /* 2*128 + 1 */

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = @table_owner

    end

    else

    begin

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    select

    TABLE_QUALIFIER = convert(sysname,db_name()),

    TABLE_OWNER = convert(sysname,user_name(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    KEY_SEQ =

    case

    when c.name = index_col(@full_table_name, i.indid, 1) then convert (smallint,1)

    when c.name = index_col(@full_table_name, i.indid, 2) then convert (smallint,2)

    when c.name = index_col(@full_table_name, i.indid, 3) then convert (smallint,3)

    when c.name = index_col(@full_table_name, i.indid, 4) then convert (smallint,4)

    when c.name = index_col(@full_table_name, i.indid, 5) then convert (smallint,5)

    when c.name = index_col(@full_table_name, i.indid, 6) then convert (smallint,6)

    when c.name = index_col(@full_table_name, i.indid, 7) then convert (smallint,7)

    when c.name = index_col(@full_table_name, i.indid, 8) then convert (smallint,8)

    when c.name = index_col(@full_table_name, i.indid, 9) then convert (smallint,9)

    when c.name = index_col(@full_table_name, i.indid, 10) then convert (smallint,10)

    when c.name = index_col(@full_table_name, i.indid, 11) then convert (smallint,11)

    when c.name = index_col(@full_table_name, i.indid, 12) then convert (smallint,12)

    when c.name = index_col(@full_table_name, i.indid, 13) then convert (smallint,13)

    when c.name = index_col(@full_table_name, i.indid, 14) then convert (smallint,14)

    when c.name = index_col(@full_table_name, i.indid, 15) then convert (smallint,15)

    when c.name = index_col(@full_table_name, i.indid, 16) then convert (smallint,16)

    end,

    PK_NAME = convert(sysname,i.name)

    from

    sysindexes i, syscolumns c, sysobjects o

    where

    o.id = @table_id

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800

    and (c.name = index_col (@full_table_name, i.indid, 1) or

    c.name = index_col (@full_table_name, i.indid, 2) or

    c.name = index_col (@full_table_name, i.indid, 3) or

    c.name = index_col (@full_table_name, i.indid, 4) or

    c.name = index_col (@full_table_name, i.indid, 5) or

    c.name = index_col (@full_table_name, i.indid, 6) or

    c.name = index_col (@full_table_name, i.indid, 7) or

    c.name = index_col (@full_table_name, i.indid, 8) or

    c.name = index_col (@full_table_name, i.indid, 9) or

    c.name = index_col (@full_table_name, i.indid, 10) or

    c.name = index_col (@full_table_name, i.indid, 11) or

    c.name = index_col (@full_table_name, i.indid, 12) or

    c.name = index_col (@full_table_name, i.indid, 13) or

    c.name = index_col (@full_table_name, i.indid, 14) or

    c.name = index_col (@full_table_name, i.indid, 15) or

    c.name = index_col (@full_table_name, i.indid, 16)

    )

    order by 1, 2, 3, 5

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_pkeys

    go

    /* Procedure for 7.0 & 8.0 servers */

    CREATE PROCEDURE sp_pkeys(

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null )

    as

    DECLARE @table_id int

    DECLARE @full_table_name nvarchar(255)

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    select

    TABLE_QUALIFIER = convert(sysname,db_name()),

    TABLE_OWNER = convert(sysname,user_name(o.uid)),

    TABLE_NAME = convert(sysname,o.name),

    COLUMN_NAME = convert(sysname,c.name),

    KEY_SEQ =

    case

    when c.name = index_col(@full_table_name, i.indid, 1) then convert (smallint,1)

    when c.name = index_col(@full_table_name, i.indid, 2) then convert (smallint,2)

    when c.name = index_col(@full_table_name, i.indid, 3) then convert (smallint,3)

    when c.name = index_col(@full_table_name, i.indid, 4) then convert (smallint,4)

    when c.name = index_col(@full_table_name, i.indid, 5) then convert (smallint,5)

    when c.name = index_col(@full_table_name, i.indid, 6) then convert (smallint,6)

    when c.name = index_col(@full_table_name, i.indid, 7) then convert (smallint,7)

    when c.name = index_col(@full_table_name, i.indid, 8) then convert (smallint,8)

    when c.name = index_col(@full_table_name, i.indid, 9) then convert (smallint,9)

    when c.name = index_col(@full_table_name, i.indid, 10) then convert (smallint,10)

    when c.name = index_col(@full_table_name, i.indid, 11) then convert (smallint,11)

    when c.name = index_col(@full_table_name, i.indid, 12) then convert (smallint,12)

    when c.name = index_col(@full_table_name, i.indid, 13) then convert (smallint,13)

    when c.name = index_col(@full_table_name, i.indid, 14) then convert (smallint,14)

    when c.name = index_col(@full_table_name, i.indid, 15) then convert (smallint,15)

    when c.name = index_col(@full_table_name, i.indid, 16) then convert (smallint,16)

    end,

    PK_NAME = convert(sysname,i.name)

    from

    sysindexes i, syscolumns c, sysobjects o --, syscolumns c1

    where

    o.id = @table_id

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800

    and (c.name = index_col (@full_table_name, i.indid, 1) or

    c.name = index_col (@full_table_name, i.indid, 2) or

    c.name = index_col (@full_table_name, i.indid, 3) or

    c.name = index_col (@full_table_name, i.indid, 4) or

    c.name = index_col (@full_table_name, i.indid, 5) or

    c.name = index_col (@full_table_name, i.indid, 6) or

    c.name = index_col (@full_table_name, i.indid, 7) or

    c.name = index_col (@full_table_name, i.indid, 8) or

    c.name = index_col (@full_table_name, i.indid, 9) or

    c.name = index_col (@full_table_name, i.indid, 10) or

    c.name = index_col (@full_table_name, i.indid, 11) or

    c.name = index_col (@full_table_name, i.indid, 12) or

    c.name = index_col (@full_table_name, i.indid, 13) or

    c.name = index_col (@full_table_name, i.indid, 14) or

    c.name = index_col (@full_table_name, i.indid, 15) or

    c.name = index_col (@full_table_name, i.indid, 16)

    )

    order by 1, 2, 3, 5

    go

    grant execute on sp_pkeys to public

    go

    dump tran master with no_log

    go

    print 'creating sp_server_info'

    go

    create proc sp_server_info (

    @attribute_id int = null)

    as

    if @attribute_id is not null

    select *

    from master.dbo.spt_server_info

    where attribute_id = @attribute_id

    else

    select *

    from master.dbo.spt_server_info

    order by attribute_id

    go

    grant execute on sp_server_info to public

    go

    dump tran master with no_log

    go

    print 'creating sp_special_columns'

    go

    /* Procedure for pre-6.0 server */

    CREATE PROCEDURE sp_special_columns (

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null,

    @col_type char(1) = 'R',

    @scope char(1) = 'T',

    @nullable char(1) = 'U',

    @ODBCVer int = 2)

    AS

    DECLARE @indid int

    DECLARE @table_id int

    DECLARE @full_table_name varchar(65) /* 2*32+1 */

    DECLARE @scopeout smallint

    if @col_type not in ('R','V') or @col_type is null

    begin

    raiserror 20002 '~~Rush_42~~'

    return

    end

    if @scope = 'C'

    select @scopeout = 0

    else if @scope = 'T'

    select @scopeout = 1

    else

    begin

    raiserror 20002 '~~Rush_43~~'

    return

    end

    if @nullable not in ('U','O') or @nullable is null

    begin

    raiserror 20002 '~~Rush_44~~'

    return

    end

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if @col_type = 'V'

    BEGIN /* if ROWVER, just run that query */

    SELECT

    SCOPE = convert(smallint,NULL),

    COLUMN_NAME = convert(varchar(32),c.name),

    DATA_TYPE = convert(smallint, -3),

    TYPE_NAME = t.name,

    "PRECISION" = convert(int,8),

    LENGTH = convert(int,8),

    SCALE = convert(smallint, NULL),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    systypes t, syscolumns c

    WHERE

    c.id = @table_id

    AND c.usertype = 80 /* TIMESTAMP */

    AND t.usertype = 80 /* TIMESTAMP */

    RETURN

    END

    /* ROWID, now find the id of the 'best' index for this table */

    IF @nullable = 'O' /* Don't include any indexes that contain

    nullable columns. */

    SELECT @indid = MIN(indid)

    FROM sysindexes i,syscolumns c,syscolumns c2

    WHERE

    i.status&2 = 2 /* If Unique Index */

    AND c.id = i.id

    AND c2.id = c.id

    AND c2.colid < i.keycnt + (i.status&16)/16

    AND i.id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    AND c.name = index_col(@table_name,i.indid,c2.colid)

    GROUP BY indid HAVING SUM(c.status&8) = 0

    ELSE /* Include indexes that are partially nullable. */

    SELECT @indid = MIN(indid)

    FROM sysindexes i

    WHERE

    status&2 = 2 /* If Unique Index */

    AND id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    SELECT

    SCOPE = @scopeout,

    COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    "PRECISION" = isnull(d.data_precision, convert(int,c.length)),

    LENGTH = isnull(d.length, convert(int,c.length)),

    SCALE = d.numeric_scale,

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    sysindexes x,

    syscolumns c,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c2 /* Self-join to generate list of index columns and */

    /* to extract datatype names */

    WHERE

    x.id = @table_id

    AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)

    AND c.id = x.id

    AND c2.id = x.id

    AND c2.colid < keycnt+(x.status&16)/16

    AND x.indid = @indid

    AND t.type = d.ss_dtype

    AND c.length = d.fixlen

    AND c.usertype = t.usertype

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_special_columns

    go

    /* Procedure for 6.0 and 6.50 servers */

    CREATE PROCEDURE sp_special_columns (

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null,

    @col_type char(1) = 'R',

    @scope char(1) = 'T',

    @nullable char(1) = 'U',

    @ODBCVer int = 2)

    AS

    DECLARE @indid int

    DECLARE @table_id int

    DECLARE @full_table_name varchar(65) /* 2*32+1 */

    DECLARE @scopeout smallint

    if @col_type not in ('R','V') or @col_type is null

    begin

    raiserror (15251,-1,-1,'col_type','''R'' or ''V''')

    return

    end

    if @scope = 'C'

    select @scopeout = 0

    else if @scope = 'T'

    select @scopeout = 1

    else

    begin

    raiserror (15251,-1,-1,'scope','''C'' or ''T''')

    return

    end

    if @nullable not in ('U','O') or @nullable is null

    begin

    raiserror (15251,-1,-1,'nullable','''U'' or ''O''')

    return

    end

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if @col_type = 'V'

    BEGIN /* if ROWVER, just run that query */

    SELECT

    SCOPE = convert(smallint,NULL),

    COLUMN_NAME = convert(varchar(32),c.name),

    DATA_TYPE = convert(smallint, -2),

    TYPE_NAME = t.name,

    "PRECISION" = convert(int,8),

    LENGTH = convert(int,8),

    SCALE = convert(smallint, NULL),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    systypes t, syscolumns c

    WHERE

    c.id = @table_id

    AND c.usertype = 80 /* TIMESTAMP */

    AND t.usertype = 80 /* TIMESTAMP */

    RETURN

    END

    /* ROWID, now find the id of the 'best' index for this table */

    IF @nullable = 'O' /* Don't include any indexes that contain

    nullable columns. */

    SELECT @indid = MIN(indid)

    FROM sysindexes i,syscolumns c,syscolumns c2

    WHERE

    i.status&2 = 2 /* If Unique Index */

    AND c.id = i.id

    AND c2.id = c.id

    AND c2.colid < i.keycnt + (i.status&16)/16

    AND i.id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    AND c.name = index_col(@table_name,i.indid,c2.colid)

    GROUP BY indid HAVING SUM(c.status&8) = 0

    ELSE /* Include indexes that are partially nullable. */

    SELECT @indid = MIN(indid)

    FROM sysindexes i

    WHERE

    status&2 = 2 /* If Unique Index */

    AND id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    SELECT

    SCOPE = @scopeout,

    COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),

    d.DATA_TYPE,

    convert(varchar(32),case

    when (t.usertype > 100 or t.usertype in (18,80))

    then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else isnull(convert(int,c.prec), 2147483647)

    end) "PRECISION",

    convert(int,case

    when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */

    convert(int,c.prec+2)

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, c.scale),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    sysindexes x,

    syscolumns c,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c2 /* Self-join to generate list of index columns and */

    /* to extract datatype names */

    WHERE

    x.id = @table_id

    AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)

    AND c.id = x.id

    AND c2.id = x.id

    AND c2.colid < x.keycnt+(x.status&16)/16

    AND x.indid = @indid

    AND t.type = d.ss_dtype

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128

    AND c.usertype = t.usertype

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_special_columns

    go

    /* Procedure for 7.0 servers */

    CREATE PROCEDURE sp_special_columns (

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null,

    @col_type char(1) = 'R',

    @scope char(1) = 'T',

    @nullable char(1) = 'U',

    @ODBCVer int = 2)

    AS

    DECLARE @indid int

    DECLARE @table_id int

    DECLARE @full_table_name nvarchar(257)

    DECLARE @scopeout smallint

    if @col_type not in ('R','V') or @col_type is null

    begin

    raiserror (15251,-1,-1,'col_type','''R'' or ''V''')

    return

    end

    if @scope = 'C'

    select @scopeout = 0

    else if @scope = 'T'

    select @scopeout = 1

    else

    begin

    raiserror (15251,-1,-1,'scope','''C'' or ''T''')

    return

    end

    if @nullable not in ('U','O') or @nullable is null

    begin

    raiserror (15251,-1,-1,'nullable','''U'' or ''O''')

    return

    end

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if @col_type = 'V'

    BEGIN /* if ROWVER, just run that query */

    SELECT

    SCOPE = convert(smallint,NULL),

    COLUMN_NAME = convert(sysname,c.name),

    DATA_TYPE = convert(smallint, -2),

    TYPE_NAME = t.name,

    "PRECISION" = convert(int,8),

    LENGTH = convert(int,8),

    SCALE = convert(smallint, NULL),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    systypes t, syscolumns c

    WHERE

    not (@table_id is null)

    AND c.id = @table_id

    AND t.name = 'timestamp' /* TIMESTAMP */

    AND t.xtype = c.xtype

    AND t.xusertype = c.xusertype

    RETURN

    END

    /* ROWID, now find the id of the 'best' index for this table */

    IF @nullable = 'O' /* Don't include any indexes that contain

    nullable columns. */

    SELECT @indid = MIN(indid)

    FROM sysindexes x, syscolumns c, syscolumns c2

    WHERE

    not (@table_id is null)

    AND x.status&2 = 2 /* If Unique Index */

    AND c.id = x.id

    AND c2.id = c.id

    AND c2.colid < x.keycnt + (x.status&16)/16

    AND x.id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    AND c.name = index_col(@table_name,x.indid,c2.colid)

    GROUP BY indid HAVING SUM(c.status&8) = 0

    ELSE /* Include indexes that are partially nullable. */

    SELECT @indid = MIN(indid)

    FROM sysindexes x

    WHERE

    not (@table_id is null)

    AND status&2 = 2 /* If Unique Index */

    AND id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    SELECT

    SCOPE = @scopeout,

    COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),

    d.DATA_TYPE,

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    sysindexes x,

    syscolumns c,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c2 /* Self-join to generate list of index columns and */

    /* to extract datatype names */

    WHERE

    not (@table_id is null)

    AND x.id = @table_id

    AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)

    AND c.id = x.id

    AND c2.id = x.id

    AND c2.colid < x.keycnt + (x.status&16)/16

    AND x.indid = @indid

    AND t.xtype = d.ss_dtype

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_special_columns

    go

    /* Procedure for 8.0 and later servers */

    CREATE PROCEDURE sp_special_columns (

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null,

    @col_type char(1) = 'R',

    @scope char(1) = 'T',

    @nullable char(1) = 'U',

    @ODBCVer int = 2)

    AS

    DECLARE @indid int

    DECLARE @table_id int

    DECLARE @full_table_name nvarchar(257)

    DECLARE @scopeout smallint

    if @col_type not in ('R','V') or @col_type is null

    begin

    raiserror (15251,-1,-1,'col_type','''R'' or ''V''')

    return

    end

    if @scope = 'C'

    select @scopeout = 0

    else if @scope = 'T'

    select @scopeout = 1

    else

    begin

    raiserror (15251,-1,-1,'scope','''C'' or ''T''')

    return

    end

    if @nullable not in ('U','O') or @nullable is null

    begin

    raiserror (15251,-1,-1,'nullable','''U'' or ''O''')

    return

    end

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if @col_type = 'V'

    BEGIN /* if ROWVER, just run that query */

    SELECT

    SCOPE = convert(smallint,NULL),

    COLUMN_NAME = convert(sysname,c.name),

    DATA_TYPE = convert(smallint, -2),

    TYPE_NAME = t.name,

    "PRECISION" = convert(int,8),

    LENGTH = convert(int,8),

    SCALE = convert(smallint, NULL),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    systypes t, syscolumns c

    WHERE

    not (@table_id is null)

    AND c.id = @table_id

    AND t.name = 'timestamp' /* TIMESTAMP */

    AND t.xtype = c.xtype

    AND t.xusertype = c.xusertype

    RETURN

    END

    /* ROWID, now find the id of the 'best' index for this table */

    IF @nullable = 'O' /* Don't include any indexes that contain

    nullable columns. */

    SELECT @indid = MIN(indid)

    FROM sysindexes x, syscolumns c, syscolumns c2

    WHERE

    not (@table_id is null)

    AND x.status&2 = 2 /* If Unique Index */

    AND c.id = x.id

    AND c2.id = c.id

    AND c2.colid < x.keycnt + (x.status&18)/18

    AND x.id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    AND c.name = index_col(@table_name,x.indid,c2.colid)

    GROUP BY indid HAVING SUM(c.status&8) = 0

    ELSE /* Include indexes that are partially nullable. */

    SELECT @indid = MIN(indid)

    FROM sysindexes x

    WHERE

    not (@table_id is null)

    AND status&2 = 2 /* If Unique Index */

    AND id = @table_id

    AND indid > 0 /* Eliminate Table Row */

    SELECT

    SCOPE = @scopeout,

    COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),

    d.DATA_TYPE,

    convert(sysname,case

    when t.xusertype > 255 then t.name

    else d.TYPE_NAME collate database_default

    end) TYPE_NAME,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    PSEUDO_COLUMN = convert(smallint,1)

    FROM

    sysindexes x,

    syscolumns c,

    master.dbo.spt_datatype_info d,

    systypes t,

    syscolumns c2 /* Self-join to generate list of index columns and */

    /* to extract datatype names */

    WHERE

    not (@table_id is null)

    AND x.id = @table_id

    AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)

    AND c.id = x.id

    AND c2.id = x.id

    AND c2.colid < x.keycnt + (x.status&16)/16

    AND x.indid = @indid

    AND t.xtype = d.ss_dtype

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)

    AND c.xusertype = t.xusertype

    go

    grant execute on sp_special_columns to public

    go

    dump tran master with no_log

    go

    print 'creating sp_sproc_columns'

    go

    /* Procedure for pre-6.0 server */

    CREATE PROCEDURE sp_sproc_columns (

    @procedure_name varchar(102) = '%', /* 3*32+5+1 */

    @procedure_owner varchar(96) = null,

    @procedure_qualifier varchar(32) = null,

    @column_name varchar(96) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @group_num_lower smallint

    DECLARE @group_num_upper smallint

    DECLARE @semi_position int

    DECLARE @full_procedure_name varchar(205)/* 2*102+1 */

    DECLARE @procedure_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @procedure_qualifier is not null

    begin

    if db_name() <> @procedure_qualifier

    begin

    if @procedure_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @procedure_name = ''

    select @procedure_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_51~~'

    return

    end

    end

    end

    if @procedure_name is null

    begin /* If procedure name not supplied, match all */

    select @procedure_name = '%'

    end

    /* first we need to extract the procedure group number, if one exists */

    select @semi_position = charindex(';',@procedure_name)

    if (@semi_position > 0)

    begin /* If group number separator (;) found */

    select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))

    select @group_num_upper = @group_num_lower

    select @procedure_name = substring(@procedure_name, 1, @semi_position -1)

    end

    else

    begin /* No group separator, so default to group number of 1 */

    select @group_num_lower = 1

    select @group_num_upper = 32767

    end

    if @procedure_owner is null

    begin /* If unqualified procedure name */

    SELECT @full_procedure_name = @procedure_name

    end

    else

    begin /* Qualified procedure name */

    SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name

    end

    /* Get Object ID */

    SELECT @procedure_id = object_id(@full_procedure_name)

    if ((charindex('%',@full_procedure_name) = 0) and

    (charindex('_',@full_procedure_name) = 0) and

    @procedure_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the procedure name */

    SELECT

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(varchar(32),c.name),

    COLUMN_TYPE = convert(smallint, 0),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    "PRECISION" = isnull(d.data_precision, convert(int,c.length)),

    LENGTH = isnull(d.length, convert(int,c.length)),

    SCALE = d.numeric_scale,

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),null),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(varchar(32),'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the procedure name */

    if @procedure_owner is null

    select @procedure_owner = '%'

    SELECT

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(varchar(32),c.name),

    COLUMN_TYPE = convert(smallint, 0),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    "PRECISION" = isnull(d.data_precision, convert(int,c.length)),

    LENGTH = isnull(d.length, convert(int,c.length)),

    SCALE = d.numeric_scale,

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),null),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND o.id = c.id

    AND t.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND c.usertype = t.usertype

    AND o.type = 'P' /* Just Procedures */

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(varchar(32),'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    go

    if (charindex('6.00', @@version) = 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.0 SQL Server.'

    print 'Ignore the following error.'

    end

    else

    drop proc sp_sproc_columns

    go

    /* Procedure for 6.0 and 6.50 servers */

    CREATE PROCEDURE sp_sproc_columns (

    @procedure_name varchar(102) = '%', /* 3*36+5+1 */

    @procedure_owner varchar(96) = null,

    @procedure_qualifier varchar(32) = null,

    @column_name varchar(96) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @group_num_lower smallint

    DECLARE @group_num_upper smallint

    DECLARE @semi_position int

    DECLARE @full_procedure_name varchar(205)

    DECLARE @procedure_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @procedure_qualifier is not null

    begin

    if db_name() <> @procedure_qualifier

    begin

    if @procedure_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @procedure_name = ''

    select @procedure_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @procedure_name is null

    begin /* If procedure name not supplied, match all */

    select @procedure_name = '%'

    end

    /* first we need to extract the procedure group number, if one exists */

    select @semi_position = charindex(';',@procedure_name)

    if (@semi_position > 0)

    begin /* If group number separator (;) found */

    select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))

    select @group_num_upper = @group_num_lower

    select @procedure_name = substring(@procedure_name, 1, @semi_position -1)

    end

    else

    begin /* No group separator, so default to group number of 1 */

    select @group_num_lower = 1

    select @group_num_upper = 32767

    end

    if @procedure_owner is null

    begin /* If unqualified procedure name */

    SELECT @full_procedure_name = @procedure_name

    end

    else

    begin /* Qualified procedure name */

    SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name

    end

    /* Get Object ID */

    SELECT @procedure_id = object_id(@full_procedure_name)

    if ((charindex('%',@full_procedure_name) = 0) and

    (charindex('[',@full_procedure_name) = 0) and

    (charindex('_',@full_procedure_name) = 0) and

    @procedure_id <> 0)

    begin

    /* this block is for the case where there is no pattern

    matching required for the procedure name */

    SELECT

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(varchar(32),c.name),

    COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else isnull(convert(int,c.prec), 2147483647)

    end) "PRECISION",

    convert(int,case

    when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */

    c.prec+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, c.scale),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.usertype = t.usertype

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(varchar(32),'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the procedure name */

    if @procedure_owner is null

    select @procedure_owner = '%'

    SELECT

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(varchar(32),c.name),

    COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else isnull(convert(int,c.prec), 2147483647)

    end) "PRECISION",

    convert(int,case

    when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */

    c.prec+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, c.scale),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND o.id = c.id

    AND c.type = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.usertype = t.usertype

    AND o.type = 'P' /* Just Procedures */

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),

    PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(varchar(32),'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(varchar(255),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_sproc_columns

    go

    /* Procedure for 7.0 server */

    CREATE PROCEDURE sp_sproc_columns (

    @procedure_name nvarchar(390) = '%',

    @procedure_owner nvarchar(384) = null,

    @procedure_qualifier sysname = null,

    @column_name nvarchar(384) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @group_num_lower smallint

    DECLARE @group_num_upper smallint

    DECLARE @semi_position int

    DECLARE @full_procedure_name nvarchar(774)

    DECLARE @procedure_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @procedure_qualifier is not null

    begin

    if db_name() <> @procedure_qualifier

    begin

    if @procedure_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @procedure_name = ''

    select @procedure_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @procedure_name is null

    begin /* If procedure name not supplied, match all */

    select @procedure_name = '%'

    end

    /* first we need to extract the procedure group number, if one exists */

    select @semi_position = charindex(';',@procedure_name)

    if (@semi_position > 0)

    begin /* If group number separator (;) found */

    select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))

    select @group_num_upper = @group_num_lower

    select @procedure_name = substring(@procedure_name, 1, @semi_position -1)

    end

    else

    begin /* No group separator, so default to all groups */

    select @group_num_lower = 1

    select @group_num_upper = 32767

    end

    if @procedure_owner is null

    begin /* If unqualified procedure name */

    SELECT @full_procedure_name = quotename(@procedure_name)

    end

    else

    begin /* Qualified procedure name */

    if @procedure_owner = ''

    begin /* If empty owner name */

    SELECT @full_procedure_name = quotename(@procedure_owner)

    end

    else

    begin

    SELECT @full_procedure_name = quotename(@procedure_owner) +

    '.' + quotename(@procedure_name)

    end

    end

    /* Get Object ID */

    SELECT @procedure_id = object_id(@full_procedure_name)

    if ((isnull(charindex('%', @full_procedure_name),0) = 0) and

    (isnull(charindex('[', @procedure_name),0) = 0) and

    (isnull(charindex('[', @procedure_owner),0) = 0) and

    (isnull(charindex('_', @full_procedure_name),0) = 0) and

    not (@procedure_id is null))

    begin

    /* this block is for the case where there is no pattern

    matching required for the procedure name */

    SELECT

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,c.name),

    COLUMN_TYPE = convert(smallint, 1+c.isoutparam),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(sysname,'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the procedure name */

    if @procedure_owner is null

    select @procedure_owner = '%'

    SELECT

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,c.name),

    COLUMN_TYPE = convert(smallint, 1+c.isoutparam),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND o.id = c.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND o.type = 'P' /* Just Procedures */

    AND c.name like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(sysname,'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.name like @procedure_name

    AND c.id = o.id

    AND user_name(o.uid) like @procedure_owner

    AND c.colid = 1

    AND o.type = 'P' /* Just Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    ORDER BY 1, 2, 3, 18

    end

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_sproc_columns

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_sproc_columns (

    @procedure_name nvarchar(390) = '%',

    @procedure_owner nvarchar(384) = null,

    @procedure_qualifier sysname = null,

    @column_name nvarchar(384) = null,

    @ODBCVer int = 2)

    AS

    DECLARE @group_num_lower smallint

    DECLARE @group_num_upper smallint

    DECLARE @semi_position int

    DECLARE @full_procedure_name nvarchar(774)

    DECLARE @procedure_id int

    if @column_name is null /* If column name not supplied, match all */

    select @column_name = '%'

    if @procedure_qualifier is not null

    begin

    if db_name() <> @procedure_qualifier

    begin

    if @procedure_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @procedure_name = ''

    select @procedure_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @procedure_name is null

    begin /* If procedure name not supplied, match all */

    select @procedure_name = '%'

    end

    /* first we need to extract the procedure group number, if one exists */

    select @semi_position = charindex(';',@procedure_name)

    if (@semi_position > 0)

    begin /* If group number separator (;) found */

    select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))

    select @group_num_upper = @group_num_lower

    select @procedure_name = substring(@procedure_name, 1, @semi_position -1)

    end

    else

    begin /* No group separator, so default to all groups */

    select @group_num_lower = 1

    select @group_num_upper = 32767

    end

    if @procedure_owner is null

    begin /* If unqualified procedure name */

    SELECT @full_procedure_name = quotename(@procedure_name)

    end

    else

    begin /* Qualified procedure name */

    if @procedure_owner = ''

    begin /* If empty owner name */

    SELECT @full_procedure_name = quotename(@procedure_owner)

    end

    else

    begin

    SELECT @full_procedure_name = quotename(@procedure_owner) +

    '.' + quotename(@procedure_name)

    end

    end

    /* Get Object ID */

    SELECT @procedure_id = object_id(@full_procedure_name)

    if ((isnull(charindex('%', @full_procedure_name),0) = 0) and

    (isnull(charindex('[', @procedure_name),0) = 0) and

    (isnull(charindex('[', @procedure_owner),0) = 0) and

    (isnull(charindex('_', @full_procedure_name),0) = 0) and

    not (@procedure_id is null))

    begin

    /* this block is for the case where there is no pattern

    matching required for the procedure name */

    SELECT

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,c.name),

    COLUMN_TYPE = convert(smallint, 1+c.isoutparam),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))

    AND ((c.number between @group_num_lower and @group_num_upper)

    OR (c.number = 0 and o.type = 'FN'))

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5),

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(sysname,'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.colid = 1

    AND o.type = 'P' /* Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* UDF return value */

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, c.isnullable),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND o.id = c.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND o.type = 'FN' /* Scalar UDF */

    AND c.name like @column_name

    AND c.colid = 0

    AND c.number = 0

    UNION ALL

    SELECT /* Table valued functions */

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),

    COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 3),

    DATA_TYPE = convert(smallint, NULL),

    TYPE_NAME = convert(sysname, 'table'),

    "PRECISION" = convert(int,0),

    LENGTH = convert(int,0),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,0),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254), 'Result table returned by table valued function'),

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, NULL),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,0)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.id = @procedure_id

    AND c.id = o.id

    AND c.colid = 1

    AND o.type IN ('TF', 'IF')

    AND '@TABLE_RETURN_VALUE' like @column_name

    AND c.number = 0

    ORDER BY 1, 2, 3, 18

    end

    else

    begin

    /* this block is for the case where there IS pattern

    matching done on the procedure name */

    if @procedure_owner is null

    select @procedure_owner = '%'

    SELECT

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,c.name),

    COLUMN_TYPE = convert(smallint, 1+c.isoutparam),

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    d.NULLABLE,

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int, c.colid),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND o.id = c.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND c.name like @column_name

    AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))

    AND ((c.number between @group_num_lower and @group_num_upper)

    OR (c.number = 0 and o.type = 'FN'))

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */

    DATA_TYPE = convert(smallint, 4),

    TYPE_NAME = convert(sysname,'int'),

    "PRECISION" = convert(int,10),

    LENGTH = convert(int,4),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,10),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, 4),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,56)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.name like @procedure_name

    AND c.id = o.id

    AND user_name(o.uid) like @procedure_owner

    AND c.colid = 1

    AND o.type = 'P' /* Procedures */

    AND '@RETURN_VALUE' like @column_name

    AND c.number between @group_num_lower and @group_num_upper

    UNION ALL

    SELECT /* UDF return value */

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */

    d.DATA_TYPE,

    TYPE_NAME = t.name,

    convert(int,case

    when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */

    else OdbcPrec(c.xtype,c.length,c.xprec)

    end) "PRECISION",

    convert(int,case

    when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */

    OdbcPrec(c.xtype,c.length,c.xprec)+2

    else

    isnull(d.length, c.length)

    end) LENGTH,

    SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),

    d.RADIX,

    NULLABLE = convert(smallint, c.isnullable),

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    d.SQL_DATA_TYPE,

    d.SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),

    SS_DATA_TYPE = c.type

    FROM

    syscolumns c,

    sysobjects o,

    master.dbo.spt_datatype_info d,

    systypes t

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND o.id = c.id

    AND c.xtype = d.ss_dtype

    AND c.length = isnull(d.fixlen, c.length)

    AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)

    AND isnull(d.AUTO_INCREMENT,0) = 0

    AND c.xusertype = t.xusertype

    AND o.type = 'FN' /* Scalar UDF */

    AND c.name like @column_name

    AND c.colid = 0

    AND c.number = 0

    UNION ALL

    SELECT /* Table valued functions */

    PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),

    PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),

    COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),

    COLUMN_TYPE = convert(smallint, 3),

    DATA_TYPE = convert(smallint, NULL),

    TYPE_NAME = convert(sysname, 'table'),

    "PRECISION" = convert(int,0),

    LENGTH = convert(int,0),

    SCALE = convert(smallint,0),

    RADIX = convert(smallint,0),

    NULLABLE = convert(smallint,0),

    REMARKS = convert(varchar(254), 'Result table returned by table valued function'),

    COLUMN_DEF = convert(nvarchar(4000),NULL),

    SQL_DATA_TYPE = convert(smallint, NULL),

    SQL_DATETIME_SUB = convert(smallint,null),

    CHAR_OCTET_LENGTH = convert(int,null),

    ORDINAL_POSITION = convert(int,0),

    IS_NULLABLE = convert(varchar(254),'NO'),

    SS_DATA_TYPE = convert(tinyint,0)

    FROM

    syscomments c, sysobjects o

    WHERE

    o.name like @procedure_name

    AND user_name(o.uid) like @procedure_owner

    AND c.id = o.id

    AND c.colid = 1

    AND o.type IN ('TF', 'IF')

    AND '@TABLE_RETURN_VALUE' like @column_name

    AND c.number = 0

    ORDER BY 1, 2, 3, 18

    end

    go

    grant execute on sp_sproc_columns to public

    go

    dump tran master with no_log

    go

    print 'creating sp_statistics'

    go

    /* Procedure for pre-7.0 server */

    CREATE PROCEDURE sp_statistics (

    @table_name varchar(32),

    @table_owner varchar(32) = null,

    @table_qualifier varchar(32) = null,

    @index_name varchar(32) = '%',

    @is_unique char(1) = 'N',

    @accuracy char(1) = 'Q')

    AS

    set nocount on

    DECLARE @indid int

    DECLARE @lastindid int

    DECLARE @table_id int

    DECLARE @full_table_name varchar(65) /* 2*32+1 */

    create table #TmpIndex(

    TABLE_QUALIFIER varchar(32) NULL,

    TABLE_OWNER varchar(32) NULL,

    TABLE_NAME varchar(32) NOT NULL,

    INDEX_QUALIFIER varchar(32) null,

    INDEX_NAME varchar(32) null,

    NON_UNIQUE smallint null,

    TYPE smallint NOT NULL,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME varchar(32) null,

    COLLATION char(1) null,

    index_id int null,

    CARDINALITY int null,

    PAGES int null,

    status smallint NOT NULL)

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    if @accuracy not in ('Q','E')

    begin

    raiserror 20002 '~~Rush_58~~'

    return

    end

    if (@@trancount <> 0 and

    charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* If inside a transaction */

    raiserror 20003 '~~Rush_59~~'

    return

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = @table_owner

    end

    else

    begin

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    /* Start at lowest index id */

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE id = @table_id

    AND indid > 0

    AND indid < 255

    WHILE @indid is not NULL

    BEGIN

    INSERT #TmpIndex /* Add all columns that are in index */

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    o.name, /* INDEX_QUALIFIER */

    x.name, /* INDEX_NAME */

    0, /* NON_UNIQUE */

    1, /* SQL_INDEX_CLUSTERED */

    colid, /* SEQ_IN_INDEX */

    INDEX_COL(@full_table_name,indid,colid),/* COLUMN_NAME */

    'A', /* COLLATION */

    @indid, /* index_id */

    x.rows, /* CARDINALITY */

    x.dpages, /* PAGES */

    x.status /* status */

    FROM sysindexes x, syscolumns c, sysobjects o

    WHERE

    x.id = @table_id

    AND x.id = o.id

    AND x.id = c.id

    AND c.colid < keycnt+(x.status&16)/16 /* all but Unique Clust indices have an extra key */

    AND x.indid = @indid

    /*

    ** Now move @indid to the next index.

    */

    SELECT @lastindid = @indid

    SELECT @indid = NULL

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE id = @table_id

    AND indid > @lastindid

    AND indid < 255

    END

    UPDATE #TmpIndex

    SET NON_UNIQUE = 1

    WHERE status&2 <> 2 /* If non-unique index */

    UPDATE #TmpIndex

    SET

    TYPE = 3, /* SQL_INDEX_OTHER */

    CARDINALITY = NULL,

    PAGES = NULL

    WHERE index_id > 1 /* If non-clustered index */

    /* now add row for table statistics */

    INSERT #TmpIndex

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    null, /* INDEX_QUALIFIER */

    null, /* INDEX_NAME */

    null, /* NON_UNIQUE */

    0, /* SQL_TABLE_STAT */

    null, /* SEQ_IN_INDEX */

    null, /* COLUMN_NAME */

    null, /* COLLATION */

    0, /* index_id */

    x.rows, /* CARDINALITY */

    x.dpages, /* PAGES */

    0 /* status */

    FROM sysindexes x, sysobjects o

    WHERE o.id = @table_id

    AND x.id = o.id

    AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */

    /* then table stats are in */

    /* a row with indid =0 */

    if @is_unique <> 'Y' /* If all indexes desired */

    SELECT

    TABLE_QUALIFIER,

    TABLE_OWNER,

    TABLE_NAME,

    NON_UNIQUE,

    INDEX_QUALIFIER,

    INDEX_NAME,

    TYPE,

    SEQ_IN_INDEX,

    COLUMN_NAME,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION = convert(varchar(128),null)

    FROM #TmpIndex

    WHERE

    INDEX_NAME like @index_name /* If matching name */

    or INDEX_NAME is null /* If SQL_TABLE_STAT row */

    ORDER BY 4, 7, 6, 8

    else /* If only unique indexes desired */

    SELECT

    TABLE_QUALIFIER,

    TABLE_OWNER,

    TABLE_NAME,

    NON_UNIQUE,

    INDEX_QUALIFIER,

    INDEX_NAME,

    TYPE,

    SEQ_IN_INDEX,

    COLUMN_NAME,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION = convert(varchar(128),null)

    FROM #TmpIndex

    WHERE

    (NON_UNIQUE = 0 /* If unique */

    or NON_UNIQUE is NULL) /* If SQL_TABLE_STAT row */

    and (INDEX_NAME like @index_name /* If matching name */

    or INDEX_NAME is null) /* If SQL_TABLE_STAT row */

    ORDER BY 4, 7, 6, 8

    DROP TABLE #TmpIndex

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_statistics

    go

    /* Procedure for 7.0 server */

    CREATE PROCEDURE sp_statistics (

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null,

    @index_name sysname = '%',

    @is_unique char(1) = 'N',

    @accuracy char(1) = 'Q')

    AS

    set nocount on

    DECLARE @indid int

    DECLARE @lastindid int

    DECLARE @table_id int

    DECLARE @full_table_name nvarchar(257)

    create table #TmpIndex(

    TABLE_QUALIFIER sysname NULL,

    TABLE_OWNER sysname NULL,

    TABLE_NAME sysname NOT NULL,

    INDEX_QUALIFIER sysname null,

    INDEX_NAME sysname null,

    NON_UNIQUE smallint null,

    TYPE smallint NOT NULL,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME sysname null,

    COLLATION char(1) null,

    index_id int null,

    CARDINALITY int null,

    PAGES int null,

    status int NOT NULL)

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @accuracy not in ('Q','E')

    begin

    raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')

    return

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    /* Start at lowest index id */

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE not (@table_id is null)

    AND id = @table_id

    AND indid > 0

    AND indid < 255

    /* Create a temp table to correct the ordinal position of the columns */

    create table #TmpColumns

    (ordinal int identity(1,1),

    colid smallint not null)

    /* Load columns into the temp table */

    insert into #TmpColumns (colid)

    select c.colid

    from syscolumns c

    where c.id = @table_id

    order by c.colid

    WHILE @indid is not NULL

    BEGIN

    INSERT #TmpIndex /* Add all columns that are in index */

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    o.name, /* INDEX_QUALIFIER */

    x.name, /* INDEX_NAME */

    case /* NON_UNIQUE */

    WHEN x.status&2 <> 2 then 1 /* Nonunique index */

    else 0 /* Unique index */

    end,

    case /* TYPE */

    when @indid > 1 then 3 /* Non-Clustered */

    else 1 /* Clustered index */

    end,

    tc.ordinal, /* SEQ_IN_INDEX */

    INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME */

    'A', /* COLLATION */

    @indid, /* index_id */

    case /* CARDINALITY */

    when @indid > 1 then NULL /* Non-Clustered */

    else x.rows /* Clustered index */

    end,

    case /* PAGES */

    when @indid > 1 then NULL /* Non-Clustered */

    else x.dpages /* Clustered index */

    end,

    x.status /* status */

    FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc

    WHERE

    not (@table_id is null)

    AND x.id = @table_id

    AND x.id = o.id

    AND x.id = c.id

    AND tc.colid = c.colid

    AND tc.ordinal < keycnt+(x.status&18)/18 /* all but Unique Clust indices have an extra key */

    AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL

    AND indid = @indid

    AND (x.status&2 = 2

    OR @is_unique <> 'Y')

    AND (x.status&32) = 0

    /*

    ** Now move @indid to the next index.

    */

    SELECT @lastindid = @indid

    SELECT @indid = NULL

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE not (@table_id is null)

    AND id = @table_id

    AND indid > @lastindid

    AND indid < 255

    END

    /* now add row for table statistics */

    INSERT #TmpIndex

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    null, /* INDEX_QUALIFIER */

    null, /* INDEX_NAME */

    null, /* NON_UNIQUE */

    0, /* SQL_TABLE_STAT */

    null, /* SEQ_IN_INDEX */

    null, /* COLUMN_NAME */

    null, /* COLLATION */

    0, /* index_id */

    x.rows, /* CARDINALITY */

    x.dpages, /* PAGES */

    0 /* status */

    FROM sysindexes x, sysobjects o

    WHERE not (@table_id is null)

    AND o.id = @table_id

    AND x.id = o.id

    AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */

    /* then table stats are in */

    /* a row with indid =0 */

    SELECT

    TABLE_QUALIFIER,

    TABLE_OWNER,

    TABLE_NAME,

    NON_UNIQUE,

    INDEX_QUALIFIER,

    INDEX_NAME,

    TYPE,

    SEQ_IN_INDEX,

    COLUMN_NAME,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION = convert(varchar(128),null)

    FROM #TmpIndex

    WHERE

    INDEX_NAME like @index_name /* If matching name */

    or INDEX_NAME is null /* If SQL_TABLE_STAT row */

    ORDER BY 4, 7, 6, 8

    DROP TABLE #TmpIndex, #TmpColumns

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_statistics

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_statistics (

    @table_name sysname,

    @table_owner sysname = null,

    @table_qualifier sysname = null,

    @index_name sysname = '%',

    @is_unique char(1) = 'N',

    @accuracy char(1) = 'Q')

    AS

    set nocount on

    DECLARE @indid int

    DECLARE @lastindid int

    DECLARE @table_id int

    DECLARE @full_table_name nvarchar(257)

    create table #TmpIndex(

    TABLE_QUALIFIER sysname collate database_default NULL,

    TABLE_OWNER sysname collate database_default NULL,

    TABLE_NAME sysname collate database_default NOT NULL,

    INDEX_QUALIFIER sysname collate database_default null,

    INDEX_NAME sysname collate database_default null,

    NON_UNIQUE smallint null,

    TYPE smallint NOT NULL,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME sysname collate database_default null,

    COLLATION char(1) collate database_default null,

    index_id int null,

    CARDINALITY int null,

    PAGES int null,

    status int NOT NULL)

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @accuracy not in ('Q','E')

    begin

    raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')

    return

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = quotename(@table_name)

    end

    else

    begin /* Qualified table name */

    if @table_owner = ''

    begin /* If empty owner name */

    SELECT @full_table_name = quotename(@table_owner)

    end

    else

    begin

    SELECT @full_table_name = quotename(@table_owner) +

    '.' + quotename(@table_name)

    end

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    /* Start at lowest index id */

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE not (@table_id is null)

    AND id = @table_id

    AND indid > 0

    AND indid < 255

    /* Create a temp table to correct the ordinal position of the columns */

    create table #TmpColumns

    (ordinal int identity(1,1),

    colid smallint not null)

    /* Load columns into the temp table */

    insert into #TmpColumns (colid)

    select c.colid

    from syscolumns c

    where c.id = @table_id

    order by c.colid

    WHILE @indid is not NULL

    BEGIN

    INSERT #TmpIndex /* Add all columns that are in index */

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    o.name, /* INDEX_QUALIFIER */

    x.name, /* INDEX_NAME */

    case /* NON_UNIQUE */

    WHEN x.status&2 <> 2 then 1 /* Nonunique index */

    else 0 /* Unique index */

    end,

    case /* TYPE */

    when @indid > 1 then 3 /* Non-Clustered */

    else 1 /* Clustered index */

    end,

    tc.ordinal, /* SEQ_IN_INDEX */

    INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME */

    'A', /* COLLATION */

    @indid, /* index_id */

    case /* CARDINALITY */

    when @indid > 1 then NULL /* Non-Clustered */

    else x.rows /* Clustered index */

    end,

    case /* PAGES */

    when @indid > 1 then NULL /* Non-Clustered */

    else x.dpages /* Clustered index */

    end,

    x.status /* status */

    FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc

    WHERE

    not (@table_id is null)

    AND x.id = @table_id

    AND x.id = o.id

    AND x.id = c.id

    AND tc.colid = c.colid

    AND tc.ordinal < keycnt+(x.status&18)/18 /* all but Unique Clust indices have an extra key */

    AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL

    AND indid = @indid

    AND (x.status&2 = 2

    OR @is_unique <> 'Y')

    AND (x.status&32) = 0

    /*

    ** Now move @indid to the next index.

    */

    SELECT @lastindid = @indid

    SELECT @indid = NULL

    SELECT @indid = min(indid)

    FROM sysindexes

    WHERE not (@table_id is null)

    AND id = @table_id

    AND indid > @lastindid

    AND indid < 255

    END

    /* now add row for table statistics */

    INSERT #TmpIndex

    SELECT

    DB_NAME(), /* TABLE_QUALIFIER */

    USER_NAME(o.uid), /* TABLE_OWNER */

    o.name, /* TABLE_NAME */

    null, /* INDEX_QUALIFIER */

    null, /* INDEX_NAME */

    null, /* NON_UNIQUE */

    0, /* SQL_TABLE_STAT */

    null, /* SEQ_IN_INDEX */

    null, /* COLUMN_NAME */

    null, /* COLLATION */

    0, /* index_id */

    x.rows, /* CARDINALITY */

    x.dpages, /* PAGES */

    0 /* status */

    FROM sysindexes x, sysobjects o

    WHERE not (@table_id is null)

    AND o.id = @table_id

    AND x.id = o.id

    AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */

    /* then table stats are in */

    /* a row with indid =0 */

    SELECT

    TABLE_QUALIFIER,

    TABLE_OWNER,

    TABLE_NAME,

    NON_UNIQUE,

    INDEX_QUALIFIER,

    INDEX_NAME,

    TYPE,

    SEQ_IN_INDEX,

    COLUMN_NAME,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION = convert(varchar(128),null)

    FROM #TmpIndex

    WHERE

    INDEX_NAME like @index_name /* If matching name */

    or INDEX_NAME is null /* If SQL_TABLE_STAT row */

    ORDER BY 4, 7, 6, 8

    DROP TABLE #TmpIndex, #TmpColumns

    go

    grant execute on sp_statistics to public

    go

    dump tran master with no_log

    go

    print 'creating sp_stored_procedures'

    go

    /* pre 8.0 version */

    create procedure sp_stored_procedures(

    @sp_name varchar(102) = null,

    @sp_owner varchar(96) = null,

    @sp_qualifier varchar(32) = null)

    as

    declare @proc_type smallint

    if @sp_qualifier is not null

    begin

    if db_name() <> @sp_qualifier

    begin

    if @sp_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @sp_name = ''

    select @sp_owner = ''

    end else

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_51~~'

    return

    end

    end

    end

    if @sp_name is null

    begin /* If procedure name not supplied, match all */

    select @sp_name = '%'

    end

    else begin

    if (@sp_owner is null) and (charindex('%', @sp_name) = 0)

    begin

    if exists (select * from sysobjects

    where uid = user_id()

    and name = @sp_name

    and type = 'P') /* Object type of Procedure */

    begin

    select @sp_owner = user_name()

    end

    end

    end

    if @sp_owner is null /* If procedure owner not supplied, match all */

    select @sp_owner = '%'

    select @proc_type=2 /* Return 2 for 4.2 and later servers. */

    select

    PROCEDURE_QUALIFIER = convert(varchar(32),db_name()),

    PROCEDURE_OWNER = convert(varchar(32),user_name(o.uid)),

    PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),

    NUM_INPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_RESULT_SETS = -1, /* Constant since value unknown */

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    PROCEDURE_TYPE = @proc_type

    from

    sysobjects o,syscomments c,sysusers u

    where

    o.name like @sp_name

    and c.colid = 1

    and user_name(o.uid) like @sp_owner

    and o.type = 'P' /* Object type of Procedure */

    and c.id = o.id

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* outer join to correlate with all rows in sysobjects */

    where p.id =* o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 1, 2, 3

    go

    grant execute on sp_stored_procedures to public

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_stored_procedures

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 7.0 version */

    create procedure sp_stored_procedures(

    @sp_name nvarchar(390) = null,

    @sp_owner nvarchar(384) = null,

    @sp_qualifier sysname = null)

    as

    declare @proc_type smallint

    if @sp_qualifier is not null

    begin

    if db_name() <> @sp_qualifier

    begin

    if @sp_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @sp_name = ''

    select @sp_owner = ''

    end else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @sp_name is null

    begin /* If procedure name not supplied, match all */

    select @sp_name = '%'

    end

    else begin

    if (@sp_owner is null) and (charindex('%', @sp_name) = 0)

    begin

    if exists (select * from sysobjects

    where uid = user_id()

    and name = @sp_name

    and type = 'P') /* Object type of Procedure */

    begin

    select @sp_owner = user_name()

    end

    end

    end

    if @sp_owner is null /* If procedure owner not supplied, match all */

    select @sp_owner = '%'

    select @proc_type=2 /* Return 2 for 4.2 and later servers. */

    select

    PROCEDURE_QUALIFIER = convert(sysname,db_name()),

    PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    NUM_INPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_RESULT_SETS = -1, /* Constant since value unknown */

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    PROCEDURE_TYPE = @proc_type

    from

    sysobjects o,syscomments c

    where

    o.name like @sp_name

    and c.colid = 1

    and user_name(o.uid) like @sp_owner

    and o.type = 'P' /* Object type of Procedure */

    and c.id = o.id

    and permissions (o.id)&32 <> 0

    order by 1, 2, 3

    go

    grant execute on sp_stored_procedures to public

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_stored_procedures

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    create procedure sp_stored_procedures(

    @sp_name nvarchar(390) = null,

    @sp_owner nvarchar(384) = null,

    @sp_qualifier sysname = null)

    as

    declare @proc_type smallint

    if @sp_qualifier is not null

    begin

    if db_name() <> @sp_qualifier

    begin

    if @sp_qualifier = ''

    begin

    /* in this case, we need to return an empty result set */

    /* because the user has requested a database with an empty name */

    select @sp_name = ''

    select @sp_owner = ''

    end else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @sp_name is null

    begin /* If procedure name not supplied, match all */

    select @sp_name = '%'

    end

    else

    begin

    if (@sp_owner is null) and (charindex('%', @sp_name) = 0)

    begin

    if exists (select * from sysobjects

    where uid = user_id()

    and name = @sp_name

    and type in ('P', 'FN', 'TF', 'IF')) /* Procedures, scalar UDF, table UDF */

    begin

    select @sp_owner = user_name()

    end

    end

    end

    if @sp_owner is null /* If procedure owner not supplied, match all */

    select @sp_owner = '%'

    select @proc_type=2 /* Return 2 for 4.2 and later servers. */

    select

    PROCEDURE_QUALIFIER = convert(sysname,db_name()),

    PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    NUM_INPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */

    NUM_RESULT_SETS = -1, /* Constant since value unknown */

    REMARKS = convert(varchar(254),null), /* Remarks are NULL */

    PROCEDURE_TYPE = @proc_type

    from

    sysobjects o,syscomments c

    where

    o.name like @sp_name

    and c.colid = 1

    and user_name(o.uid) like @sp_owner

    and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure, scalar UDF, table UDF */

    and c.id = o.id

    and permissions (o.id)&32 <> 0

    order by 1, 2, 3

    go

    grant execute on sp_stored_procedures to public

    go

    dump tran master with no_log

    go

    print 'creating sp_table_privileges'

    go

    /* Procedure for pre 6.50 server */

    CREATE PROCEDURE sp_table_privileges (

    @table_name varchar(90),

    @table_owner varchar(90) = null,

    @table_qualifier varchar(32) = null)

    as

    set nocount on

    declare @table_id int,

    @owner_id int,

    @full_table_name char(181)

    declare @refconst int

    select @refconst = 1

    if (charindex('6.00', @@version) = 0)

    select @refconst = NULL

    if @table_qualifier is not null

    begin

    if db_name() != @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror 20001 'Table qualifier must be name of current database'

    return

    end

    end

    if @table_owner is null

    begin /* If unqualified table name */

    SELECT @full_table_name = @table_name

    end

    else

    begin /* Qualified table name */

    SELECT @full_table_name = @table_owner + '.' + @table_name

    end

    /* Get Object ID */

    SELECT @table_id = object_id(@full_table_name)

    if @@trancount != 0

    begin /* If inside a transaction */

    raiserror 20003 'The procedure ''sp_table_privileges'' cannot be executed from within a transaction.'

    return

    end

    create table #table_priv1(

    table_qualifier varchar(32) NOT NULL,

    table_owner varchar(32) NOT NULL,

    table_name varchar(32) NOT NULL,

    grantor varchar(32) NOT NULL,

    grantee varchar(32) NOT NULL,

    select_privilege int NOT NULL,

    insert_privilege int NOT NULL,

    update_privilege int NOT NULL,

    delete_privilege int NOT NULL,

    references_privilege int NULL,

    is_grantable varchar(3) NOT NULL,

    uid int NOT NULL,

    gid int NOT NULL)

    insert into #table_priv1

    select distinct

    db_name(),

    user_name(o.uid),

    o.name,

    user_name(o.uid),

    u.name,

    0,

    0,

    0,

    0,

    @refconst,

    'no',

    u.uid,

    u.gid

    from sysusers u, sysobjects o

    where o.id = @table_id and u.uid != u.gid

    and sysstat & 0xf in (1,2,3) /* only valid for system tables,

    ** user tables, and views. */

    /*

    ** now add row for table owner

    */

    if exists (

    select *

    from #table_priv1

    where grantor = grantee)

    begin

    update #table_priv1

    set

    select_privilege = 1,

    update_privilege = 1,

    insert_privilege = 1,

    delete_privilege = 1,

    references_privilege = 1,

    is_grantable = 'yes'

    where grantor = grantee

    end

    else

    begin

    insert into #table_priv1

    select db_name(),

    user_name(o.uid),

    o.name,

    user_name(o.uid),

    user_name(o.uid),

    1,

    1,

    1,

    1,

    @refconst,

    'yes',

    o.uid,

    u.gid

    from sysobjects o, sysusers u

    where o.id = @table_id and u.uid = o.uid

    and sysstat & 0xf in (1,2,3) /* only valid for system tables,

    ** user tables, and views. */

    end

    update #table_priv1

    set select_privilege = 1

    where

    exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 205

    and action = 193)

    and not exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 206

    and action = 193)

    update #table_priv1

    set insert_privilege = 1

    where

    exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 205

    and action = 195)

    and not exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 206

    and action = 195)

    update #table_priv1

    set delete_privilege = 1

    where

    exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 205

    and action = 196)

    and not exists (select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 206

    and action = 196)

    update #table_priv1

    set update_privilege = 1

    where

    exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 205

    and action = 197)

    and not exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 206

    and action = 197)

    update #table_priv1

    set references_privilege = 1

    where

    exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 205

    and action = 26)

    and not exists (

    select * from sysprotects

    where

    id = @table_id

    and (#table_priv1.uid = uid

    or #table_priv1.gid = uid

    or uid = 0)

    and protecttype = 206

    and action = 26)

    create table #table_priv2(

    table_qualifier varchar(32) NULL,

    table_owner varchar(32) NULL,

    table_name varchar(32) NOT NULL,

    grantor varchar(32) NULL,

    grantee varchar(32) NOT NULL,

    privilege varchar(32) NOT NULL,

    is_grantable varchar(3) NULL)

    insert into #table_priv2

    select

    table_qualifier,

    table_owner,

    table_name,

    grantor,

    grantee,

    'SELECT',

    is_grantable

    from #table_priv1

    where select_privilege = 1

    insert into #table_priv2

    select

    table_qualifier,

    table_owner,

    table_name,

    grantor,

    grantee,

    'INSERT',

    is_grantable

    from #table_priv1

    where insert_privilege = 1

    insert into #table_priv2

    select

    table_qualifier,

    table_owner,

    table_name,

    grantor,

    grantee,

    'DELETE',

    is_grantable

    from #table_priv1

    where delete_privilege = 1

    insert into #table_priv2

    select

    table_qualifier,

    table_owner,

    table_name,

    grantor,

    grantee,

    'UPDATE',

    is_grantable

    from #table_priv1

    where update_privilege = 1

    insert into #table_priv2

    select

    table_qualifier,

    table_owner,

    table_name,

    grantor,

    grantee,

    'REFERENCES',

    is_grantable

    from #table_priv1

    where references_privilege = 1

    select * from #table_priv2

    order by table_owner,table_name,privilege,grantee

    /* order by 2,3,6,5 Can't use since fails on 4.21a server */

    go

    if (charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.50 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_table_privileges

    go

    /* Procedure for 6.50 server */

    CREATE PROCEDURE sp_table_privileges (

    @table_name varchar(96),

    @table_owner varchar(96) = null,

    @table_qualifier varchar(32) = null)

    as

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_name is null

    select @table_name = '%'

    if @table_owner is null /* If no owner supplied, force wildcard */

    select @table_owner = '%'

    select

    convert(varchar(32),db_name()) TABLE_QUALIFIER,

    convert(varchar(32),user_name(o.uid)) TABLE_OWNER,

    convert(varchar(32),object_name(o.id)) TABLE_NAME,

    convert(varchar(32),user_name(p.grantor)) GRANTOR,

    convert(varchar(32),user_name(u.uid)) GRANTEE,

    convert(varchar(32),case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),case when p.protecttype = 205 then 'NO'

    else 'YES'

    end) IS_GRANTABLE

    from sysprotects p, sysobjects o, sysusers u

    where

    p.id = o.id

    and o.type in ('U','V','S')

    and object_name(o.id) like @table_name

    and user_name(o.uid) like @table_owner

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or

    (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    convert(varchar(32),db_name()) TABLE_QUALIFIER,

    convert(varchar(32),user_name(o.uid)) TABLE_OWNER,

    convert(varchar(32),object_name(o.id)) TABLE_NAME,

    convert(varchar(32),user_name(u.uid)) GRANTOR,

    convert(varchar(32),user_name(o.uid)) GRANTEE,

    convert(varchar(32),case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),'YES') IS_GRANTABLE

    from sysobjects o, master.dbo.spt_values v, sysusers u

    where

    object_name(o.id) like @table_name

    and o.type in ('U','V','S')

    and user_name(o.uid) like @table_owner

    and u.uid = 1 /* grantor is dbo of database */

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 2,3,6,5

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop proc sp_table_privileges

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 and later servers */

    CREATE PROCEDURE sp_table_privileges (

    @table_name nvarchar(384),

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null)

    as

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    if @table_name is null

    select @table_name = '%'

    if @table_owner is null /* If no owner supplied, force wildcard */

    select @table_owner = '%'

    select

    convert(sysname,db_name()) TABLE_QUALIFIER,

    convert(sysname,user_name(o.uid)) TABLE_OWNER,

    convert(sysname,object_name(o.id)) TABLE_NAME,

    convert(sysname,user_name(p.grantor)) GRANTOR,

    convert(sysname,user_name(u.uid)) GRANTEE,

    convert(varchar(32),case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),case when p.protecttype = 205 then 'NO'

    else 'YES'

    end) IS_GRANTABLE

    from sysprotects p, sysobjects o, sysusers u, sysmembers m

    where

    p.id = o.id

    and o.type in ('U','V','S')

    and object_name(o.id) like @table_name

    and user_name(o.uid) like @table_owner

    /* expand groups - AKUNDONE: only 1 level of grp unrolling. */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or

    (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    convert(sysname,db_name()) TABLE_QUALIFIER,

    convert(sysname,user_name(o.uid)) TABLE_OWNER,

    convert(sysname,object_name(o.id)) TABLE_NAME,

    convert(sysname,user_name(u.uid)) GRANTOR,

    convert(sysname,user_name(o.uid)) GRANTEE,

    convert(varchar(32),case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end) PRIVILEGE,

    convert(varchar(3),'YES') IS_GRANTABLE

    from sysobjects o, master.dbo.spt_values v, sysusers u

    where

    object_name(o.id) like @table_name

    and o.type in ('U','V','S')

    and user_name(o.uid) like @table_owner

    and u.uid = 1 /* grantor is 'dbo' of database */

    and v.type = N'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 2,3,6,5

    go

    grant execute on sp_table_privileges to public

    go

    dump tran master with no_log

    go

    print 'creating sp_tables'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_tables(

    @table_name varchar(96) = null,

    @table_owner varchar(96) = null,

    @table_qualifier varchar(32) = null,

    @table_type varchar(100) = null)

    as

    declare @type1 varchar(3)

    declare @tableindex int

    /* Special feature #1: enumerate databases when owner and name

    are blank but qualifier is explicitly '%'. */

    if @table_qualifier = '%' and

    @table_owner = '' and

    @table_name = ''

    begin /* If enumerating databases */

    select

    TABLE_QUALIFIER = convert(varchar(32),d.name),

    TABLE_OWNER = convert(varchar(32),null),

    TABLE_NAME = convert(varchar(32),null),

    TABLE_TYPE = convert(varchar(32),null),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from master.dbo.sysdatabases d

    where d.name <> 'model' /* eliminate MODEL database */

    order by 1

    end

    /* Special feature #2: enumerate owners when qualifier and name

    are blank but owner is explicitly '%'. */

    else if @table_qualifier = '' and

    @table_owner = '%' and

    @table_name = ''

    begin /* If enumerating owners */

    select distinct

    TABLE_QUALIFIER = convert(varchar(32),null),

    TABLE_OWNER = convert(varchar(32),user_name(uid)),

    TABLE_NAME = convert(varchar(32),null),

    TABLE_TYPE = convert(varchar(32),null),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysobjects

    order by 2

    end

    /* Special feature #3: enumerate table types when qualifier, owner and

    name are blank but table type is explicitly '%'. */

    else if @table_qualifier = '' and

    @table_owner = '' and

    @table_name = '' and

    @table_type = '%'

    begin /* If enumerating table types */

    select

    TABLE_QUALIFIER = convert(varchar(32),null),

    TABLE_OWNER = convert(varchar(32),null),

    TABLE_NAME = convert(varchar(32),null),

    TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE VIEW',(colid-1)*12+1,12))),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysobjects o, syscolumns c

    where o.id=c.id and o.name='sysusers' and colid<=3

    end

    else

    begin /* end of special features - do normal processing */

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin

    if @table_qualifier = ''

    begin /* If empty qualifier supplied */

    /* Force an empty result set */

    select @table_name = ''

    select @table_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    end

    end

    if @table_type is null

    begin /* Select all ODBC supported table types */

    select @type1 = 'SUV'

    end

    else

    begin

    /* TableType is case sensitive if CS server */

    select @type1 = null

    if (charindex('''SYSTEM TABLE''',@table_type) <> 0)

    select @type1 = @type1 + 'S' /* Add System Tables */

    if (charindex('''TABLE''',@table_type) <> 0)

    select @type1 = @type1 + 'U' /* Add User Tables */

    if (charindex('''VIEW''',@table_type) <> 0)

    select @type1 = @type1 + 'V' /* Add Views */

    end

    if @table_name is null

    begin /* If table name not supplied, match all */

    select @table_name = '%'

    end

    else

    begin

    if (@table_owner is null) and (charindex('%', @table_name) = 0)

    begin /* If owner not specified and table is specified */

    if exists (select * from sysobjects

    where uid = user_id()

    and name = @table_name

    and (type = 'U' or type = 'V' or type = 'S'))

    begin /* Override supplied owner w/owner of table */

    select @table_owner = user_name()

    end

    end

    end

    if @table_owner is null /* If no owner supplied, force wildcard */

    select @table_owner = '%'

    select

    TABLE_QUALIFIER = convert(varchar(32),db_name()),

    TABLE_OWNER = convert(varchar(32),user_name(o.uid)),

    TABLE_NAME = convert(varchar(32),o.name), /* make nullable */

    TABLE_TYPE = convert(varchar(32),rtrim(

    substring('SYSTEM TABLE TABLE VIEW ',

    (ascii(o.type)-83)*12+1,12))), /* 'S'=0,'U'=2,'V'=3 */

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysusers u, sysobjects o

    where

    o.name like @table_name

    and user_name(o.uid) like @table_owner

    and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* outer join to correlate with all rows in sysobjects */

    where p.id =* o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 1, 2, 3

    end

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_tables

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_tables(

    @table_name nvarchar(384) = null,

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null,

    @table_type varchar(100) = null)

    as

    declare @type1 varchar(3)

    declare @tableindex int

    /* Special feature #1: enumerate databases when owner and name

    are blank but qualifier is explicitly '%'. */

    if @table_qualifier = '%' and

    @table_owner = '' and

    @table_name = ''

    begin /* If enumerating databases */

    select

    TABLE_QUALIFIER = convert(sysname,d.name),

    TABLE_OWNER = convert(sysname,null),

    TABLE_NAME = convert(sysname,null),

    TABLE_TYPE = convert(varchar(32),null),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from master.dbo.sysdatabases d

    where d.name <> 'model' /* eliminate MODEL database */

    order by 1

    end

    /* Special feature #2: enumerate owners when qualifier and name

    are blank but owner is explicitly '%'. */

    else if @table_qualifier = '' and

    @table_owner = '%' and

    @table_name = ''

    begin /* If enumerating owners */

    select distinct

    TABLE_QUALIFIER = convert(sysname,null),

    TABLE_OWNER = convert(sysname,user_name(uid)),

    TABLE_NAME = convert(sysname,null),

    TABLE_TYPE = convert(varchar(32),null),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysobjects

    order by 2

    end

    /* Special feature #3: enumerate table types when qualifier, owner and

    name are blank but table type is explicitly '%'. */

    else if @table_qualifier = '' and

    @table_owner = '' and

    @table_name = '' and

    @table_type = '%'

    begin /* If enumerating table types */

    select

    TABLE_QUALIFIER = convert(sysname,null),

    TABLE_OWNER = convert(sysname,null),

    TABLE_NAME = convert(sysname,null),

    TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE VIEW',(colid-1)*12+1,12))),

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysobjects o, syscolumns c

    where o.id=c.id and o.name='sysusers' and colid<=3

    end

    else

    begin /* end of special features - do normal processing */

    if @table_qualifier is not null

    begin

    if db_name() <> @table_qualifier

    begin

    if @table_qualifier = ''

    begin /* If empty qualifier supplied */

    /* Force an empty result set */

    select @table_name = ''

    select @table_owner = ''

    end

    else

    begin /* If qualifier doesn't match current database */

    raiserror (15250, -1,-1)

    return

    end

    end

    end

    if @table_type is null

    begin /* Select all ODBC supported table types */

    select @type1 = 'SUV'

    end

    else

    begin

    /* TableType is case sensitive if CS server */

    select @type1 = ''

    if (charindex('''SYSTEM TABLE''',@table_type) <> 0)

    select @type1 = @type1 + 'S' /* Add System Tables */

    if (charindex('''TABLE''',@table_type) <> 0)

    select @type1 = @type1 + 'U' /* Add User Tables */

    if (charindex('''VIEW''',@table_type) <> 0)

    select @type1 = @type1 + 'V' /* Add Views */

    end

    if @table_name is null

    begin /* If table name not supplied, match all */

    select @table_name = '%'

    end

    else

    begin

    if (@table_owner is null) and (charindex('%', @table_name) = 0)

    begin /* If owner not specified and table is specified */

    if exists (select * from sysobjects

    where uid = user_id()

    and name = @table_name

    and (type = 'U' or type = 'V' or type = 'S'))

    begin /* Override supplied owner w/owner of table */

    select @table_owner = user_name()

    end

    end

    end

    if @table_owner is null /* If no owner supplied, force wildcard */

    select @table_owner = '%'

    select

    TABLE_QUALIFIER = convert(sysname,db_name()),

    TABLE_OWNER = convert(sysname,user_name(o.uid)),

    TABLE_NAME = convert(sysname,o.name), /* make nullable */

    TABLE_TYPE = convert(varchar(32),rtrim(

    substring('SYSTEM TABLE TABLE VIEW ',

    (ascii(o.type)-83)*12+1,12))), /* 'S'=0,'U'=2,'V'=3 */

    REMARKS = convert(varchar(254),null) /* Remarks are NULL */

    from sysobjects o

    where

    o.name like @table_name

    and user_name(o.uid) like @table_owner

    and o.type in ('U','V','S')

    and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */

    and permissions (o.id)&4096 <> 0

    order by 4, 1, 2, 3

    end

    go

    grant execute on sp_tables to public

    go

    dump tran master with no_log

    go

    /*-----------------------------------------------------------------------------*/

    /*-------------- CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/

    /*-----------------------------------------------------------------------------*/

    if object_id('sp_linkedservers', 'P') is not null

    drop proc sp_linkedservers

    go

    raiserror(15339,-1,-1,'sp_linkedservers')

    go

    create proc sp_linkedservers as

    IF is_srvrolemember('sysadmin') = 1

    begin

    select

    SRV_NAME = srvname,

    SRV_PROVIDERNAME = providername,

    SRV_PRODUCT = srvproduct,

    SRV_DATASOURCE = datasource,

    SRV_PROVIDERSTRING = providerstring,

    SRV_LOCATION = location,

    SRV_CAT = catalog

    from master.dbo.sysservers

    order by 1

    end

    ELSE

    begin

    select

    SRV_NAME = srvname,

    SRV_PROVIDERNAME = providername,

    SRV_PRODUCT = srvproduct,

    SRV_DATASOURCE = datasource,

    SRV_PROVIDERSTRING = NULL,

    SRV_LOCATION = location,

    SRV_CAT = catalog

    from master.dbo.sysservers

    order by 1

    end

    go

    grant execute on sp_linkedservers to public

    go

    if object_id('sp_catalogs', 'P') is not null

    drop proc sp_catalogs

    go

    raiserror(15339,-1,-1,'sp_catalogs')

    go

    create procedure sp_catalogs(

    @server_name sysname)

    as

    select

    CATALOG_NAME,

    convert (nvarchar(255),DESCRIPTION)

    from master.dbo.SYSREMOTE_CATALOGS ( @server_name )

    order by CATALOG_NAME

    go

    grant execute on sp_catalogs to public

    go

    if object_id('sp_tables_ex', 'P') is not null

    drop proc sp_tables_ex

    go

    raiserror(15339,-1,-1,'sp_tables_ex')

    go

    create procedure sp_tables_ex(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @table_type sysname = null)

    as

    declare @table_catalog_param sysname

    if ((isnull(charindex('%', @table_catalog),0) = 0) and

    (isnull(charindex('[', @table_catalog),0) = 0) and

    (isnull(charindex('_', @table_catalog),0) = 0))

    select @table_catalog_param = @table_catalog

    else

    select @table_catalog_param = null

    if ((isnull(charindex('%', @table_name),0) = 0) and

    (isnull(charindex('[', @table_name),0) = 0) and

    (isnull(charindex('_', @table_name),0) = 0))

    begin /* If no wild carding */

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    TABLE_TYPE = TABLE_TYPE,

    REMARKS = convert(nvarchar(255),DESCRIPTION)

    from master.dbo.SYSREMOTE_TABLES (

    @table_server,

    @table_catalog_param,

    NULL,

    @table_name,

    NULL )

    where (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (TABLE_CATALOG like @table_catalog

    or @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))

    and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0

    or @table_type is NULL)

    order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME

    end

    else

    begin /* If wild carding */

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    TABLE_TYPE = TABLE_TYPE,

    REMARKS = convert(nvarchar(255),DESCRIPTION)

    from master.dbo.SYSREMOTE_TABLES (

    @table_server,

    @table_catalog_param,

    NULL,

    NULL,

    NULL )

    where (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (TABLE_CATALOG like @table_catalog

    or @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))

    and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0

    or @table_type is NULL)

    and TABLE_NAME like @table_name

    order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME

    end

    go

    grant execute on sp_tables_ex to public

    go

    if object_id('sp_columns_ex', 'P') is not null

    drop proc sp_columns_ex

    go

    /* 7.0 version */

    raiserror(15339,-1,-1,'sp_columns_ex')

    go

    create procedure sp_columns_ex(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @column_name sysname = null,

    @ODBCVer int = 2)

    as

    set nocount on

    declare

    @DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1), @DBCOLUMNFLAGS_ISLONG binary(1),

    @DBCOLUMNFLAGS_ISROWVER binary(2)

    select

    @DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10, @DBCOLUMNFLAGS_ISLONG = 0x80,

    @DBCOLUMNFLAGS_ISROWVER = 0x0200

    declare

    @DBTYPE_I2 smallint, @DBTYPE_I4 smallint,

    @DBTYPE_R4 smallint, @DBTYPE_R8 smallint,

    @DBTYPE_CY smallint, @DBTYPE_DATE smallint,

    @DBTYPE_BSTR smallint, @DBTYPE_BOOL smallint,

    @DBTYPE_VARNUMERIC smallint, @DBTYPE_DECIMAL smallint,

    @DBTYPE_UI1 smallint, @DBTYPE_BYREF smallint,

    @DBTYPE_I1 smallint, @DBTYPE_UI2 smallint,

    @DBTYPE_UI4 smallint, @DBTYPE_I8 smallint,

    @DBTYPE_UI8 smallint, @DBTYPE_GUID smallint,

    @DBTYPE_BYTES smallint, @DBTYPE_STR smallint,

    @DBTYPE_WSTR smallint, @DBTYPE_NUMERIC smallint,

    @DBTYPE_DBDATE smallint, @DBTYPE_DBTIME smallint,

    @DBTYPE_DBTIMESTAMP smallint

    select

    @DBTYPE_I2 = 2, @DBTYPE_I4 = 3,

    @DBTYPE_R4 = 4, @DBTYPE_R8 = 5,

    @DBTYPE_CY = 6, @DBTYPE_DATE = 7,

    @DBTYPE_BSTR = 8, @DBTYPE_BOOL = 11,

    @DBTYPE_VARNUMERIC = 139, @DBTYPE_DECIMAL = 14,

    @DBTYPE_UI1 = 17, @DBTYPE_BYREF = 16384,

    @DBTYPE_I1 = 16, @DBTYPE_UI2 = 18,

    @DBTYPE_UI4 = 19, @DBTYPE_I8 = 20,

    @DBTYPE_UI8 = 21, @DBTYPE_GUID = 72,

    @DBTYPE_BYTES = 128, @DBTYPE_STR = 129,

    @DBTYPE_WSTR = 130, @DBTYPE_NUMERIC = 131,

    @DBTYPE_DBDATE = 133, @DBTYPE_DBTIME = 134,

    @DBTYPE_DBTIMESTAMP = 135

    declare

    @ODS_SMALLINT_NOT_NULL tinyint, @ODS_INT_NULL tinyint,

    @ODS_INT_NOT_NULL tinyint, @ODS_TINYINT_NOT_NULL tinyint,

    @ODS_REAL_NOT_NULL tinyint, @ODS_FLOAT_NULL tinyint,

    @ODS_FLOAT_NOT_NULL tinyint, @ODS_MONEY_NULL tinyint,

    @ODS_MONEY_NOT_NULL tinyint, @ODS_DATETIME_NULL tinyint,

    @ODS_DATETIME_NOT_NULL tinyint, @ODS_TEXT tinyint,

    @ODS_BIT tinyint, @ODS_DECIMAL tinyint,

    @ODS_NUMERIC tinyint, @ODS_GUID tinyint,

    @ODS_IMAGE tinyint, @ODS_TIMESTAMP tinyint,

    @ODS_BINARY_NULL tinyint, @ODS_BINARY_NOT_NULL tinyint,

    @ODS_VARBINARY tinyint, @ODS_CHAR_NULL tinyint,

    @ODS_CHAR_NOT_NULL tinyint, @ODS_VARCHAR tinyint

    select

    @ODS_IMAGE = 34, @ODS_TEXT = 35,

    @ODS_GUID = 36, @ODS_BINARY_NULL = 37,

    @ODS_VARBINARY = 37, @ODS_INT_NULL = 38,

    @ODS_CHAR_NULL = 39, @ODS_VARCHAR = 39,

    @ODS_TIMESTAMP = 45, @ODS_BINARY_NOT_NULL = 45,

    @ODS_CHAR_NOT_NULL = 47, @ODS_TINYINT_NOT_NULL = 48,

    @ODS_BIT = 50, @ODS_SMALLINT_NOT_NULL = 52,

    @ODS_INT_NOT_NULL = 56, @ODS_REAL_NOT_NULL = 59,

    @ODS_MONEY_NOT_NULL = 60, @ODS_DATETIME_NOT_NULL = 61,

    @ODS_FLOAT_NOT_NULL = 62, @ODS_DECIMAL = 106,

    @ODS_NUMERIC = 108, @ODS_FLOAT_NULL = 109,

    @ODS_MONEY_NULL = 110, @ODS_DATETIME_NULL = 111

    declare

    @ODBC_GUID smallint, @ODBC_NTEXT smallint,

    @ODBC_NVARCHAR smallint, @ODBC_NCHAR smallint,

    @ODBC_BIT smallint, @ODBC_TINYINT smallint,

    @ODBC_IMAGE smallint, @ODBC_VARBINARY smallint,

    @ODBC_TIMESTAMP smallint, @ODBC_BINARY smallint,

    @ODBC_TEXT smallint, @ODBC_CHAR smallint,

    @ODBC_NUMERIC smallint, @ODBC_DECIMAL smallint,

    @ODBC_MONEY smallint, @ODBC_INT smallint,

    @ODBC_SMALLINT smallint, @ODBC_FLOAT smallint,

    @ODBC_REAL smallint, @ODBC_VARCHAR smallint,

    @ODBC_DATETIME smallint

    select

    @ODBC_GUID = -11, @ODBC_NTEXT = -10,

    @ODBC_NVARCHAR = -9, @ODBC_NCHAR = -8,

    @ODBC_BIT = -7, @ODBC_TINYINT = -6,

    @ODBC_IMAGE = -4, @ODBC_VARBINARY = -3,

    @ODBC_TIMESTAMP = -2, @ODBC_BINARY = -2,

    @ODBC_TEXT = -1, @ODBC_CHAR = 1,

    @ODBC_NUMERIC = 2, @ODBC_DECIMAL = 3,

    @ODBC_MONEY = 3, @ODBC_INT = 4,

    @ODBC_SMALLINT = 5, @ODBC_FLOAT = 6,

    @ODBC_REAL = 7, @ODBC_VARCHAR = 12,

    @ODBC_DATETIME =

    case @ODBCVer

    when 2 then 11

    else 93

    end

    create table #tmp_columns

    ( TABLE_CAT sysname NULL,

    TABLE_SCHEM sysname NULL,

    TABLE_NAME sysname NOT NULL,

    COLUMN_NAME sysname NULL,

    DATA_TYPE smallint NOT NULL,

    TYPE_NAME sysname NULL,

    COLUMN_SIZE int NULL,

    BUFFER_LENGTH int NULL,

    DECIMAL_DIGITS smallint NULL,

    NUM_PREC_RADIX smallint NULL,

    NULLABLE smallint NOT NULL,

    REMARKS nvarchar(255) NULL,

    COLUMN_DEF nvarchar(128) NULL,

    SQL_DATA_TYPE smallint null,

    SQL_DATETIME_SUB smallint NULL,

    CHAR_OCTET_LENGTH int NULL,

    ORDINAL_POSITION smallint,

    IS_NULLABLE varchar(254) NOT NULL,

    SS_DATA_TYPE tinyint null,

    COLUMN_FLAGS int NOT NULL)

    if ((isnull(charindex('%', @table_name),0) = 0) and

    (isnull(charindex('[', @table_name),0) = 0) and

    (isnull(charindex('_', @table_name),0) = 0))

    begin /* If no wild carding */

    insert into #tmp_columns

    select

    TABLE_CAT = c.TABLE_CATALOG,

    TABLE_SCHEM = c.TABLE_SCHEMA,

    TABLE_NAME = c.TABLE_NAME,

    COLUMN_NAME = c.COLUMN_NAME,

    DATA_TYPE =

    case c.DATA_TYPE & ~@DBTYPE_BYREF

    when @DBTYPE_I2 then @ODBC_SMALLINT

    when @DBTYPE_I4 then @ODBC_INT

    when @DBTYPE_R4 then @ODBC_REAL

    when @DBTYPE_R8 then @ODBC_FLOAT

    when @DBTYPE_CY then @ODBC_MONEY

    when @DBTYPE_DATE then @ODBC_DATETIME

    when @DBTYPE_DBDATE then @ODBC_DATETIME

    when @DBTYPE_DBTIME then @ODBC_DATETIME

    when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME

    when @DBTYPE_BOOL then @ODBC_BIT

    when @DBTYPE_DECIMAL then @ODBC_DECIMAL

    when @DBTYPE_UI1 then @ODBC_TINYINT

    when @DBTYPE_I1 then @ODBC_NUMERIC

    when @DBTYPE_UI2 then @ODBC_NUMERIC

    when @DBTYPE_UI4 then @ODBC_NUMERIC

    when @DBTYPE_I8 then @ODBC_NUMERIC

    when @DBTYPE_UI8 then @ODBC_NUMERIC

    when @DBTYPE_NUMERIC then @ODBC_NUMERIC

    when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC

    when @DBTYPE_GUID then @ODBC_GUID

    when @DBTYPE_BYTES then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    p.COLUMN_SIZE = 8

    then @ODBC_TIMESTAMP

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODBC_BINARY

    else @ODBC_VARBINARY

    end

    when @DBTYPE_STR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR

    else @ODBC_VARCHAR

    end

    when @DBTYPE_WSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    when @DBTYPE_BSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    else @ODBC_NVARCHAR /* Unknown OleDB datatype */

    end,

    TYPE_NAME = p.TYPE_NAME,

    COLUMN_SIZE =

    COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),

    BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,

    DECIMAL_DIGITS = c.NUMERIC_SCALE,

    NUM_PREC_RADIX = NULL,

    NULLABLE = convert(smallint, c.IS_NULLABLE),

    REMARKS = convert(nvarchar(255),c.DESCRIPTION),

    COLUMN_DEF = c.COLUMN_DEFAULT,

    SQL_DATA_TYPE = NULL,

    SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),

    CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,

    ORDINAL_POSITION = c.ORDINAL_POSITION,

    IS_NULLABLE =

    case c.IS_NULLABLE

    when 1 then 'YES'

    else 'NO'

    end,

    SS_DATA_TYPE = NULL,

    COLUMN_FLAGS = c.COLUMN_FLAGS

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    NULL,

    @table_name,

    NULL ) c,

    master.dbo.SYSREMOTE_PROVIDER_TYPES (

    @table_server ) p

    /* LUXOR/KAGERA don't support restricting DATA_TYPE */

    where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and

    (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (c.COLUMN_NAME like @column_name

    or @column_name is NULL)

    end

    else

    begin /* If wild carding */

    insert into #tmp_columns

    select

    TABLE_CAT = c.TABLE_CATALOG,

    TABLE_SCHEM = c.TABLE_SCHEMA,

    TABLE_NAME = c.TABLE_NAME,

    COLUMN_NAME = c.COLUMN_NAME,

    DATA_TYPE =

    case c.DATA_TYPE & ~@DBTYPE_BYREF

    when @DBTYPE_I2 then @ODBC_SMALLINT

    when @DBTYPE_I4 then @ODBC_INT

    when @DBTYPE_R4 then @ODBC_REAL

    when @DBTYPE_R8 then @ODBC_FLOAT

    when @DBTYPE_CY then @ODBC_MONEY

    when @DBTYPE_DATE then @ODBC_DATETIME

    when @DBTYPE_DBDATE then @ODBC_DATETIME

    when @DBTYPE_DBTIME then @ODBC_DATETIME

    when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME

    when @DBTYPE_BOOL then @ODBC_BIT

    when @DBTYPE_DECIMAL then @ODBC_DECIMAL

    when @DBTYPE_UI1 then @ODBC_TINYINT

    when @DBTYPE_I1 then @ODBC_NUMERIC

    when @DBTYPE_UI2 then @ODBC_NUMERIC

    when @DBTYPE_UI4 then @ODBC_NUMERIC

    when @DBTYPE_I8 then @ODBC_NUMERIC

    when @DBTYPE_UI8 then @ODBC_NUMERIC

    when @DBTYPE_NUMERIC then @ODBC_NUMERIC

    when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC

    when @DBTYPE_GUID then @ODBC_GUID

    when @DBTYPE_BYTES then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    p.COLUMN_SIZE = 8

    then @ODBC_TIMESTAMP

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODBC_BINARY

    else @ODBC_VARBINARY

    end

    when @DBTYPE_STR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR

    else @ODBC_VARCHAR

    end

    when @DBTYPE_WSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    when @DBTYPE_BSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    else @ODBC_NVARCHAR /* Unknown OleDB datatype */

    end,

    TYPE_NAME = p.TYPE_NAME,

    COLUMN_SIZE =

    COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),

    BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,

    DECIMAL_DIGITS = c.NUMERIC_SCALE,

    NUM_PREC_RADIX = NULL,

    NULLABLE = convert(smallint, c.IS_NULLABLE),

    REMARKS = convert(nvarchar(255),c.DESCRIPTION),

    COLUMN_DEF = c.COLUMN_DEFAULT,

    SQL_DATA_TYPE = NULL,

    SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),

    CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,

    ORDINAL_POSITION = c.ORDINAL_POSITION,

    IS_NULLABLE =

    case c.IS_NULLABLE

    when 1 then 'YES'

    else 'NO'

    end,

    SS_DATA_TYPE = NULL,

    COLUMN_FLAGS = c.COLUMN_FLAGS

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    NULL,

    NULL,

    NULL ) c,

    master.dbo.SYSREMOTE_PROVIDER_TYPES (

    @table_server ) p

    /* LUXOR/KAGERA don't support restricting DATA_TYPE */

    where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and

    (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (c.COLUMN_NAME like @column_name

    or @column_name is NULL)

    and c.TABLE_NAME like @table_name

    end

    update #tmp_columns

    set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,

    SQL_DATETIME_SUB =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3

    else #tmp_columns.SQL_DATETIME_SUB

    end,

    TYPE_NAME =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    BUFFER_LENGTH = 8

    then 'timestamp'

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and

    #tmp_columns.SQL_DATETIME_SUB = 0

    then 'smalldatetime'

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and

    #tmp_columns.COLUMN_SIZE = 10

    then 'smallmoney'

    when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or

    #tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)

    then spt_dt.TYPE_NAME

    else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME)

    end,

    COLUMN_SIZE =

    case

    when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */

    spt_dt.data_precision

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and

    #tmp_columns.SQL_DATETIME_SUB = 0

    then 16

    else #tmp_columns.COLUMN_SIZE

    end,

    BUFFER_LENGTH =

    case

    when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then /* decimal/numeric types */

    COLUMN_SIZE+2

    when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length

    else #tmp_columns.BUFFER_LENGTH

    end,

    DECIMAL_DIGITS =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME

    then #tmp_columns.SQL_DATETIME_SUB

    else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)

    end,

    NUM_PREC_RADIX = spt_dt.RADIX,

    SS_DATA_TYPE =

    case

    when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT )

    and #tmp_columns.NULLABLE = 1

    then @ODS_INT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0

    then @ODS_TINYINT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT and #tmp_columns.NULLABLE = 0

    then @ODS_SMALLINT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_INT and #tmp_columns.NULLABLE = 0

    then @ODS_INT_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1

    then @ODS_FLOAT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0

    then @ODS_REAL_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0

    then @ODS_FLOAT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1

    then @ODS_MONEY_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0

    then @ODS_MONEY_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1

    then @ODS_DATETIME_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0

    then @ODS_DATETIME_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT

    when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT

    when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then @ODS_DECIMAL

    when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then @ODS_NUMERIC

    when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID

    when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then @ODS_IMAGE

    when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    BUFFER_LENGTH = 8

    then @ODS_TIMESTAMP

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 1

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODS_BINARY_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 0

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODS_BINARY_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY

    then @ODS_VARBINARY

    when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1

    then @ODS_CHAR_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0

    then @ODS_CHAR_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR

    else null

    end

    from master.dbo.spt_datatype_info spt_dt

    where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE

    AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)

    and isnull(spt_dt.AUTO_INCREMENT,0) = 0

    and not spt_dt.TYPE_NAME = 'smalldatetime'

    select

    TABLE_CAT, TABLE_SCHEM, TABLE_NAME,

    COLUMN_NAME, DATA_TYPE, TYPE_NAME,

    COLUMN_SIZE, BUFFER_LENGTH, DECIMAL_DIGITS,

    NUM_PREC_RADIX, NULLABLE, REMARKS,

    COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE,

    SS_DATA_TYPE

    from #tmp_columns

    order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION

    drop table #tmp_columns

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_columns_ex

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    raiserror(15339,-1,-1,'sp_columns_ex')

    go

    create procedure sp_columns_ex(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @column_name sysname = null,

    @ODBCVer int = 2)

    as

    set nocount on

    declare

    @DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1), @DBCOLUMNFLAGS_ISLONG binary(1),

    @DBCOLUMNFLAGS_ISROWVER binary(2)

    select

    @DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10, @DBCOLUMNFLAGS_ISLONG = 0x80,

    @DBCOLUMNFLAGS_ISROWVER = 0x0200

    declare

    @DBTYPE_I2 smallint, @DBTYPE_I4 smallint,

    @DBTYPE_R4 smallint, @DBTYPE_R8 smallint,

    @DBTYPE_CY smallint, @DBTYPE_DATE smallint,

    @DBTYPE_BSTR smallint, @DBTYPE_BOOL smallint,

    @DBTYPE_VARNUMERIC smallint, @DBTYPE_DECIMAL smallint,

    @DBTYPE_UI1 smallint, @DBTYPE_BYREF smallint,

    @DBTYPE_I1 smallint, @DBTYPE_UI2 smallint,

    @DBTYPE_UI4 smallint, @DBTYPE_I8 smallint,

    @DBTYPE_UI8 smallint, @DBTYPE_GUID smallint,

    @DBTYPE_BYTES smallint, @DBTYPE_STR smallint,

    @DBTYPE_WSTR smallint, @DBTYPE_NUMERIC smallint,

    @DBTYPE_DBDATE smallint, @DBTYPE_DBTIME smallint,

    @DBTYPE_DBTIMESTAMP smallint

    select

    @DBTYPE_I2 = 2, @DBTYPE_I4 = 3,

    @DBTYPE_R4 = 4, @DBTYPE_R8 = 5,

    @DBTYPE_CY = 6, @DBTYPE_DATE = 7,

    @DBTYPE_BSTR = 8, @DBTYPE_BOOL = 11,

    @DBTYPE_VARNUMERIC = 139, @DBTYPE_DECIMAL = 14,

    @DBTYPE_UI1 = 17, @DBTYPE_BYREF = 16384,

    @DBTYPE_I1 = 16, @DBTYPE_UI2 = 18,

    @DBTYPE_UI4 = 19, @DBTYPE_I8 = 20,

    @DBTYPE_UI8 = 21, @DBTYPE_GUID = 72,

    @DBTYPE_BYTES = 128, @DBTYPE_STR = 129,

    @DBTYPE_WSTR = 130, @DBTYPE_NUMERIC = 131,

    @DBTYPE_DBDATE = 133, @DBTYPE_DBTIME = 134,

    @DBTYPE_DBTIMESTAMP = 135

    declare

    @ODS_SMALLINT_NOT_NULL tinyint, @ODS_INT_NULL tinyint,

    @ODS_INT_NOT_NULL tinyint, @ODS_TINYINT_NOT_NULL tinyint,

    @ODS_REAL_NOT_NULL tinyint, @ODS_FLOAT_NULL tinyint,

    @ODS_FLOAT_NOT_NULL tinyint, @ODS_MONEY_NULL tinyint,

    @ODS_MONEY_NOT_NULL tinyint, @ODS_DATETIME_NULL tinyint,

    @ODS_DATETIME_NOT_NULL tinyint, @ODS_TEXT tinyint,

    @ODS_BIT tinyint, @ODS_DECIMAL tinyint,

    @ODS_NUMERIC tinyint, @ODS_GUID tinyint,

    @ODS_IMAGE tinyint, @ODS_TIMESTAMP tinyint,

    @ODS_BINARY_NULL tinyint, @ODS_BINARY_NOT_NULL tinyint,

    @ODS_VARBINARY tinyint, @ODS_CHAR_NULL tinyint,

    @ODS_CHAR_NOT_NULL tinyint, @ODS_VARCHAR tinyint

    select

    @ODS_IMAGE = 34, @ODS_TEXT = 35,

    @ODS_GUID = 36, @ODS_BINARY_NULL = 37,

    @ODS_VARBINARY = 37, @ODS_INT_NULL = 38,

    @ODS_CHAR_NULL = 39, @ODS_VARCHAR = 39,

    @ODS_TIMESTAMP = 45, @ODS_BINARY_NOT_NULL = 45,

    @ODS_CHAR_NOT_NULL = 47, @ODS_TINYINT_NOT_NULL = 48,

    @ODS_BIT = 50, @ODS_SMALLINT_NOT_NULL = 52,

    @ODS_INT_NOT_NULL = 56, @ODS_REAL_NOT_NULL = 59,

    @ODS_MONEY_NOT_NULL = 60, @ODS_DATETIME_NOT_NULL = 61,

    @ODS_FLOAT_NOT_NULL = 62, @ODS_DECIMAL = 106,

    @ODS_NUMERIC = 108, @ODS_FLOAT_NULL = 109,

    @ODS_MONEY_NULL = 110, @ODS_DATETIME_NULL = 111

    declare

    @ODBC_GUID smallint, @ODBC_NTEXT smallint,

    @ODBC_NVARCHAR smallint, @ODBC_NCHAR smallint,

    @ODBC_BIT smallint, @ODBC_TINYINT smallint,

    @ODBC_IMAGE smallint, @ODBC_VARBINARY smallint,

    @ODBC_TIMESTAMP smallint, @ODBC_BINARY smallint,

    @ODBC_TEXT smallint, @ODBC_CHAR smallint,

    @ODBC_NUMERIC smallint, @ODBC_DECIMAL smallint,

    @ODBC_MONEY smallint, @ODBC_INT smallint,

    @ODBC_SMALLINT smallint, @ODBC_FLOAT smallint,

    @ODBC_REAL smallint, @ODBC_VARCHAR smallint,

    @ODBC_DATETIME smallint

    select

    @ODBC_GUID = -11, @ODBC_NTEXT = -10,

    @ODBC_NVARCHAR = -9, @ODBC_NCHAR = -8,

    @ODBC_BIT = -7, @ODBC_TINYINT = -6,

    @ODBC_IMAGE = -4, @ODBC_VARBINARY = -3,

    @ODBC_TIMESTAMP = -2, @ODBC_BINARY = -2,

    @ODBC_TEXT = -1, @ODBC_CHAR = 1,

    @ODBC_NUMERIC = 2, @ODBC_DECIMAL = 3,

    @ODBC_MONEY = 3, @ODBC_INT = 4,

    @ODBC_SMALLINT = 5, @ODBC_FLOAT = 6,

    @ODBC_REAL = 7, @ODBC_VARCHAR = 12,

    @ODBC_DATETIME =

    case @ODBCVer

    when 2 then 11

    else 93

    end

    create table #tmp_columns

    ( TABLE_CAT sysname collate database_default NULL,

    TABLE_SCHEM sysname collate database_default NULL,

    TABLE_NAME sysname collate database_default NOT NULL,

    COLUMN_NAME sysname collate database_default NULL,

    DATA_TYPE smallint NOT NULL,

    TYPE_NAME sysname collate database_default NULL,

    COLUMN_SIZE int NULL,

    BUFFER_LENGTH int NULL,

    DECIMAL_DIGITS smallint NULL,

    NUM_PREC_RADIX smallint NULL,

    NULLABLE smallint NOT NULL,

    REMARKS nvarchar(255) collate database_default NULL,

    COLUMN_DEF nvarchar(128) collate database_default NULL,

    SQL_DATA_TYPE smallint null,

    SQL_DATETIME_SUB smallint NULL,

    CHAR_OCTET_LENGTH int NULL,

    ORDINAL_POSITION smallint,

    IS_NULLABLE varchar(254) collate database_default NOT NULL,

    SS_DATA_TYPE tinyint null,

    COLUMN_FLAGS int NOT NULL)

    if ((isnull(charindex('%', @table_name),0) = 0) and

    (isnull(charindex('[', @table_name),0) = 0) and

    (isnull(charindex('_', @table_name),0) = 0))

    begin /* If no wild carding */

    insert into #tmp_columns

    select

    TABLE_CAT = c.TABLE_CATALOG,

    TABLE_SCHEM = c.TABLE_SCHEMA,

    TABLE_NAME = c.TABLE_NAME,

    COLUMN_NAME = c.COLUMN_NAME,

    DATA_TYPE =

    case c.DATA_TYPE & ~@DBTYPE_BYREF

    when @DBTYPE_I2 then @ODBC_SMALLINT

    when @DBTYPE_I4 then @ODBC_INT

    when @DBTYPE_R4 then @ODBC_REAL

    when @DBTYPE_R8 then @ODBC_FLOAT

    when @DBTYPE_CY then @ODBC_MONEY

    when @DBTYPE_DATE then @ODBC_DATETIME

    when @DBTYPE_DBDATE then @ODBC_DATETIME

    when @DBTYPE_DBTIME then @ODBC_DATETIME

    when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME

    when @DBTYPE_BOOL then @ODBC_BIT

    when @DBTYPE_DECIMAL then @ODBC_DECIMAL

    when @DBTYPE_UI1 then @ODBC_TINYINT

    when @DBTYPE_I1 then @ODBC_NUMERIC

    when @DBTYPE_UI2 then @ODBC_NUMERIC

    when @DBTYPE_UI4 then @ODBC_NUMERIC

    when @DBTYPE_I8 then @ODBC_NUMERIC

    when @DBTYPE_UI8 then @ODBC_NUMERIC

    when @DBTYPE_NUMERIC then @ODBC_NUMERIC

    when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC

    when @DBTYPE_GUID then @ODBC_GUID

    when @DBTYPE_BYTES then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    p.COLUMN_SIZE = 8

    then @ODBC_TIMESTAMP

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODBC_BINARY

    else @ODBC_VARBINARY

    end

    when @DBTYPE_STR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR

    else @ODBC_VARCHAR

    end

    when @DBTYPE_WSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    when @DBTYPE_BSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    else @ODBC_NVARCHAR /* Unknown OleDB datatype */

    end,

    TYPE_NAME = p.TYPE_NAME,

    COLUMN_SIZE =

    COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),

    BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,

    DECIMAL_DIGITS = c.NUMERIC_SCALE,

    NUM_PREC_RADIX = NULL,

    NULLABLE = convert(smallint, c.IS_NULLABLE),

    REMARKS = convert(nvarchar(255),c.DESCRIPTION),

    COLUMN_DEF = c.COLUMN_DEFAULT,

    SQL_DATA_TYPE = NULL,

    SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),

    CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,

    ORDINAL_POSITION = c.ORDINAL_POSITION,

    IS_NULLABLE =

    case c.IS_NULLABLE

    when 1 then 'YES'

    else 'NO'

    end,

    SS_DATA_TYPE = NULL,

    COLUMN_FLAGS = c.COLUMN_FLAGS

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    NULL,

    @table_name,

    NULL ) c,

    master.dbo.SYSREMOTE_PROVIDER_TYPES (

    @table_server ) p

    /* LUXOR/KAGERA don't support restricting DATA_TYPE */

    where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and

    (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (c.COLUMN_NAME like @column_name

    or @column_name is NULL)

    end

    else

    begin /* If wild carding */

    insert into #tmp_columns

    select

    TABLE_CAT = c.TABLE_CATALOG,

    TABLE_SCHEM = c.TABLE_SCHEMA,

    TABLE_NAME = c.TABLE_NAME,

    COLUMN_NAME = c.COLUMN_NAME,

    DATA_TYPE =

    case c.DATA_TYPE & ~@DBTYPE_BYREF

    when @DBTYPE_I2 then @ODBC_SMALLINT

    when @DBTYPE_I4 then @ODBC_INT

    when @DBTYPE_R4 then @ODBC_REAL

    when @DBTYPE_R8 then @ODBC_FLOAT

    when @DBTYPE_CY then @ODBC_MONEY

    when @DBTYPE_DATE then @ODBC_DATETIME

    when @DBTYPE_DBDATE then @ODBC_DATETIME

    when @DBTYPE_DBTIME then @ODBC_DATETIME

    when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME

    when @DBTYPE_BOOL then @ODBC_BIT

    when @DBTYPE_DECIMAL then @ODBC_DECIMAL

    when @DBTYPE_UI1 then @ODBC_TINYINT

    when @DBTYPE_I1 then @ODBC_NUMERIC

    when @DBTYPE_UI2 then @ODBC_NUMERIC

    when @DBTYPE_UI4 then @ODBC_NUMERIC

    when @DBTYPE_I8 then @ODBC_NUMERIC

    when @DBTYPE_UI8 then @ODBC_NUMERIC

    when @DBTYPE_NUMERIC then @ODBC_NUMERIC

    when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC

    when @DBTYPE_GUID then @ODBC_GUID

    when @DBTYPE_BYTES then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    p.COLUMN_SIZE = 8

    then @ODBC_TIMESTAMP

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODBC_BINARY

    else @ODBC_VARBINARY

    end

    when @DBTYPE_STR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR

    else @ODBC_VARCHAR

    end

    when @DBTYPE_WSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    when @DBTYPE_BSTR then

    case

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT

    when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR

    else @ODBC_NVARCHAR

    end

    else @ODBC_NVARCHAR /* Unknown OleDB datatype */

    end,

    TYPE_NAME = p.TYPE_NAME,

    COLUMN_SIZE =

    COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),

    BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,

    DECIMAL_DIGITS = c.NUMERIC_SCALE,

    NUM_PREC_RADIX = NULL,

    NULLABLE = convert(smallint, c.IS_NULLABLE),

    REMARKS = convert(nvarchar(255),c.DESCRIPTION),

    COLUMN_DEF = c.COLUMN_DEFAULT,

    SQL_DATA_TYPE = NULL,

    SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),

    CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,

    ORDINAL_POSITION = c.ORDINAL_POSITION,

    IS_NULLABLE =

    case c.IS_NULLABLE

    when 1 then 'YES'

    else 'NO'

    end,

    SS_DATA_TYPE = NULL,

    COLUMN_FLAGS = c.COLUMN_FLAGS

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    NULL,

    NULL,

    NULL ) c,

    master.dbo.SYSREMOTE_PROVIDER_TYPES (

    @table_server ) p

    /* LUXOR/KAGERA don't support restricting DATA_TYPE */

    where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and

    (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (c.COLUMN_NAME like @column_name

    or @column_name is NULL)

    and c.TABLE_NAME like @table_name

    end

    update #tmp_columns

    set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,

    SQL_DATETIME_SUB =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3

    else #tmp_columns.SQL_DATETIME_SUB

    end,

    TYPE_NAME =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    BUFFER_LENGTH = 8

    then 'timestamp'

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and

    #tmp_columns.SQL_DATETIME_SUB = 0

    then 'smalldatetime'

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and

    #tmp_columns.COLUMN_SIZE = 10

    then 'smallmoney'

    when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or

    #tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)

    then spt_dt.TYPE_NAME collate database_default

    else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME collate database_default)

    end,

    COLUMN_SIZE =

    case

    when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */

    spt_dt.data_precision

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and

    #tmp_columns.SQL_DATETIME_SUB = 0

    then 16

    else #tmp_columns.COLUMN_SIZE

    end,

    BUFFER_LENGTH =

    case

    when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then /* decimal/numeric types */

    COLUMN_SIZE+2

    when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length

    else #tmp_columns.BUFFER_LENGTH

    end,

    DECIMAL_DIGITS =

    case

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME

    then #tmp_columns.SQL_DATETIME_SUB

    else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)

    end,

    NUM_PREC_RADIX = spt_dt.RADIX,

    SS_DATA_TYPE =

    case

    when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT )

    and #tmp_columns.NULLABLE = 1

    then @ODS_INT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0

    then @ODS_TINYINT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT and #tmp_columns.NULLABLE = 0

    then @ODS_SMALLINT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_INT and #tmp_columns.NULLABLE = 0

    then @ODS_INT_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1

    then @ODS_FLOAT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0

    then @ODS_REAL_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0

    then @ODS_FLOAT_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1

    then @ODS_MONEY_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0

    then @ODS_MONEY_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1

    then @ODS_DATETIME_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0

    then @ODS_DATETIME_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT

    when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT

    when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then @ODS_DECIMAL

    when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then @ODS_NUMERIC

    when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID

    when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then @ODS_IMAGE

    when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND

    (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and

    BUFFER_LENGTH = 8

    then @ODS_TIMESTAMP

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 1

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODS_BINARY_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 0

    and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)

    then @ODS_BINARY_NOT_NULL

    when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY

    then @ODS_VARBINARY

    when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1

    then @ODS_CHAR_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0

    then @ODS_CHAR_NOT_NULL

    when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR

    else null

    end

    from master.dbo.spt_datatype_info spt_dt

    where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE

    AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)

    and isnull(spt_dt.AUTO_INCREMENT,0) = 0

    and not spt_dt.TYPE_NAME = 'smalldatetime'

    select

    TABLE_CAT, TABLE_SCHEM, TABLE_NAME,

    COLUMN_NAME, DATA_TYPE, TYPE_NAME,

    COLUMN_SIZE, BUFFER_LENGTH, DECIMAL_DIGITS,

    NUM_PREC_RADIX, NULLABLE, REMARKS,

    COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB,

    CHAR_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE,

    SS_DATA_TYPE

    from #tmp_columns

    order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION

    drop table #tmp_columns

    go

    grant execute on sp_columns_ex to public

    go

    if object_id('sp_table_privileges_ex', 'P') is not null

    drop proc sp_table_privileges_ex

    go

    raiserror(15339,-1,-1,'sp_table_privileges_ex')

    go

    create procedure sp_table_privileges_ex(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null)

    as

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    GRANTOR = GRANTOR,

    GRANTEE = GRANTEE,

    PRIVILEGE = PRIVILEGE_TYPE,

    IS_GRANTABLE =

    case IS_GRANTABLE

    when 1 then 'YES'

    when 0 then 'NO'

    else null

    end

    from master.dbo.SYSREMOTE_TABLE_PRIVILEGES (

    @table_server,

    @table_catalog,

    NULL,

    NULL )

    where (TABLE_SCHEMA like @table_schema

    or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))

    and (TABLE_NAME like @table_name

    or @table_name is NULL)

    order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, PRIVILEGE

    go

    grant execute on sp_table_privileges_ex to public

    go

    if object_id('sp_column_privileges_ex', 'P') is not null

    drop proc sp_column_privileges_ex

    go

    raiserror(15339,-1,-1,'sp_column_privileges_ex')

    go

    create procedure sp_column_privileges_ex(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @column_name sysname = null)

    as

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    COLUMN_NAME = COLUMN_NAME,

    GRANTOR = GRANTOR,

    GRANTEE = GRANTEE,

    PRIVILEGE = PRIVILEGE_TYPE,

    IS_GRANTABLE =

    case IS_GRANTABLE

    when 1 then 'YES'

    when 0 then 'NO'

    else null

    end

    from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    NULL )

    where (COLUMN_NAME like @column_name

    or @column_name is NULL)

    order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE

    go

    grant execute on sp_column_privileges_ex to public

    go

    if object_id('sp_indexes', 'P') is not null

    drop proc sp_indexes

    go

    raiserror(15339,-1,-1,'sp_indexes')

    go

    create procedure sp_indexes(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @index_name sysname = null,

    @is_unique bit = null)

    as

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    NON_UNIQUE = convert(smallint, 1 - [UNIQUE]),

    INDEX_QUALIFIER = TABLE_NAME,

    INDEX_NAME = INDEX_NAME,

    TYPE =

    case [CLUSTERED]

    when 1 then 1

    else 3

    end,

    ORDINAL_POSITION = ORDINAL_POSITION,

    COLUMN_NAME = COLUMN_NAME,

    ASC_OR_DESC =

    case [COLLATION]

    when 1 then 'A'

    when 2 then 'D'

    else null

    end,

    CARDINALITY = CARDINALITY,

    PAGES =

    case [CLUSTERED]

    when 1 then PAGES

    else NULL

    end,

    FILTER_CONDITION = FILTER_CONDITION

    from master.dbo.SYSREMOTE_INDEXES (

    @table_server,

    @table_catalog,

    @table_schema,

    @index_name,

    NULL, /* TYPE (index type) */

    @table_name )

    where @is_unique is null or @is_unique = [UNIQUE]

    order by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME, ORDINAL_POSITION

    go

    grant execute on sp_indexes to public

    go

    if object_id('sp_foreignkeys', 'P') is not null

    drop proc sp_foreignkeys

    go

    raiserror(15339,-1,-1,'sp_foreignkeys')

    go

    create procedure sp_foreignkeys(

    @table_server sysname,

    @pktab_name sysname = null,

    @pktab_schema sysname = null,

    @pktab_catalog sysname = null,

    @fktab_name sysname = null,

    @fktab_schema sysname = null,

    @fktab_catalog sysname = null)

    as

    select

    PKTABLE_CAT = PK_TABLE_CATALOG,

    PKTABLE_SCHEM = PK_TABLE_SCHEMA,

    PKTABLE_NAME = PK_TABLE_NAME,

    PKCOLUMN_NAME = PK_COLUMN_NAME,

    FKTABLE_CAT = FK_TABLE_CATALOG,

    FKTABLE_SCHEM = FK_TABLE_SCHEMA,

    FKTABLE_NAME = FK_TABLE_NAME,

    FKCOLUMN_NAME = FK_COLUMN_NAME,

    KEY_SEQ = ORDINAL,

    UPDATE_RULE =

    case UPDATE_RULE

    when 'CASCADE' then 0

    when 'NO ACTION' then 1

    when 'SET NULL' then 2

    else null

    end,

    DELETE_RULE =

    case DELETE_RULE

    when 'CASCADE' then 0

    when 'NO ACTION' then 1

    when 'SET NULL' then 2

    else null

    end,

    FK_NAME = convert(sysname, NULL),

    PK_NAME = convert(sysname, NULL),

    DEFERRABILITY = convert(smallint, null)

    from master.dbo.SYSREMOTE_FOREIGN_KEYS (

    @table_server,

    @pktab_catalog,

    @pktab_schema,

    @pktab_name,

    @fktab_catalog,

    @fktab_schema,

    @fktab_name )

    order by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, KEY_SEQ

    go

    grant execute on sp_foreignkeys to public

    go

    if object_id('sp_primarykeys', 'P') is not null

    drop proc sp_primarykeys

    go

    raiserror(15339,-1,-1,'sp_primarykeys')

    go

    create procedure sp_primarykeys(

    @table_server sysname,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_catalog sysname = null)

    as

    select

    TABLE_CAT = TABLE_CATALOG,

    TABLE_SCHEM = TABLE_SCHEMA,

    TABLE_NAME = TABLE_NAME,

    COLUMN_NAME = COLUMN_NAME,

    KEY_SEQ = ORDINAL,

    PK_NAME = convert(sysname, NULL)

    from master.dbo.SYSREMOTE_PRIMARY_KEYS (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name )

    order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, KEY_SEQ

    go

    grant execute on sp_primarykeys to public

    go

    /*-------------- END CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/

    dump tran master with no_log

    go

    if (charindex('6.50', @@version) = 0 and

    charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 6.50 SQL Server.'

    print 'Ignore the following errors.'

    end

    print 'creating sp_ddopen'

    go

    /* Procedure for pre-6.50 server */

    create procedure sp_ddopen(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 varchar(255) = null,

    @p2 varchar(255) = null,

    @p3 varchar(255) = null,

    @p4 varchar(255) = null,

    @p5 varchar(255) = null,

    @p6 varchar(255) = null,

    @p7 int = null,

    @ODBCVer int = 2)

    as

    set nocount on

    declare @ret int

    if @procname = 'sp_column_privileges'

    begin

    create table #spcolpriv (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) not null,

    COLUMN_NAME varchar(32) not null,

    GRANTOR varchar(32) null,

    GRANTEE varchar(32) not null,

    PRIVILEGE varchar(32) not null,

    IS_GRANTABLE varchar(3) null

    )

    insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolpriv

    end

    else if @procname = 'sp_columns'

    begin

    create table #spcolumns (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) not null,

    COLUMN_NAME varchar(32) not null,

    DATA_TYPE smallint not null,

    TYPE_NAME varchar(32) not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) null,

    COLUMN_DEF varchar(255) null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) null,

    SS_DATA_TYPE tinyint null

    )

    insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolumns',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolumns

    end

    else if @procname = 'sp_datatype_info'

    begin

    create table #spdatatypeinfo (

    TYPE_NAME varchar(32) not null,

    DATA_TYPE smallint not null,

    "PRECISION" int null,

    LITERAL_PREFIX varchar(32) null,

    LITERAL_SUFFIX varchar(32) null,

    CREATE_PARAMS varchar(32) null,

    NULLABLE smallint not null,

    CASE_SENSITIVE smallint not null,

    SEARCHABLE smallint not null,

    UNSIGNED_ATTRIBUTE smallint null,

    MONEY smallint not null,

    AUTO_INCREMENT smallint null,

    LOCAL_TYPE_NAME varchar(32) null,

    MINIMUM_SCALE smallint null,

    MAXIMUM_SCALE smallint null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    NUM_PREC_RADIX int null,

    INTERVAL_PRECISION smallint NULL,

    USERTYPE smallint not null)

    insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spdatatypeinfo',

    @scrollopt output, @ccopt output, @rows output

    drop table #spdatatypeinfo

    end

    else if @procname = 'sp_fkeys'

    begin

    create table #spfkeys (

    PKTABLE_QUALIFIER varchar(32) null,

    PKTABLE_OWNER varchar(32) null,

    PKTABLE_NAME varchar(32) not null,

    PKCOLUMN_NAME varchar(32) not null,

    FKTABLE_QUALIFIER varchar(32) null,

    FKTABLE_OWNER varchar(32) null,

    FKTABLE_NAME varchar(32) not null,

    FKCOLUMN_NAME varchar(32) not null,

    KEY_SEQ smallint not null,

    UPDATE_RULE smallint null,

    DELETE_RULE smallint null,

    FK_NAME varchar(32) null,

    PK_NAME varchar(32) null,

    DEFERRABILITY smallint null

    )

    insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spfkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #spfkeys

    end

    else if @procname = 'sp_pkeys'

    begin

    create table #sppkeys (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) not null,

    COLUMN_NAME varchar(32) not null,

    KEY_SEQ smallint not null,

    PK_NAME varchar(32) null

    )

    insert into #sppkeys exec sp_pkeys @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sppkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #sppkeys

    end

    else if @procname = 'sp_special_columns'

    begin

    create table #spspeccol (

    SCOPE smallint null,

    COLUMN_NAME varchar(32) not null,

    DATA_TYPE smallint not null,

    TYPE_NAME varchar(32) not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    PSEUDO_COLUMN smallint null

    )

    insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spspeccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spspeccol

    end

    else if @procname = 'sp_sproc_columns'

    begin

    create table #spproccol (

    PROCEDURE_QUALIFIER varchar(32) null,

    PROCEDURE_OWNER varchar(32) null,

    PROCEDURE_NAME varchar(32) not null,

    COLUMN_NAME varchar(32) not null,

    COLUMN_TYPE smallint not null,

    DATA_TYPE smallint not null,

    TYPE_NAME varchar(32) not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) null,

    COLUMN_DEF varchar(255) null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) null,

    SS_DATA_TYPE tinyint null

    )

    insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spproccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spproccol

    end

    else if @procname = 'sp_statistics'

    begin

    create table #spstatistics (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) not null,

    NON_UNIQUE smallint null,

    INDEX_QUALIFIER varchar(32) null,

    INDEX_NAME varchar(32) null,

    TYPE smallint not null,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME varchar(32) null,

    COLLATION char(1) null,

    CARDINALITY int null,

    PAGES int null,

    FILTER_CONDITION varchar(128) null

    )

    insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spstatistics',

    @scrollopt output, @ccopt output, @rows output

    drop table #spstatistics

    end

    else if @procname = 'sp_stored_procedures'

    begin

    create table #spprocedures (

    PROCEDURE_QUALIFIER varchar(32) null,

    PROCEDURE_OWNER varchar(32) null,

    PROCEDURE_NAME varchar(32) not null,

    NUM_INPUT_PARAMS int null,

    NUM_OUTPUT_PARAMS int null,

    NUM_RESULT_SETS int null,

    REMARKS varchar(254) null,

    PROCEDURE_TYPE smallint null

    )

    insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #spprocedures',

    @scrollopt output, @ccopt output, @rows output

    drop table #spprocedures

    end

    else if @procname = 'sp_table_privileges'

    begin

    create table #sptabpriv (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) not null,

    GRANTOR varchar(32) null,

    GRANTEE varchar(32) not null,

    PRIVILEGE varchar(32) not null,

    IS_GRANTABLE varchar(3) null

    )

    insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptabpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptabpriv

    end

    else if @procname = 'sp_tables'

    begin

    create table #sptables (

    TABLE_QUALIFIER varchar(32) null,

    TABLE_OWNER varchar(32) null,

    TABLE_NAME varchar(32) null,

    TABLE_TYPE varchar(32) null,

    REMARKS varchar(254) null)

    insert into #sptables exec sp_tables @p1,@p2,@p3,@p4

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptables',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptables

    end

    else

    print 'Unknown sp_ddopen procedure'

    select @ret = isnull(@ret,0)

    return isnull(@ret,0)

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_ddopen

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 server */

    create procedure sp_ddopen;1(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774) = null,

    @p2 nvarchar(774) = null,

    @p3 nvarchar(774) = null,

    @p4 nvarchar(774) = null,

    @p5 nvarchar(774) = null,

    @p6 nvarchar(774) = null,

    @p7 int = null,

    @ODBCVer int = 2)

    as

    set nocount on

    declare @ret int

    if @procname = 'sp_column_privileges'

    begin

    exec @ret = sp_ddopen;2 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4

    end

    else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'

    begin

    exec @ret = sp_ddopen;3 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @ODBCVer

    end

    else if @procname = 'sp_datatype_info'

    begin

    exec @ret = sp_ddopen;4 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p7,

    @ODBCVer

    end

    else if @procname = 'sp_fkeys'

    begin

    exec @ret = sp_ddopen;5 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6

    end

    else if @procname = 'sp_pkeys'

    begin

    exec @ret = sp_ddopen;6 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_special_columns'

    begin

    exec @ret = sp_ddopen;7 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6,

    @ODBCVer

    end

    else if @procname = 'sp_sproc_columns'

    begin

    exec @ret = sp_ddopen;8 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @ODBCVer

    end

    else if @procname = 'sp_statistics'

    begin

    exec @ret = sp_ddopen;9 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6

    end

    else if @procname = 'sp_stored_procedures'

    begin

    exec @ret = sp_ddopen;10 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_table_privileges'

    begin

    exec @ret = sp_ddopen;11 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'

    begin

    exec @ret = sp_ddopen;12 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5

    end

    else if @procname = 'sp_tableswc'

    begin

    exec @ret = sp_ddopen;13 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4

    end

    else

    print 'Unknown sp_ddopen procedure'

    select @ret = isnull(@ret,0)

    return isnull(@ret,0)

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;2(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spcolpriv (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname not null,

    COLUMN_NAME sysname not null,

    GRANTOR sysname null,

    GRANTEE sysname not null,

    PRIVILEGE varchar(32) not null,

    IS_GRANTABLE varchar(3) null

    )

    insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolpriv

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;3(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spcolumns (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname not null,

    COLUMN_NAME sysname not null,

    DATA_TYPE smallint not null,

    TYPE_NAME sysname not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) null,

    COLUMN_DEF nvarchar(3000) null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) null,

    SS_DATA_TYPE tinyint null

    )

    if @procname = 'sp_columns'

    begin

    insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer

    end

    else

    begin

    insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer

    end

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolumns',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolumns

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;4(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p7 int,

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spdatatypeinfo (

    TYPE_NAME sysname not null,

    DATA_TYPE smallint not null,

    "PRECISION" int null,

    LITERAL_PREFIX varchar(32) null,

    LITERAL_SUFFIX varchar(32) null,

    CREATE_PARAMS varchar(32) null,

    NULLABLE smallint not null,

    CASE_SENSITIVE smallint not null,

    SEARCHABLE smallint not null,

    UNSIGNED_ATTRIBUTE smallint null,

    MONEY smallint not null,

    AUTO_INCREMENT smallint null,

    LOCAL_TYPE_NAME sysname null,

    MINIMUM_SCALE smallint null,

    MAXIMUM_SCALE smallint null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    NUM_PREC_RADIX int null,

    INTERVAL_PRECISION smallint NULL,

    USERTYPE smallint not null)

    insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spdatatypeinfo',

    @scrollopt output, @ccopt output, @rows output

    drop table #spdatatypeinfo

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;5(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spfkeys (

    PKTABLE_QUALIFIER sysname null,

    PKTABLE_OWNER sysname null,

    PKTABLE_NAME sysname not null,

    PKCOLUMN_NAME sysname not null,

    FKTABLE_QUALIFIER sysname null,

    FKTABLE_OWNER sysname null,

    FKTABLE_NAME sysname not null,

    FKCOLUMN_NAME sysname not null,

    KEY_SEQ smallint not null,

    UPDATE_RULE smallint null,

    DELETE_RULE smallint null,

    FK_NAME sysname null,

    PK_NAME sysname null,

    DEFERRABILITY smallint null

    )

    insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spfkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #spfkeys

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;6(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sppkeys (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname not null,

    COLUMN_NAME sysname not null,

    KEY_SEQ smallint not null,

    PK_NAME sysname null

    )

    insert into #sppkeys exec sp_pkeys @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sppkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #sppkeys

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;7(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spspeccol (

    SCOPE smallint null,

    COLUMN_NAME sysname not null,

    DATA_TYPE smallint not null,

    TYPE_NAME sysname not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    PSEUDO_COLUMN smallint null

    )

    insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spspeccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spspeccol

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;8(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spproccol (

    PROCEDURE_QUALIFIER sysname null,

    PROCEDURE_OWNER sysname null,

    PROCEDURE_NAME sysname not null,

    COLUMN_NAME sysname not null,

    COLUMN_TYPE smallint not null,

    DATA_TYPE smallint not null,

    TYPE_NAME sysname not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) null,

    COLUMN_DEF nvarchar(3000) null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) null,

    SS_DATA_TYPE tinyint null

    )

    insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spproccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spproccol

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;9(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spstatistics (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname not null,

    NON_UNIQUE smallint null,

    INDEX_QUALIFIER sysname null,

    INDEX_NAME sysname null,

    TYPE smallint not null,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME sysname null,

    COLLATION char(1) null,

    CARDINALITY int null,

    PAGES int null,

    FILTER_CONDITION varchar(128) null

    )

    insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spstatistics',

    @scrollopt output, @ccopt output, @rows output

    drop table #spstatistics

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;10(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spprocedures (

    PROCEDURE_QUALIFIER sysname null,

    PROCEDURE_OWNER sysname null,

    PROCEDURE_NAME nvarchar(134) not null, /*134=sysname+';'+ltrim(str(c.number,5))*/

    NUM_INPUT_PARAMS int null,

    NUM_OUTPUT_PARAMS int null,

    NUM_RESULT_SETS int null,

    REMARKS varchar(254) null,

    PROCEDURE_TYPE smallint null

    )

    insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #spprocedures',

    @scrollopt output, @ccopt output, @rows output

    drop table #spprocedures

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;11(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sptabpriv (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname not null,

    GRANTOR sysname null,

    GRANTEE sysname not null,

    PRIVILEGE varchar(32) not null,

    IS_GRANTABLE varchar(3) null

    )

    insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptabpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptabpriv

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;12(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sptables (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname null,

    TABLE_TYPE varchar(32) null,

    REMARKS varchar(254) null)

    if @procname = 'sp_tables'

    begin

    insert into #sptables exec sp_tables @p1,@p2,@p3,@p4

    end

    else

    begin

    insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5

    end

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptables',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptables

    return @ret

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;13(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774), -- @table_name

    @p2 nvarchar(774), -- @table_owner

    @p3 nvarchar(774), -- @table_qualifier

    @p4 nvarchar(774)) -- @table_type

    as

    -- this code was copied from sp_tableswc (for 7,0). Any changes

    -- made here need to be evaluated for porting to sp_tableswc.

    set nocount on

    declare @ret int

    declare @databasename sysname

    declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */

    create table #sptables (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname null,

    TABLE_TYPE varchar(32) null,

    REMARKS varchar(254) null)

    declare databases CURSOR FOR

    select name from master..sysdatabases

    where name like @p3 and name <> 'model' and has_dbaccess(name)=1

    for read only

    open databases

    fetch next from databases into @databasename

    while (@@FETCH_STATUS <> -1)

    begin

    if (charindex('%', @databasename) = 0)

    begin /* skip dbnames w/wildcard characters to prevent loop */

    select @qualprocname = @databasename + '..sp_tables'

    insert into #sptables exec @qualprocname

    @p1, @p2, @databasename, @p3

    end

    fetch next from databases into @databasename

    end

    deallocate databases

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptables',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptables

    return @ret

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_ddopen

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_ddopen;1(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774) = null,

    @p2 nvarchar(774) = null,

    @p3 nvarchar(774) = null,

    @p4 nvarchar(774) = null,

    @p5 nvarchar(774) = null,

    @p6 nvarchar(774) = null,

    @p7 int = null,

    @ODBCVer int = 2)

    as

    set nocount on

    declare @ret int

    if @procname = 'sp_column_privileges'

    begin

    exec @ret = sp_ddopen;2 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4

    end

    else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'

    begin

    exec @ret = sp_ddopen;3 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @ODBCVer

    end

    else if @procname = 'sp_datatype_info'

    begin

    exec @ret = sp_ddopen;4 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p7,

    @ODBCVer

    end

    else if @procname = 'sp_fkeys'

    begin

    exec @ret = sp_ddopen;5 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6

    end

    else if @procname = 'sp_pkeys'

    begin

    exec @ret = sp_ddopen;6 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_special_columns'

    begin

    exec @ret = sp_ddopen;7 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6,

    @ODBCVer

    end

    else if @procname = 'sp_sproc_columns'

    begin

    exec @ret = sp_ddopen;8 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @ODBCVer

    end

    else if @procname = 'sp_statistics'

    begin

    exec @ret = sp_ddopen;9 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5,

    @p6

    end

    else if @procname = 'sp_stored_procedures'

    begin

    exec @ret = sp_ddopen;10 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_table_privileges'

    begin

    exec @ret = sp_ddopen;11 @handle output,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3

    end

    else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'

    begin

    exec @ret = sp_ddopen;12 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4,

    @p5

    end

    else if @procname = 'sp_tableswc'

    begin

    exec @ret = sp_ddopen;13 @handle output,

    @procname,

    @scrollopt output,

    @ccopt output,

    @rows output,

    @p1,

    @p2,

    @p3,

    @p4

    end

    else

    print 'Unknown sp_ddopen procedure'

    select @ret = isnull(@ret,0)

    return isnull(@ret,0)

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;2(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spcolpriv (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default not null,

    COLUMN_NAME sysname collate database_default not null,

    GRANTOR sysname collate database_default null,

    GRANTEE sysname collate database_default not null,

    PRIVILEGE varchar(32) collate database_default not null,

    IS_GRANTABLE varchar(3) collate database_default null

    )

    insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolpriv

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;3(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spcolumns (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default not null,

    COLUMN_NAME sysname collate database_default not null,

    DATA_TYPE smallint not null,

    TYPE_NAME sysname collate database_default not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) collate database_default null,

    COLUMN_DEF nvarchar(3000) collate database_default null,

    SQL_DATA_TYPE smallint null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) collate database_default null,

    SS_DATA_TYPE tinyint null

    )

    if @procname = 'sp_columns'

    begin

    insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer

    end

    else

    begin

    insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer

    end

    exec @ret = sp_cursoropen @handle output,

    'select * from #spcolumns',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcolumns

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;4(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p7 int,

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spdatatypeinfo (

    TYPE_NAME sysname collate database_default not null,

    DATA_TYPE smallint not null,

    "PRECISION" int null,

    LITERAL_PREFIX varchar(32) collate database_default null,

    LITERAL_SUFFIX varchar(32) collate database_default null,

    CREATE_PARAMS varchar(32) collate database_default null,

    NULLABLE smallint not null,

    CASE_SENSITIVE smallint not null,

    SEARCHABLE smallint not null,

    UNSIGNED_ATTRIBUTE smallint null,

    MONEY smallint not null,

    AUTO_INCREMENT smallint null,

    LOCAL_TYPE_NAME sysname collate database_default null,

    MINIMUM_SCALE smallint null,

    MAXIMUM_SCALE smallint null,

    SQL_DATA_TYPE smallint not null,

    SQL_DATETIME_SUB smallint null,

    NUM_PREC_RADIX int null,

    INTERVAL_PRECISION smallint NULL,

    USERTYPE smallint not null)

    insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spdatatypeinfo',

    @scrollopt output, @ccopt output, @rows output

    drop table #spdatatypeinfo

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;5(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spfkeys (

    PKTABLE_QUALIFIER sysname collate database_default null,

    PKTABLE_OWNER sysname collate database_default null,

    PKTABLE_NAME sysname collate database_default not null,

    PKCOLUMN_NAME sysname collate database_default not null,

    FKTABLE_QUALIFIER sysname collate database_default null,

    FKTABLE_OWNER sysname collate database_default null,

    FKTABLE_NAME sysname collate database_default not null,

    FKCOLUMN_NAME sysname collate database_default not null,

    KEY_SEQ smallint not null,

    UPDATE_RULE smallint null,

    DELETE_RULE smallint null,

    FK_NAME sysname collate database_default null,

    PK_NAME sysname collate database_default null,

    DEFERRABILITY smallint null

    )

    insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spfkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #spfkeys

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;6(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sppkeys (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default not null,

    COLUMN_NAME sysname collate database_default not null,

    KEY_SEQ smallint not null,

    PK_NAME sysname collate database_default null

    )

    insert into #sppkeys exec sp_pkeys @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sppkeys',

    @scrollopt output, @ccopt output, @rows output

    drop table #sppkeys

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;7(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spspeccol (

    SCOPE smallint null,

    COLUMN_NAME sysname collate database_default not null,

    DATA_TYPE smallint not null,

    TYPE_NAME sysname collate database_default not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    PSEUDO_COLUMN smallint null

    )

    insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spspeccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spspeccol

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;8(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @ODBCVer int)

    as

    set nocount on

    declare @ret int

    create table #spproccol (

    PROCEDURE_QUALIFIER sysname collate database_default null,

    PROCEDURE_OWNER sysname collate database_default null,

    PROCEDURE_NAME sysname collate database_default not null,

    COLUMN_NAME sysname collate database_default not null,

    COLUMN_TYPE smallint not null,

    DATA_TYPE smallint null,

    TYPE_NAME sysname collate database_default not null,

    "PRECISION" int null,

    LENGTH int null,

    SCALE smallint null,

    RADIX smallint null,

    NULLABLE smallint not null,

    REMARKS varchar(254) collate database_default null,

    COLUMN_DEF nvarchar(3000) collate database_default null,

    SQL_DATA_TYPE smallint null,

    SQL_DATETIME_SUB smallint null,

    CHAR_OCTET_LENGTH int null,

    ORDINAL_POSITION int not null,

    IS_NULLABLE varchar(254) collate database_default null,

    SS_DATA_TYPE tinyint null

    )

    insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer

    exec @ret = sp_cursoropen @handle output,

    'select * from #spproccol',

    @scrollopt output, @ccopt output, @rows output

    drop table #spproccol

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;9(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774),

    @p6 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spstatistics (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default not null,

    NON_UNIQUE smallint null,

    INDEX_QUALIFIER sysname collate database_default null,

    INDEX_NAME sysname collate database_default null,

    TYPE smallint not null,

    SEQ_IN_INDEX smallint null,

    COLUMN_NAME sysname collate database_default null,

    COLLATION char(1) collate database_default null,

    CARDINALITY int null,

    PAGES int null,

    FILTER_CONDITION varchar(128) collate database_default null

    )

    insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6

    exec @ret = sp_cursoropen @handle output,

    'select * from #spstatistics',

    @scrollopt output, @ccopt output, @rows output

    drop table #spstatistics

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;10(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #spprocedures (

    PROCEDURE_QUALIFIER sysname collate database_default null,

    PROCEDURE_OWNER sysname collate database_default null,

    PROCEDURE_NAME nvarchar(134) collate database_default not null, /*134=sysname+';'+ltrim(str(c.number,5))*/

    NUM_INPUT_PARAMS int null,

    NUM_OUTPUT_PARAMS int null,

    NUM_RESULT_SETS int null,

    REMARKS varchar(254) collate database_default null,

    PROCEDURE_TYPE smallint null

    )

    insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #spprocedures',

    @scrollopt output, @ccopt output, @rows output

    drop table #spprocedures

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;11(

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sptabpriv (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default not null,

    GRANTOR sysname collate database_default null,

    GRANTEE sysname collate database_default not null,

    PRIVILEGE varchar(32) collate database_default not null,

    IS_GRANTABLE varchar(3) collate database_default null

    )

    insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptabpriv',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptabpriv

    return @ret

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_ddopen;12(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774),

    @p2 nvarchar(774),

    @p3 nvarchar(774),

    @p4 nvarchar(774),

    @p5 nvarchar(774))

    as

    set nocount on

    declare @ret int

    create table #sptables (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default null,

    TABLE_TYPE varchar(32) collate database_default null,

    REMARKS varchar(254) collate database_default null)

    if @procname = 'sp_tables'

    begin

    insert into #sptables exec sp_tables @p1,@p2,@p3,@p4

    end

    else

    begin

    insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5

    end

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptables',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptables

    return @ret

    go

    create procedure sp_ddopen;13(

    @handle int output,

    @procname sysname,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @p1 nvarchar(774), -- @table_name

    @p2 nvarchar(774), -- @table_owner

    @p3 nvarchar(774), -- @table_qualifier

    @p4 nvarchar(774)) -- @table_type

    as

    -- this code was copied from sp_tableswc (for 8.0). Any changes

    -- made here need to be evaluated for porting to sp_tableswc.

    set nocount on

    declare @ret int

    declare @databasename sysname

    declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */

    create table #sptables (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default null,

    TABLE_TYPE varchar(32) collate database_default null,

    REMARKS varchar(254) collate database_default null)

    declare databases CURSOR FOR

    select name from master..sysdatabases

    where name like @p3 and name <> 'model' and has_dbaccess(name)=1

    for read only

    open databases

    fetch next from databases into @databasename

    while (@@FETCH_STATUS <> -1)

    begin

    if (charindex('%', @databasename) = 0)

    begin /* skip dbnames w/wildcard characters to prevent loop */

    select @qualprocname = @databasename + '..sp_tables'

    insert into #sptables exec @qualprocname

    @p1, @p2, @databasename, @p4

    end

    fetch next from databases into @databasename

    end

    deallocate databases

    exec @ret = sp_cursoropen @handle output,

    'select * from #sptables',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptables

    return @ret

    go

    grant execute on sp_ddopen to public

    go

    print 'creating sp_tableswc'

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 server */

    create procedure sp_tableswc(

    @table_name nvarchar(384) = null,

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null,

    @table_type varchar(100) = null)

    as

    -- sp_ddopen;13 contains the same code, so changes made here should

    -- be evaluated for porting to sp_ddopen;13

    declare @databasename sysname

    declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */

    create table #sptables (

    TABLE_QUALIFIER sysname null,

    TABLE_OWNER sysname null,

    TABLE_NAME sysname null,

    TABLE_TYPE varchar(32) null,

    REMARKS varchar(254) null)

    declare databases CURSOR FOR

    select name from master..sysdatabases

    where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1

    for read only

    open databases

    fetch next from databases into @databasename

    while (@@FETCH_STATUS <> -1)

    begin

    if (charindex('%', @databasename) = 0)

    begin /* skip dbnames w/wildcard characters to prevent loop */

    select @qualprocname = @databasename + '..sp_tables'

    insert into #sptables exec @qualprocname

    @table_name, @table_owner, @databasename, @table_type

    end

    fetch next from databases into @databasename

    end

    deallocate databases

    select * from #sptables

    order by 4, 1, 2, 3

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop procedure sp_tableswc

    go

    /* Procedure for 8.0 server */

    create procedure sp_tableswc(

    @table_name nvarchar(384) = null,

    @table_owner nvarchar(384) = null,

    @table_qualifier sysname = null,

    @table_type varchar(100) = null)

    as

    -- sp_ddopen;13 contains the same code, so changes made here should

    -- be evaluated for porting to sp_ddopen;13

    declare @databasename sysname

    declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */

    create table #sptables (

    TABLE_QUALIFIER sysname collate database_default null,

    TABLE_OWNER sysname collate database_default null,

    TABLE_NAME sysname collate database_default null,

    TABLE_TYPE varchar(32) collate database_default null,

    REMARKS varchar(254) collate database_default null)

    declare databases CURSOR FOR

    select name from master..sysdatabases

    where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1

    for read only

    open databases

    fetch next from databases into @databasename

    while (@@FETCH_STATUS <> -1)

    begin

    if (charindex('%', @databasename) = 0)

    begin /* skip dbnames w/wildcard characters to prevent loop */

    select @qualprocname = @databasename + '..sp_tables'

    insert into #sptables exec @qualprocname

    @table_name, @table_owner, @databasename, @table_type

    end

    fetch next from databases into @databasename

    end

    deallocate databases

    select * from #sptables

    order by 4, 1, 2, 3

    go

    grant execute on sp_tableswc to public

    go

    dump tran master with no_log

    go

    /*-------------------------------------------------------------------------*/

    /*-------------- CATALOG STORED PROCEDURES FOR SQLOLEDB ------------------*/

    /*-------------------------------------------------------------------------*/

    print ''

    print 'creating spt_provider_types'

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Pre 8.0 Server */

    create table spt_provider_types

    (

    ss_dtype tinyint not null,

    fixlen int null, /* datatype len for variable, else null */

    type_name sysname not null,

    oledb_data_type smallint not null,

    best_match bit not null,

    is_nullable tinyint null,

    case_sensitive bit not null,

    fixed_prec_scale bit not null,

    is_long bit not null,

    auto_unique_value tinyint not null,

    data_precision int null,

    numeric_scale smallint null, /* min scale if 6.0 */

    column_size int null,

    literal_prefix varchar(32) null,

    literal_suffix varchar(32) null,

    searchable int not null,

    unsigned_attribute tinyint null,

    local_type_name sysname null

    )

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* 8.0 Server */

    create table spt_provider_types

    (

    ss_dtype tinyint not null,

    fixlen int null, /* datatype len for variable, else null */

    type_name sysname not null,

    oledb_data_type smallint not null,

    best_match bit not null,

    is_nullable bit null,

    case_sensitive bit not null,

    fixed_prec_scale bit not null,

    is_long bit not null,

    auto_unique_value tinyint not null,

    data_precision int null,

    numeric_scale smallint null, /* min scale if 6.0 */

    column_size int null,

    literal_prefix nvarchar(32) null,

    literal_suffix nvarchar(32) null,

    searchable int not null,

    unsigned_attribute tinyint null,

    local_type_name sysname null

    )

    end

    go

    grant select on spt_provider_types to public

    go

    dump tran master with no_log

    go

    /*

    ** Insert the spt_provider_types rows for DBTYTPE_STR data types

    */

    begin tran

    /* Get case sensitivity */

    declare @case_sensitive bit

    select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end

    /* Local Char */

    insert into spt_provider_types values

    (

    47 /*SQLCHARACTER*/, /* ss_dtype */

    0, /* fixlen */

    'char', /* type_name */

    129 /*DBTYPE_STR*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    @case_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'char' /* local_type_name */

    )

    /* Local Varchar */

    insert into spt_provider_types values

    (

    39 /*SQLVARCHAR*/, /* ss_dtype */

    null, /* fixlen */

    'varchar', /* type_name */

    129 /*DBTYPE_STR*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    @case_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'varchar' /* local_type_name */

    )

    /* Local Text */

    insert into spt_provider_types values

    (

    35 /*SQLTEXT*/, /* ss_dtype */

    null, /* fixlen */

    'text', /* type_name */

    129 /*DBTYPE_STR*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    @case_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    1, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    2147483647, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    2 /*DB_LIKE_ONLY*/, /* searchable */

    null, /* unsigned_attribute */

    'text' /* local_type_name */

    )

    commit tran

    go

    dump tran master with no_log

    go

    /*

    ** Insert the spt_provider_types rows for DBTYTPE_BYTES data types

    */

    begin tran

    /* Local Binary */

    insert into spt_provider_types values

    (

    45 /*SQLBINARY*/, /* ss_dtype */

    0, /* fixlen */

    'binary', /* type_name */

    128 /*DBTYPE_BYTES*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '0x', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'binary' /* local_type_name */

    )

    /* Local Varbinary */

    insert into spt_provider_types values

    (

    37 /*SQLVARBINARY*/, /* ss_dtype */

    null, /* fixlen */

    'varbinary', /* type_name */

    128 /*DBTYPE_BYTES*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '0x', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'varbinary' /* local_type_name */

    )

    /* Local Image */

    insert into spt_provider_types values

    (

    34 /*SQLIMAGE*/, /* ss_dtype */

    null, /* fixlen */

    'image', /* type_name */

    128 /*DBTYPE_BYTES*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    1, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    2147483647, /* column_size */

    '0x', /* literal_prefix */

    null, /* literal_suffix */

    1 /*DB_UNSEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'image' /* local_type_name */

    )

    commit tran

    go

    dump tran master with no_log

    go

    /*

    ** Insert the spt_provider_types rows for DBTYPE_DBTIMESTAMP data types

    */

    begin tran

    /* Local Datetime */

    insert into spt_provider_types values

    (

    61 /*SQLDATETIME*/, /* ss_dtype */

    8, /* fixlen */

    'datetime', /* type_name */

    135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    23, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'datetime' /* local_type_name */

    )

    /* Local Smalldatetime */

    insert into spt_provider_types values

    (

    58 /*SQLDATETIM4*/, /* ss_dtype */

    4, /* fixlen */

    'smalldatetime', /* type_name */

    135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    16, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'smalldatetime' /* local_type_name */

    )

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Add nullable type for non-Sphinx server */

    /* Local Datetimn */

    insert into spt_provider_types values

    (

    111 /*SQLDATETIMN*/, /* ss_dtype */

    4, /* fixlen */

    'smalldatetime', /* type_name */

    135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    16, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'smalldatetime' /* local_type_name */

    )

    insert into spt_provider_types values

    (

    111 /*SQLDATETIMN*/, /* ss_dtype */

    8, /* fixlen */

    'datetime', /* type_name */

    135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    23, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'datetime' /* local_type_name */

    )

    end

    commit tran

    go

    dump tran master with no_log

    go

    /*

    ** Insert the spt_provider_types rows for DBTYPE_CY data types

    */

    begin tran

    /* Local Smallmoney */

    insert into spt_provider_types values

    (

    122 /*SQLMONEY4*/, /* ss_dtype */

    4, /* fixlen */

    'smallmoney', /* type_name */

    6 /*DBTYPE_CY*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    10, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '$', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'smallmoney' /* local_type_name */

    )

    /* Local Money */

    insert into spt_provider_types values

    (

    60 /*SQLMONEY*/, /* ss_dtype */

    8, /* fixlen */

    'money', /* type_name */

    6 /*DBTYPE_CY*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    19, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '$', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'money' /* local_type_name */

    )

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Add nullable type for non-Sphinx server */

    /* Local Moneyn */

    insert into spt_provider_types values

    (

    110 /*SQLMONEYN*/, /* ss_dtype */

    4, /* fixlen */

    'smallmoney', /* type_name */

    6 /*DBTYPE_CY*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    10, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '$', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'smallmoney' /* local_type_name */

    )

    insert into spt_provider_types values

    (

    110 /*SQLMONEYN*/, /* ss_dtype */

    8, /* fixlen */

    'money', /* type_name */

    6 /*DBTYPE_CY*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    19, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '$', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'money' /* local_type_name */

    )

    end

    commit tran

    go

    dump tran master with no_log

    go

    /*

    ** Insert the spt_provider_types rows for the numeric data types

    */

    begin tran

    /* Local Float */

    insert into spt_provider_types values

    (

    62 /*SQLFLT8*/, /* ss_dtype */

    8, /* fixlen */

    'float', /* type_name */

    5 /*DBTYPE_R8*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    15, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'float' /* local_type_name */

    )

    /* Local Real */

    insert into spt_provider_types values

    (

    59 /*SQLFLT4*/, /* ss_dtype */

    4, /* fixlen */

    'real', /* type_name */

    4 /*DBTYPE_R4*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    7, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'real' /* local_type_name */

    )

    /* Local Int */

    insert into spt_provider_types values

    (

    56 /*SQLINT4*/, /* ss_dtype */

    4, /* fixlen */

    'int', /* type_name */

    3 /*DBTYPE_I4*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    10, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'int' /* local_type_name */

    )

    /* Local Smallint */

    insert into spt_provider_types values

    (

    52 /*SQLINT2*/, /* ss_dtype */

    2, /* fixlen */

    'smallint', /* type_name */

    2 /*DBTYPE_I2*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    5, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'smallint' /* local_type_name */

    )

    /* Local Tinyint */

    insert into spt_provider_types values

    (

    48 /*SQLINT1*/, /* ss_dtype */

    1, /* fixlen */

    'tinyint', /* type_name */

    17 /*DBTYPE_UI1*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    3, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    1, /* unsigned_attribute */

    'tinyint' /* local_type_name */

    )

    commit tran

    go

    dump tran master with no_log

    go

    begin tran

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin /* Add 6.0 data types */

    /* Local Decimal */

    insert into spt_provider_types values

    (

    55 /*SQLDECIMAL*/, /* ss_dtype */

    0, /* fixlen */

    'decimal', /* type_name */

    131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    38, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'decimal' /* local_type_name */

    )

    /* Local Numeric */

    insert into spt_provider_types values

    (

    63 /*SQLNUMERIC*/, /* ss_dtype */

    0, /* fixlen */

    'numeric', /* type_name */

    131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    38, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'numeric' /* local_type_name */

    )

    end

    commit tran

    go

    dump tran master with no_log

    go

    begin tran

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin /* Add nullable type for non-Sphinx server */

    /* Local Floatn */

    insert into spt_provider_types values

    (

    109 /*SQLFLTN*/, /* ss_dtype */

    8, /* fixlen */

    'float', /* type_name */

    5 /*DBTYPE_R8*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    15, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'float' /* local_type_name */

    )

    insert into spt_provider_types values

    (

    109 /*SQLFLT4*/, /* ss_dtype */

    4, /* fixlen */

    'real', /* type_name */

    4 /*DBTYPE_R4*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    7, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'real' /* local_type_name */

    )

    /* Local Intn */

    insert into spt_provider_types values

    (

    38 /*SQLINTN*/, /* ss_dtype */

    4, /* fixlen */

    'int', /* type_name */

    3 /*DBTYPE_I4*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    10, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'int' /* local_type_name */

    )

    insert into spt_provider_types values

    (

    38 /*SQLINTN*/, /* ss_dtype */

    2, /* fixlen */

    'smallint', /* type_name */

    2 /*DBTYPE_I2*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    5, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'smallint' /* local_type_name */

    )

    insert into spt_provider_types values

    (

    38 /*SQLINTN*/, /* ss_dtype */

    1, /* fixlen */

    'tinyint', /* type_name */

    17 /*DBTYPE_UI1*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    3, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    1, /* unsigned_attribute */

    'tinyint' /* local_type_name */

    )

    if (charindex('6.00', @@version) > 0 or charindex('6.50', @@version) > 0)

    begin /* Add 6.0 data types */

    /* Local Decimaln */

    insert into spt_provider_types values

    (

    106 /*SQLDECIMALN*/, /* ss_dtype */

    0, /* fixlen */

    'decimal', /* type_name */

    131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    38, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'decimal' /* local_type_name */

    )

    /* Local Numericn */

    insert into spt_provider_types values

    (

    108 /*SQLNUMERICN*/, /* ss_dtype */

    0, /* fixlen */

    'numeric', /* type_name */

    131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    38, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'numeric' /* local_type_name */

    )

    end

    end

    commit tran

    go

    dump tran master with no_log

    go

    /*

    ** Remaining data types

    */

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    begin tran

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    begin

    /* Local Bit */

    insert into spt_provider_types values

    (

    50 /*SQLBIT*/, /* ss_dtype */

    0, /* fixlen */

    'bit', /* type_name */

    11 /*DBTYPE_BOOL*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    1, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'bit' /* local_type_name */

    )

    /* Local Timestamp */

    insert into spt_provider_types values

    (

    0, /* ss_dtype */

    8, /* fixlen */

    'timestamp', /* type_name */

    128 /*DBTYPE_BYTES*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '0x', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'timestamp' /* local_type_name */

    )

    /* Local GUID */

    insert into spt_provider_types values

    (

    0, /* ss_dtype */

    16, /* fixlen */

    'uniqueidentifier', /* type_name */

    72 /*DBTYPE_GUID*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '''', /* literal_prefix */

    '''', /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'uniqueidentifier' /* local_type_name */

    )

    /* Get case sensitivity */

    declare @ncase_sensitive bit

    select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end

    /* Local NChar */

    insert into spt_provider_types values

    (

    0, /* ss_dtype */

    0, /* fixlen */

    'nchar', /* type_name */

    130 /*DBTYPE_WSTR*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    @ncase_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    'N''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'nchar' /* local_type_name */

    )

    /* Local NVarChar */

    insert into spt_provider_types values

    (

    0, /* ss_dtype */

    null, /* fixlen */

    'nvarchar', /* type_name */

    130 /*DBTYPE_WSTR*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    @ncase_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    'N''', /* literal_prefix */

    '''', /* literal_suffix */

    4 /*DB_SEARCHABLE*/, /* searchable */

    null, /* unsigned_attribute */

    'nvarchar' /* local_type_name */

    )

    /* Local NText */

    insert into spt_provider_types values

    (

    0, /* ss_dtype */

    null, /* fixlen */

    'ntext', /* type_name */

    130 /*DBTYPE_WSTR*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    @ncase_sensitive, /* case_sensitive */

    0, /* fixed_prec_scale */

    1, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    1073741823, /* column_size */

    'N''', /* literal_prefix */

    '''', /* literal_suffix */

    2 /*DB_LIKE_ONLY*/, /* searchable */

    null, /* unsigned_attribute */

    'ntext' /* local_type_name */

    )

    if (charindex('8.00', @@version) > 0)

    begin

    /* Local BIGINT */

    insert into spt_provider_types values

    (

    127, /* ss_dtype */

    8, /* fixlen */

    'bigint', /* type_name */

    20 /*DBTYPE_I8*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    1, /* fixed_prec_scale */

    0, /* is_long */

    1, /* auto_unique_value */

    19, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    0, /* unsigned_attribute */

    'bigint' /* local_type_name */

    )

    /* sql_variant */

    insert into spt_provider_types values

    (

    98, /* ss_dtype */

    null, /* fixlen */

    'sql_variant', /* type_name */

    12 /*DBTYPE_VARIANT*/, /* oledb_data_type */

    1, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    16, /* data_precision sizeof(VARIANT)*/

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 , /*DB_ALL_EXCEPT_LIKE*/

    null, /* unsigned_attribute */

    'sql_variant' /* local_type_name */

    )

    end

    /* data types changed in Sphinx: DO AFTER ALL TYPES INSERTED! */

    update spt_provider_types set ss_dtype = (select xtype from systypes where type_name like name+'%')

    end

    commit tran

    go

    dump tran master with no_log

    go

    begin tran

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    /* Local Bit */

    insert into spt_provider_types values

    (

    50 /*SQLBIT*/, /* ss_dtype */

    0, /* fixlen */

    'bit', /* type_name */

    11 /*DBTYPE_BOOL*/, /* oledb_data_type */

    1, /* best_match */

    0, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    1, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    null, /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'bit' /* local_type_name */

    )

    /* Local Timestamp */

    insert into spt_provider_types values

    (

    45 /*SQLBINARY*/, /* ss_dtype */

    8, /* fixlen */

    'timestamp', /* type_name */

    128 /*DBTYPE_BYTES*/, /* oledb_data_type */

    0, /* best_match */

    null, /* is_nullable */

    0, /* case_sensitive */

    0, /* fixed_prec_scale */

    0, /* is_long */

    0, /* auto_unique_value */

    null, /* data_precision */

    null, /* numeric_scale */

    null, /* column_size */

    '0x', /* literal_prefix */

    null, /* literal_suffix */

    3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */

    null, /* unsigned_attribute */

    'timestamp' /* local_type_name */

    )

    end

    commit tran

    go

    dump tran master with no_log

    go

    create unique clustered index datatypeinfoclust on spt_provider_types(ss_dtype,fixlen)

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'spt_provider_types' and type = 'U '))

    begin

    drop table spt_provider_types

    dump tran master with no_log

    end

    end

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /*

    ** (2/11/98)

    ** The following SP is shared by instcat.sql and the server to add information

    ** related to server language collations. The server calls it at the end of

    ** collation change to update the catalog with the new language collations

    ** Everything in this SP should NOT use tempdb.

    */

    create procedure sp_add_server_sortinfo

    as

    -- spt_server_info has unigue clustered index on attribute_id

    delete spt_server_info where attribute_id in (16,18)

    --insert into spt_server_info

    -- select 18,'COLLATION_SEQ',

    -- 'charset='+t2.name+' sort_order='+t1.name

    -- +' charset_num='+rtrim(convert(char(4),t1.csid))+

    -- ' sort_order_num='+rtrim(convert(char(4),t1.id))

    -- from master.dbo.syscharsets t1, master.dbo.syscharsets t2, master.dbo.sysconfigures t3

    -- where t1.csid=t2.id and t1.id=t3.value and t3.config in (123,1123)

    declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)

    declare @case_sensitive bit

    declare @ncase_sensitive bit

    select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end

    select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end

    select @sortid = value from sysconfigures where config = 1123

    select @csid = csid, @sortname = name from master.dbo.syscharsets where id = @sortid

    select @attribute_value = 'charset='+ name +' sort_order=' + @sortname

    + ' charset_num=' + rtrim(convert(char(4),@csid))+

    ' sort_order_num=' + rtrim(convert(char(4),@sortid))

    from syscharsets where id = @csid

    insert into spt_server_info

    values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))

    if @case_sensitive = 1 /* If case sensitive server */

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','SENSITIVE')

    end

    else

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','MIXED')

    end

    update spt_datatype_info set CASE_SENSITIVE = @case_sensitive

    where DATA_TYPE in (-1, 1, 12) /* CHAR types */

    update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive

    where DATA_TYPE in (-10, -9, -8) /* NCHAR types */

    update spt_provider_types set case_sensitive = @case_sensitive

    where oledb_data_type = 129 /*DBTYPE_STR*/

    update spt_provider_types set case_sensitive = @ncase_sensitive

    where oledb_data_type = 130 /*DBTYPE_WSTR*/

    /* sp_add_server_sortinfo */

    go

    if (charindex('7.00', @@version) > 0)

    begin

    exec sp_add_server_sortinfo

    end

    go

    -- 8.0 version of sp_add_server_sortinfo

    --

    create procedure sp_add_server_sortinfo75

    as

    -- spt_server_info has unigue clustered index on attribute_id

    delete spt_server_info where attribute_id in (16, 18)

    declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)

    declare @case_sensitive bit

    declare @ncase_sensitive bit

    select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end

    select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end

    select @sortid = convert(int, ServerProperty('sqlsortorder'))

    select @csid = convert(int, ServerProperty('sqlcharset'))

    select @sortname = name from master.dbo.syscharsets where id = @sortid

    if @sortid = 0 -- Non-SQL Collations

    BEGIN

    select @attribute_value = 'charset='

    + name

    + ' collation=' + isnull(convert(sysname, ServerProperty('collation')), ' ')

    from syscharsets where id = @csid

    END

    else

    BEGIN

    select @attribute_value = 'charset='+ name +' sort_order=' + @sortname

    + ' charset_num=' + rtrim(convert(char(4),@csid))+

    ' sort_order_num=' + rtrim(convert(char(4),@sortid))

    from syscharsets where id = @csid

    END

    insert into spt_server_info

    values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))

    if @case_sensitive = 1 /* If case sensitive server */

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','SENSITIVE')

    end

    else

    begin

    insert into spt_server_info

    values (16,'IDENTIFIER_CASE','MIXED')

    end

    update spt_datatype_info set CASE_SENSITIVE = @case_sensitive

    where DATA_TYPE in (-1, 1, 12) /* CHAR types */

    update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive

    where DATA_TYPE in (-10, -9, -8) /* NCHAR types */

    update spt_provider_types set case_sensitive = @case_sensitive

    where oledb_data_type = 129 /*DBTYPE_STR*/

    update spt_provider_types set case_sensitive = @ncase_sensitive

    where oledb_data_type = 130 /*DBTYPE_WSTR*/

    /* sp_add_server_info75 */

    go

    if (charindex('8.00', @@version) > 0)

    begin

    exec sp_add_server_sortinfo75

    end

    go

    print ''

    print 'creating sp_catalogs_rowset'

    go

    create procedure sp_catalogs_rowset

    (

    @catalog_name varchar(255)

    )

    as

    select

    CATALOG_NAME = name,

    DESCRIPTION = convert(varchar(1),null)

    from master.dbo.sysdatabases

    where name = @catalog_name AND has_dbaccess(name)=1

    go

    dump tran master with no_log

    go

    create procedure sp_catalogs_rowset;2

    (

    @dummy int /* remove when Hydra bug 17032 is fixed */

    )

    as

    select

    CATALOG_NAME = name,

    DESCRIPTION = convert(varchar(1),null)

    from master.dbo.sysdatabases

    where has_dbaccess(name)=1

    order by 1

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_catalogs_rowset

    go

    /* Procedure for 8.0 server */

    create procedure sp_catalogs_rowset

    (

    @catalog_name sysname

    )

    as

    select

    CATALOG_NAME = name,

    DESCRIPTION = convert(nvarchar(1),null)

    from master.dbo.sysdatabases

    where name = @catalog_name AND has_dbaccess(name)=1

    go

    dump tran master with no_log

    go

    create procedure sp_catalogs_rowset;2

    (

    @dummy int /* remove when Hydra bug 17032 is fixed */

    )

    as

    select

    CATALOG_NAME = name,

    DESCRIPTION = convert(nvarchar(1),null)

    from master.dbo.sysdatabases

    where has_dbaccess(name)=1

    order by 1

    go

    dump tran master with no_log

    go

    create procedure sp_catalogs_rowset;5

    (

    @server_name sysname,

    @catalog_name sysname = NULL

    )

    as

    select CATALOG_NAME,

    DESCRIPTION

    from master.dbo.SYSREMOTE_CATALOGS ( @server_name, @catalog_name )

    where has_dbaccess(CATALOG_NAME)=1

    order by 1

    go

    grant execute on sp_catalogs_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_catalogs_rowset' and type = 'P '))

    begin

    drop procedure sp_catalogs_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_column_privileges_rowset'

    go

    /* Procedure for 6.0 and 6.5 server */

    CREATE PROCEDURE sp_column_privileges_rowset

    (

    @table_name varchar(255) = null,

    @table_schema varchar(255) = null,

    @column_name varchar(255) = null,

    @grantor varchar(255) = null,

    @grantee varchar(255) = null

    )

    as

    IF @table_name is not null

    BEGIN

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    END

    ELSE

    BEGIN

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    END

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_column_privileges_rowset;2

    (

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @table_name varchar(255) = null,

    @table_schema varchar(255) = null,

    @column_name varchar(255) = null,

    @grantor varchar(255) = null,

    @grantee varchar(255) = null

    )

    as

    declare @ret int

    SET NOCOUNT ON

    create table #spcprivsrowset1

    (

    GRANTOR sysname not null,

    GRANTEE sysname not null,

    TABLE_CATALOG sysname not null,

    TABLE_SCHEMA sysname not null,

    TABLE_NAME sysname not null,

    COLUMN_NAME sysname not null,

    COLUMN_GUID binary(16) null,

    COLUMN_PROPID int null,

    PRIVILEGE_TYPE sysname not null,

    IS_GRANTABLE bit not null

    )

    IF @table_name is not null

    BEGIN

    insert into #spcprivsrowset1

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    END

    ELSE

    BEGIN

    insert into #spcprivsrowset1

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    END

    exec @ret = sp_cursoropen @handle output, 'select * from #spcprivsrowset1',

    @scrollopt output, @ccopt output, @rows output

    drop table #spcprivsrowset1

    return isnull(@ret,0)

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_column_privileges_rowset;3

    as

    select

    GRANTOR = convert(sysname,' '),

    GRANTEE = convert(sysname,' '),

    TABLE_CATALOG = convert(sysname,' '),

    TABLE_SCHEMA = convert(sysname,' '),

    TABLE_NAME = convert(sysname,' '),

    COLUMN_NAME = convert(sysname,' '),

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(varchar(30),' '),

    IS_GRANTABLE = convert(bit,1)

    where 1=0

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_column_privileges_rowset

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_column_privileges_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @column_name sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case p.action

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case v.number

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_column_privileges_rowset;2

    (

    @table_schema sysname = null,

    @column_name sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case p.action

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and c.id = p.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    and case

    when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))

    else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0 /* permission applies to this column */

    and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */

    and v.type = 'P'

    and v.number = c.colid

    and (@grantee is null or @grantee = user_name(u.uid))

    /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where

    p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid

    and case

    when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */

    when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))

    else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))

    end & v.high <> 0) /* permission applies to this column */

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case v.number

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and c.id = o.id

    and (@column_name is null or @column_name = c.name)

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4, 5, 6, 9, 1, 2

    go

    dump tran master with no_log

    go

    create procedure sp_column_privileges_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null,

    @column_name sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR,

    GRANTEE,

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    PRIVILEGE_TYPE,

    IS_GRANTABLE

    from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    @column_name,

    @grantor,

    @grantee )

    order by 3, 4, 5, 6, 9, 1, 2

    go

    grant execute on sp_column_privileges_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_column_privileges_rowset' and type = 'P '))

    begin

    drop procedure sp_column_privileges_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_columns_rowset'

    go

    /* Procedure for 6.0 and 6.50 server */

    create procedure sp_columns_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @column_name varchar(255) = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    COLUMN_DEFAULT = convert (varchar (255),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)-2)

    else substring(m.text,1,datalength(m.text)-2)

    end),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when c.status&8 = 8

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128

    then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/

    else 0

    end),

    IS_NULLABLE = convert(bit,c.status&8),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(binary(16),null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then b_cha.name

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(varchar(1),null)

    from

    syscolumns c,

    syscomments m,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    sysusers u,

    master.dbo.sysconfigures cfg,

    master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */

    master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */

    where

    o.name = @table_name

    and o.type in ('U','V','S')

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.type = d.ss_dtype

    and (t.usertype != 80 or d.type_name='timestamp')

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and c.cdefault *= m.id

    and m.colid = 1

    and cfg.comment = 'default sortorder ID'

    and a_cha.type = 1001 /* type is charset */

    and b_cha.type = 2001 /* type is sortorder */

    and a_cha.id = b_cha.csid

    and b_cha.id = cfg.value

    order by 2, 3, c.colid

    go

    dump tran master with no_log

    go

    create procedure sp_columns_rowset;2

    (

    @table_schema varchar(255) = null,

    @column_name varchar(255) = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    COLUMN_DEFAULT = convert (varchar (255),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)-2)

    else substring(m.text,1,datalength(m.text)-2)

    end),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when c.status&8 = 8

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128

    then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/

    else 0

    end),

    IS_NULLABLE = convert(bit,c.status&8),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(binary(16),null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then 'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then b_cha.name

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(varchar(1),null)

    from

    syscolumns c,

    syscomments m,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    sysusers u,

    master.dbo.sysconfigures cfg,

    master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */

    master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */

    where

    o.type in ('U','V','S')

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.type = d.ss_dtype

    and (t.usertype != 80 or d.type_name='timestamp')

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and c.cdefault *= m.id

    and m.colid = 1

    and cfg.comment = 'default sortorder ID'

    and a_cha.type = 1001 /* type is charset */

    and b_cha.type = 2001 /* type is sortorder */

    and a_cha.id = b_cha.csid

    and b_cha.id = cfg.value

    order by 2, 3, c.colid

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_columns_rowset

    go

    /* Procedure for 7.0 server */

    create procedure sp_columns_rowset

    (

    @table_name sysname,

    @table_schema sysname = NULL,

    @column_name sysname = NULL

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    COLUMN_DEFAULT = convert(nvarchar(2000),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)/2-2)

    else substring(m.text,1,datalength(m.text)/2-2)

    end ),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when ColumnProperty(c.id,c.name,'AllowsNull') = 1

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2

    then 0x4 /*DBCOLUMNFLAGS_WRITE*/

    else 0

    end),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(uniqueidentifier,null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then b_cha.name

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(nvarchar(1),null)

    from

    syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    master.dbo.sysconfigures cfg,

    master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */

    master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */

    where

    permissions(o.id, c.name) <> 0

    and o.name = @table_name

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and cfg.comment = 'default sortorder id'

    and a_cha.type = 1001 /* type is charset */

    and b_cha.type = 2001 /* type is sortorder */

    and a_cha.id = b_cha.csid

    and b_cha.id = cfg.value

    order by 2, 3, c.colorder

    go

    dump tran master with no_log

    go

    /* Procedure for 7.0 server */

    create procedure sp_columns_rowset;2

    (

    @table_schema sysname = NULL,

    @column_name sysname = NULL

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    COLUMN_DEFAULT = convert(nvarchar(2000),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)/2-2)

    else substring(m.text,1,datalength(m.text)/2-2)

    end ),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when ColumnProperty(c.id,c.name,'AllowsNull') = 1

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2

    then 0x4 /*DBCOLUMNFLAGS_WRITE*/

    else 0

    end),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(uniqueidentifier,null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then b_cha.name

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(nvarchar(1),null)

    from

    syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    master.dbo.sysconfigures cfg,

    master.dbo.syscharsets a_cha, /* charset/1001, not sortorder.*/

    master.dbo.syscharsets b_cha /* sortorder/2001, not charset.*/

    where

    permissions(o.id, c.name) <> 0

    and o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and cfg.comment = 'default sortorder id'

    and a_cha.type = 1001 /* type is charset */

    and b_cha.type = 2001 /* type is sortorder */

    and a_cha.id = b_cha.csid

    and b_cha.id = cfg.value

    order by 2, 3, c.colorder

    go

    dump tran master with no_log

    go

    /* Procedure for 7.0 server */

    create procedure sp_columns_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null,

    @column_name sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    ORDINAL_POSITION,

    COLUMN_HASDEFAULT,

    COLUMN_DEFAULT,

    COLUMN_FLAGS,

    IS_NULLABLE,

    DATA_TYPE,

    TYPE_GUID,

    CHARACTER_MAXIMUM_LENGTH,

    CHARACTER_OCTET_LENGTH,

    NUMERIC_PRECISION,

    NUMERIC_SCALE,

    DATETIME_PRECISION,

    CHARACTER_SET_CATALOG,

    CHARACTER_SET_SCHEMA,

    CHARACTER_SET_NAME,

    COLLATION_CATALOG,

    COLLATION_SCHEMA,

    COLLATION_NAME,

    DOMAIN_CATALOG,

    DOMAIN_SCHEMA,

    DOMAIN_NAME,

    DESCRIPTION

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    @column_name )

    order by 1, 2, 3, 7

    go

    dump tran master with no_log

    go

    /* Procedure for 8.00 server */

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_columns_rowset

    go

    /* Procedure for 8.00 server */

    create procedure sp_columns_rowset

    (

    @table_name sysname,

    @table_schema sysname = NULL,

    @column_name sysname = NULL

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    /* Get rid of ( if it is first char otherwise display the whole thing */

    COLUMN_DEFAULT = convert(nvarchar(2000),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)/2-2)

    else substring(m.text,1,datalength(m.text)/2-2)

    end ),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when ColumnProperty(c.id,c.name,'AllowsNull') = 1

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2

    then 0x4 /*DBCOLUMNFLAGS_WRITE*/

    else 0

    end),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(uniqueidentifier,null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then c.collation

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(nvarchar(1),null),

    COLUMN_LCID = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),

    COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),

    COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */

    when ABS(c.collationid) > 0x1000000

    then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))

    else null

    end,

    COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),

    IS_COMPUTED = convert(bit, c.iscomputed)

    from

    syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    master.dbo.syscharsets a_cha /* charset/1001, not sortorder. */

    where

    permissions(o.id, c.name) <> 0

    and o.name = @table_name

    and (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),

    convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column

    order by 2, 3, c.colorder

    go

    /* Procedure for 8.0 server */

    create procedure sp_columns_rowset;2

    (

    @table_schema sysname = NULL,

    @column_name sysname = NULL

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),

    COLUMN_DEFAULT = convert(nvarchar(2000),

    case when substring(m.text,1,1) = '('

    then substring(m.text,2,datalength(m.text)/2-2)

    else substring(m.text,1,datalength(m.text)/2-2)

    end ),

    COLUMN_FLAGS = convert(int,

    case when d.is_long = 1

    then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/

    else 0

    end

    | case when d.fixlen is not null

    then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/

    else 0

    end

    | case when ColumnProperty(c.id,c.name,'AllowsNull') = 1

    then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/

    else 0

    end

    | case

    when d.type_name = 'timestamp'

    then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/

    when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2

    then 0x4 /*DBCOLUMNFLAGS_WRITE*/

    else 0

    end),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    TYPE_GUID = convert(uniqueidentifier,null),

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DATETIME_PRECISION = convert(int,

    case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null

    when data_precision = 23 then 3 else 0 end),

    CHARACTER_SET_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    CHARACTER_SET_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    CHARACTER_SET_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then a_cha.name

    else null

    end),

    COLLATION_CATALOG = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'master'

    else null

    end),

    COLLATION_SCHEMA = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then N'dbo'

    else null

    end),

    COLLATION_NAME = convert(sysname,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    then c.collation

    else null

    end),

    DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,

    DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,

    DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,

    DESCRIPTION = convert(nvarchar(1),null),

    COLUMN_LCID = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),

    COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),

    COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */

    when ABS(c.collationid) > 0x1000000

    then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))

    else null

    end,

    COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),

    IS_COMPUTED = convert(bit, c.iscomputed)

    from

    syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t,

    master.dbo.syscharsets a_cha /* charset/1001, not sortorder.*/

    where

    permissions(o.id, c.name) <> 0

    and (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@column_name is null or @column_name = c.name)

    and o.id = c.id

    and t.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and a_cha.type = 1001 /* type is charset */

    and a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),

    convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column

    order by 2, 3, c.colorder

    go

    dump tran master with no_log

    go

    /* Procedure for 8.0 server */

    create procedure sp_columns_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null,

    @column_name sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    ORDINAL_POSITION,

    COLUMN_HASDEFAULT,

    COLUMN_DEFAULT,

    COLUMN_FLAGS,

    IS_NULLABLE,

    DATA_TYPE,

    TYPE_GUID,

    CHARACTER_MAXIMUM_LENGTH,

    CHARACTER_OCTET_LENGTH,

    NUMERIC_PRECISION,

    NUMERIC_SCALE,

    DATETIME_PRECISION,

    CHARACTER_SET_CATALOG,

    CHARACTER_SET_SCHEMA,

    CHARACTER_SET_NAME,

    COLLATION_CATALOG,

    COLLATION_SCHEMA,

    COLLATION_NAME,

    DOMAIN_CATALOG,

    DOMAIN_SCHEMA,

    DOMAIN_NAME,

    DESCRIPTION

    from master.dbo.SYSREMOTE_COLUMNS (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    @column_name )

    order by 1, 2, 3, 7

    go

    grant execute on sp_columns_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_columns_rowset' and type = 'P '))

    begin

    drop procedure sp_columns_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_check_constraints_rowset'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_check_constraints_rowset

    (

    @constraint_name varchar(255),

    @constraint_schema varchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(varchar(1),null)

    from

    sysobjects c_obj, syscomments m

    where

    c_obj.type = 'C '

    and c_obj.name = @constraint_name

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and c_obj.id = m.id

    order by 1,2,3

    go

    dump tran master with no_log

    go

    create procedure sp_check_constraints_rowset;2

    (

    @constraint_schema varchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(varchar(1),null)

    from

    sysobjects c_obj, syscomments m

    where

    c_obj.type = 'C '

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and c_obj.id = m.id

    order by 1,2,3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_check_constraints_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 servers and 8.0 servers */

    create procedure sp_check_constraints_rowset

    (

    @constraint_name sysname,

    @constraint_schema sysname = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, syscomments m

    where

    c_obj.type = 'C '

    and c_obj.name = @constraint_name

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and m.id = c_obj.id

    order by 1,2,3

    go

    dump tran master with no_log

    go

    create procedure sp_check_constraints_rowset;2

    (

    @constraint_schema sysname = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, syscomments m

    where

    c_obj.type = 'C '

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and m.id = c_obj.id

    order by 1,2,3

    go

    grant execute on sp_check_constraints_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_check_constraints_rowset' and type = 'P '))

    begin

    drop procedure sp_check_constraints_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_check_constbytable_rowset'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_check_constbytable_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @constraint_name varchar(255) = null,

    @constraint_schema varchar(255) = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(varchar(1),null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m

    where

    t_obj.name = @table_name

    and t_obj.type in ('U ','S ')

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and t_obj.id = c.id

    and c.constid = c_obj.id

    and c_obj.type = 'C '

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and c_obj.id = m.id

    order by 1,2,3,4,5,6

    go

    dump tran master with no_log

    go

    create procedure sp_check_constbytable_rowset;2

    (

    @table_schema varchar(255) = null,

    @constraint_name varchar(255) = null,

    @constraint_schema varchar(255) = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(varchar(1),null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m

    where

    t_obj.type in ('U ','S ')

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c.id = t_obj.id

    and c.constid = c_obj.id

    and c_obj.type = 'C '

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and c_obj.id = m.id

    order by 1,2,3,4,5,6

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_check_constbytable_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_check_constbytable_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @constraint_name sysname = null,

    @constraint_schema sysname = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, syscomments m

    where

    t_obj.name = @table_name

    and t_obj.type in ('U ','S ')

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c_obj.parent_obj = t_obj.id

    and c_obj.type = 'C '

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and m.id = c_obj.id

    order by 1,2,3,4,5,6

    go

    dump tran master with no_log

    go

    create procedure sp_check_constbytable_rowset;2

    (

    @table_schema sysname = null,

    @constraint_name sysname = null,

    @constraint_schema sysname = null

    )

    as

    select

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    CHECK_CLAUSE = m.text,

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, syscomments m

    where

    t_obj.type in ('U ','S ')

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c_obj.parent_obj = t_obj.id

    and c_obj.type = 'C '

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and m.id = c_obj.id

    order by 1,2,3,4,5,6

    go

    dump tran master with no_log

    go

    grant execute on sp_check_constbytable_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_check_constbytable_rowset' and type = 'P '))

    begin

    drop procedure sp_check_constbytable_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_foreign_keys_rowset'

    go

    /* Procedure for 6.0 and 6.5 server */

    CREATE PROCEDURE sp_foreign_keys_rowset

    (

    @pk_table_name varchar(255) = null,

    @pk_table_schema varchar(255) = null,

    @pk_table_catalog varchar(255) = null,

    @fk_table_name varchar(255) = null,

    @fk_table_schema varchar(255) = null,

    @fk_table_catalog varchar(255) = null

    )

    as

    BEGIN

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(binary(16),null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(binary(16),null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,1),

    UPDATE_RULE = 'NO ACTION',

    DELETE_RULE = 'NO ACTION',

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey1

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey1

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,2),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 2

    and o1.id = c1.id

    and c1.colid = r.rkey2

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey2

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,3),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 3

    and o1.id = c1.id

    and c1.colid = r.rkey3

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey3

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,4),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 4

    and o1.id = c1.id

    and c1.colid = r.rkey4

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey4

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,5),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 5

    and o1.id = c1.id

    and c1.colid = r.rkey5

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey5

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,6),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 6

    and o1.id = c1.id

    and c1.colid = r.rkey6

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey6

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,7),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 7

    and o1.id = c1.id

    and c1.colid = r.rkey7

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey7

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,8),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 8

    and o1.id = c1.id

    and c1.colid = r.rkey8

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey8

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,9),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 9

    and o1.id = c1.id

    and c1.colid = r.rkey9

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey9

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,10),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 10

    and o1.id = c1.id

    and c1.colid = r.rkey10

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey10

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,11),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 11

    and o1.id = c1.id

    and c1.colid = r.rkey11

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey11

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,12),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 12

    and o1.id = c1.id

    and c1.colid = r.rkey12

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey12

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,13),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 13

    and o1.id = c1.id

    and c1.colid = r.rkey13

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey13

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,14),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 14

    and o1.id = c1.id

    and c1.colid = r.rkey14

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey14

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,15),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 15

    and o1.id = c1.id

    and c1.colid = r.rkey15

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey15

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,16),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and r.keycnt >= 16

    and c1.colid = r.rkey16

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey16

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    order by 8,9,2,3,13

    END

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_foreign_keys_rowset;2

    (

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @pk_table_name varchar(255) = null,

    @pk_table_schema varchar(255) = null,

    @pk_table_catalog varchar(255) = null,

    @fk_table_name varchar(255) = null,

    @fk_table_schema varchar(255) = null,

    @fk_table_catalog varchar(255) = null

    )

    as

    declare @ret int

    SET NOCOUNT ON

    create table #spfkeysrowset1

    (

    PK_TABLE_CATALOG sysname not null,

    PK_TABLE_SCHEMA sysname not null,

    PK_TABLE_NAME sysname not null,

    PK_COLUMN_NAME sysname not null,

    PK_COLUMN_GUID binary(16) null,

    PK_COLUMN_PROPID int null,

    FK_TABLE_CATALOG sysname not null,

    FK_TABLE_SCHEMA sysname not null,

    FK_TABLE_NAME sysname not null,

    FK_COLUMN_NAME sysname not null,

    FK_COLUMN_GUID binary(16) null,

    FK_COLUMN_PROPID int null,

    ORDINAL int not null,

    UPDATE_RULE sysname not null,

    DELETE_RULE sysname not null,

    PK_NAME sysname not null,

    FK_NAME sysname not null,

    DEFERRABILITY smallint not null

    )

    BEGIN

    insert into #spfkeysrowset1

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,1),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey1

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey1

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,2),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 2

    and o1.id = c1.id

    and c1.colid = r.rkey2

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey2

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,3),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 3

    and o1.id = c1.id

    and c1.colid = r.rkey3

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey3

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,4),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 4

    and o1.id = c1.id

    and c1.colid = r.rkey4

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey4

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,5),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 5

    and o1.id = c1.id

    and c1.colid = r.rkey5

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey5

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,6),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 6

    and o1.id = c1.id

    and c1.colid = r.rkey6

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey6

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,7),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 7

    and o1.id = c1.id

    and c1.colid = r.rkey7

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey7

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,8),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 8

    and o1.id = c1.id

    and c1.colid = r.rkey8

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey8

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,9),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 9

    and o1.id = c1.id

    and c1.colid = r.rkey9

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey9

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,10),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 10

    and o1.id = c1.id

    and c1.colid = r.rkey10

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey10

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,11),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 11

    and o1.id = c1.id

    and c1.colid = r.rkey11

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey11

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,12),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 12

    and o1.id = c1.id

    and c1.colid = r.rkey12

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey12

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,13),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 13

    and o1.id = c1.id

    and c1.colid = r.rkey13

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey13

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,14),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 14

    and o1.id = c1.id

    and c1.colid = r.rkey14

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey14

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,15),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and r.keycnt >= 15

    and o1.id = c1.id

    and c1.colid = r.rkey15

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey15

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    union all

    select

    db_name(r.rkeydbid),

    user_name(o1.uid),

    o1.name,

    c1.name,

    convert(binary(16),null),

    convert(int,null),

    db_name(r.fkeydbid),

    user_name(o2.uid),

    o2.name,

    c2.name,

    convert(binary(16),null),

    convert(int,null),

    convert(int,16),

    'NO ACTION',

    'NO ACTION',

    i.name,

    object_name(r.constid),

    convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i, sysusers u

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and r.keycnt >= 16

    and c1.colid = r.rkey16

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey16

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    and u.uid = user_id()

    and ( suser_id() = 1 /* User is the System Administrator */

    or (

    o1.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o1.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    and (

    o2.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o2.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    )

    order by 8,9,2,3,13

    END

    exec @ret = sp_cursoropen @handle output, 'select * from #spfkeysrowset1',

    @scrollopt output, @ccopt output, @rows output

    drop table #spfkeysrowset1

    return isnull(@ret,0)

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_foreign_keys_rowset;3

    as

    select

    PK_TABLE_CATALOG = convert(sysname,' '),

    PK_TABLE_SCHEMA = convert(sysname,' '),

    PK_TABLE_NAME = convert(sysname,' '),

    PK_COLUMN_NAME = convert(sysname,' '),

    PK_COLUMN_GUID = convert(binary(16),null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = convert(sysname,' '),

    FK_TABLE_SCHEMA = convert(sysname,' '),

    FK_TABLE_NAME = convert(sysname,' '),

    FK_COLUMN_NAME = convert(sysname,' '),

    FK_COLUMN_GUID = convert(binary(16),null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,1),

    UPDATE_RULE = 'NO ACTION',

    DELETE_RULE = 'NO ACTION',

    PK_NAME = convert(sysname, ' '),

    FK_NAME = convert(sysname, ' '),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    where 1=0

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_foreign_keys_rowset

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_foreign_keys_rowset

    (

    @pk_table_name sysname,

    @pk_table_schema sysname = null,

    @fk_table_name sysname = null,

    @fk_table_schema sysname = null,

    @fk_table_catalog sysname = null

    )

    as

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,1),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey1

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey1

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,2),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey2

    and r.keycnt >= 2

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey2

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,3),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey3

    and r.keycnt >= 3

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey3

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,4),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 4

    and o1.id = c1.id

    and c1.colid = r.rkey4

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey4

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,5),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 5

    and o1.id = c1.id

    and c1.colid = r.rkey5

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey5

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,6),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 6

    and o1.id = c1.id

    and c1.colid = r.rkey6

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey6

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,7),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 7

    and o1.id = c1.id

    and c1.colid = r.rkey7

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey7

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,8),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 8

    and o1.id = c1.id

    and c1.colid = r.rkey8

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey8

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,9),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 9

    and o1.id = c1.id

    and c1.colid = r.rkey9

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey9

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,10),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 10

    and o1.id = c1.id

    and c1.colid = r.rkey10

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey10

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,11),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 11

    and o1.id = c1.id

    and c1.colid = r.rkey11

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey11

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,12),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 12

    and o1.id = c1.id

    and c1.colid = r.rkey12

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey12

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,13),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 13

    and o1.id = c1.id

    and c1.colid = r.rkey13

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey13

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,14),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 14

    and o1.id = c1.id

    and c1.colid = r.rkey14

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey14

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,15),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 15

    and o1.id = c1.id

    and c1.colid = r.rkey15

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey15

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,16),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and o1.name = @pk_table_name

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 16

    and o1.id = c1.id

    and c1.colid = r.rkey16

    and r.fkeyid = o2.id

    and (@fk_table_name is null or @fk_table_name = o2.name)

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey16

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    order by 8,9,2,3,13

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_foreign_keys_rowset;2

    (

    @fk_table_name sysname,

    @fk_table_schema sysname = null,

    @pk_table_name sysname = null,

    @pk_table_schema sysname = null,

    @pk_table_catalog sysname = null

    )

    as

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,1),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and o2.id = c2.id

    and c2.colid = r.fkey1

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey1

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,2),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 2

    and o2.id = c2.id

    and c2.colid = r.fkey2

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey2

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,3),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 3

    and o2.id = c2.id

    and c2.colid = r.fkey3

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey3

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,4),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 4

    and o2.id = c2.id

    and c2.colid = r.fkey4

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey4

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,5),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 5

    and o2.id = c2.id

    and c2.colid = r.fkey5

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey5

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,6),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 6

    and o2.id = c2.id

    and c2.colid = r.fkey6

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey6

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,7),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 7

    and o2.id = c2.id

    and c2.colid = r.fkey7

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey7

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,8),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 8

    and o2.id = c2.id

    and c2.colid = r.fkey8

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey8

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,9),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 9

    and o2.id = c2.id

    and c2.colid = r.fkey9

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey9

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,10),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 10

    and o2.id = c2.id

    and c2.colid = r.fkey10

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey10

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,11),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 11

    and o2.id = c2.id

    and c2.colid = r.fkey11

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey11

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,12),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 12

    and o2.id = c2.id

    and c2.colid = r.fkey12

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey12

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,13),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 13

    and o2.id = c2.id

    and c2.colid = r.fkey13

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey13

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,14),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 14

    and o2.id = c2.id

    and c2.colid = r.fkey14

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey14

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,15),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 15

    and o2.id = c2.id

    and c2.colid = r.fkey15

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey15

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,16),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and o2.name = @fk_table_name

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = r.fkeyid

    and r.keycnt >= 16

    and o2.id = c2.id

    and c2.colid = r.fkey16

    and r.rkeyid = o1.id

    and (@pk_table_name is null or @pk_table_name = o1.name)

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = c1.id

    and c1.colid = r.rkey16

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    order by 8,9,2,3,13

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_foreign_keys_rowset;3

    (

    @pk_table_schema sysname = null,

    @pk_table_catalog sysname = null,

    @fk_table_schema sysname = null,

    @fk_table_catalog sysname = null

    )

    as

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,1),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and c1.colid = r.rkey1

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey1

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,2),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 2

    and o1.id = c1.id

    and c1.colid = r.rkey2

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey2

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,3),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 3

    and o1.id = c1.id

    and c1.colid = r.rkey3

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey3

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,4),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 4

    and o1.id = c1.id

    and c1.colid = r.rkey4

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey4

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,5),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 5

    and o1.id = c1.id

    and c1.colid = r.rkey5

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey5

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,6),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 6

    and o1.id = c1.id

    and c1.colid = r.rkey6

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey6

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,7),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 7

    and o1.id = c1.id

    and c1.colid = r.rkey7

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey7

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,8),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 8

    and o1.id = c1.id

    and c1.colid = r.rkey8

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey8

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,9),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 9

    and o1.id = c1.id

    and c1.colid = r.rkey9

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey9

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,10),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 10

    and o1.id = c1.id

    and c1.colid = r.rkey10

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey10

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,11),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 11

    and o1.id = c1.id

    and c1.colid = r.rkey11

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey11

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,12),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 12

    and o1.id = c1.id

    and c1.colid = r.rkey12

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey12

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,13),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 13

    and o1.id = c1.id

    and c1.colid = r.rkey13

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey13

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,14),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 14

    and o1.id = c1.id

    and c1.colid = r.rkey14

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey14

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,15),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and r.keycnt >= 15

    and o1.id = c1.id

    and c1.colid = r.rkey15

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey15

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    union all

    select

    PK_TABLE_CATALOG = db_name(r.rkeydbid),

    PK_TABLE_SCHEMA = user_name(o1.uid),

    PK_TABLE_NAME = o1.name,

    PK_COLUMN_NAME = c1.name,

    PK_COLUMN_GUID = convert(uniqueidentifier,null),

    PK_COLUMN_PROPID = convert(int,null),

    FK_TABLE_CATALOG = db_name(r.fkeydbid),

    FK_TABLE_SCHEMA = user_name(o2.uid),

    FK_TABLE_NAME = o2.name,

    FK_COLUMN_NAME = c2.name,

    FK_COLUMN_GUID = convert(uniqueidentifier,null),

    FK_COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,16),

    UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,

    PK_NAME = i.name,

    FK_NAME = object_name(r.constid),

    DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/

    from

    sysobjects o1, sysobjects o2,

    syscolumns c1, syscolumns c2,

    sysreferences r, sysindexes i

    where

    (@pk_table_catalog is null or @pk_table_catalog = db_name())

    and (@fk_table_catalog is null or @fk_table_catalog = db_name())

    and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))

    and o1.id = r.rkeyid

    and o1.id = c1.id

    and r.keycnt >= 16

    and c1.colid = r.rkey16

    and r.fkeyid = o2.id

    and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))

    and o2.id = c2.id

    and c2.colid = r.fkey16

    and permissions(o1.id) <> 0

    and permissions(o2.id) <> 0

    and i.id = r.rkeyid

    and i.indid = r.rkeyindid

    order by 8,9,2,3,13

    go

    dump tran master with no_log

    go

    create procedure sp_foreign_keys_rowset;5

    (

    @server_name sysname,

    @pk_catalog_name sysname = null,

    @fk_catalog_name sysname = null,

    @pk_table_name sysname = null,

    @pk_table_schema sysname = null,

    @fk_table_name sysname = null,

    @fk_table_schema sysname = null

    )

    as

    select

    PK_TABLE_CATALOG,

    PK_TABLE_SCHEMA,

    PK_TABLE_NAME,

    PK_COLUMN_NAME,

    PK_COLUMN_GUID,

    PK_COLUMN_PROPID,

    FK_TABLE_CATALOG,

    FK_TABLE_SCHEMA,

    FK_TABLE_NAME,

    FK_COLUMN_NAME,

    FK_COLUMN_GUID,

    FK_COLUMN_PROPID,

    ORDINAL,

    UPDATE_RULE,

    DELETE_RULE

    --PK_NAME,

    --FK_NAME,

    --DEFERRABILITY

    from master.dbo.SYSREMOTE_FOREIGN_KEYS (

    @server_name,

    @pk_catalog_name,

    @pk_table_schema,

    @pk_table_name,

    @fk_catalog_name,

    @fk_table_schema,

    @fk_table_name )

    order by 7,8,9,1,2,3,13

    go

    grant execute on sp_foreign_keys_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_foreign_keys_rowset' and type = 'P '))

    begin

    drop procedure sp_foreign_keys_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_indexes_rowset'

    go

    /* 6.0 and 6.5 version */

    create procedure sp_indexes_rowset

    (

    @table_name varchar(255),

    @index_name varchar(255) = null,

    @table_schema varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_NAME = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(varchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysusers u

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and x.id = c.id

    and c.colid < x.keycnt+(x.status&16)/16

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    create procedure sp_indexes_rowset;2

    (

    @index_name varchar(255) = null,

    @table_schema varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int,

    (

    select count(*)

    from syscolumns sc

    where sc.id = c.id

    AND sc.number = c.number

    AND sc.colid <= c.colid

    )),

    COLUMN_NAME = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(varchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysusers u

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and x.id = c.id

    and c.colid < x.keycnt+(x.status&16)/16

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_indexes_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 7.0 version */

    create procedure sp_indexes_rowset

    (

    @table_name sysname,

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int, xk.keyno),

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(nvarchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and o.id = c.id

    and o.id = xk.id

    and x.indid = xk.indid

    and c.colid = xk.colid

    and xk.keyno <= x.keycnt

    and permissions(o.id, c.name) <> 0

    and (x.status&32) = 0 -- No hypothetical indexes

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    create procedure sp_indexes_rowset;2

    (

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int, xk.keyno),

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(nvarchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and o.id = c.id

    and o.id = xk.id

    and x.indid = xk.indid

    and c.colid = xk.colid

    and xk.keyno <= x.keycnt

    and permissions(o.id, c.name) <> 0

    and (x.status&32) = 0 -- No hypothetical indexes

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    create procedure sp_indexes_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    INDEX_CATALOG,

    INDEX_SCHEMA,

    INDEX_NAME,

    PRIMARY_KEY,

    "UNIQUE",

    "CLUSTERED",

    "TYPE",

    FILL_FACTOR,

    INITIAL_SIZE,

    NULLS,

    SORT_BOOKMARKS,

    AUTO_UPDATE,

    NULL_COLLATION,

    ORDINAL_POSITION,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION

    -- INTEGRATED

    from master.dbo.SYSREMOTE_INDEXES (

    @table_server,

    @table_catalog,

    @table_schema,

    @index_name,

    NULL, /* TYPE (index type) */

    @table_name )

    order by 8 desc, 4, 5, 6, 17

    go

    grant execute on sp_indexes_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_indexes_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    create procedure sp_indexes_rowset

    (

    @table_name sysname,

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int, xk.keyno),

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint,

    case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1

    then 2 /* DB_COLLATION_DESC */

    else 1 /* DB_COLLATION_ASC */

    end),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(nvarchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and o.id = c.id

    and o.id = xk.id

    and x.indid = xk.indid

    and c.colid = xk.colid

    and xk.keyno <= x.keycnt

    and permissions(o.id, c.name) <> 0

    and (x.status&32) = 0 -- No hypothetical indexes

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    create procedure sp_indexes_rowset;2

    (

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    INDEX_CATALOG = db_name(),

    INDEX_SCHEMA = user_name(o.uid),

    INDEX_NAME = x.name,

    PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),

    "UNIQUE" = convert(bit,(x.status & 2)/2),

    "CLUSTERED" = convert(bit,(x.status & 16)/16),

    "TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),

    FILL_FACTOR = convert(int, x.OrigFillFactor),

    INITIAL_SIZE = convert(int,null),

    NULLS = convert(int,null),

    SORT_BOOKMARKS = convert(bit,0),

    AUTO_UPDATE = convert(bit,1),

    NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),

    ORDINAL_POSITION = convert(int, xk.keyno),

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    COLLATION = convert(smallint,

    case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1

    then 2 /* DB_COLLATION_DESC */

    else 1 /* DB_COLLATION_ASC */

    end),

    CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,

    PAGES = convert(int, x.dpages),

    FILTER_CONDITION = convert(nvarchar(1),null),

    INTEGRATED = convert(bit,(x.status & 16)/16)

    from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@index_name is null or @index_name = x.name)

    and x.id = o.id

    and o.id = c.id

    and o.id = xk.id

    and x.indid = xk.indid

    and c.colid = xk.colid

    and xk.keyno <= x.keycnt

    and permissions(o.id, c.name) <> 0

    and (x.status&32) = 0 -- No hypothetical indexes

    order by 8 desc, 4, 5, 6, 17

    go

    dump tran master with no_log

    go

    create procedure sp_indexes_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @index_name sysname = null,

    @table_schema sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    INDEX_CATALOG,

    INDEX_SCHEMA,

    INDEX_NAME,

    PRIMARY_KEY,

    "UNIQUE",

    "CLUSTERED",

    "TYPE",

    FILL_FACTOR,

    INITIAL_SIZE,

    NULLS,

    SORT_BOOKMARKS,

    AUTO_UPDATE,

    NULL_COLLATION,

    ORDINAL_POSITION,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    COLLATION,

    CARDINALITY,

    PAGES,

    FILTER_CONDITION

    -- INTEGRATED

    from master.dbo.SYSREMOTE_INDEXES (

    @table_server,

    @table_catalog,

    @table_schema,

    @index_name,

    NULL, /* TYPE (index type) */

    @table_name )

    order by 8 desc, 4, 5, 6, 17

    go

    grant execute on sp_indexes_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_indexes_rowset' and type = 'P '))

    begin

    drop procedure sp_indexes_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_primary_keys_rowset'

    go

    /* Procedure for 6.0 and 6.5 servers */

    create procedure sp_primary_keys_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(244) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o, sysusers u

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_primary_keys_rowset;2

    (

    @table_schema varchar(244) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(binary(16),null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o, sysusers u

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_primary_keys_rowset

    go

    /* Procedure for 7.0 & 8.0 servers */

    create procedure sp_primary_keys_rowset

    (

    @table_name sysname,

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800 -- PRIMARY KEY

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and permissions(o.id) <> 0

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_primary_keys_rowset;2

    (

    @table_schema sysname = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800 -- PRIMARY KEY

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and permissions(o.id) <> 0

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_primary_keys_rowset;3

    (

    @table_name sysname = null,

    @table_schema sysname = null

    )

    as

    IF @table_name is not NULL

    BEGIN

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800 -- PRIMARY KEY

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and permissions(o.id) <> 0

    END

    ELSE

    BEGIN

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    COLUMN_NAME = c.name,

    COLUMN_GUID = convert(uniqueidentifier,null),

    COLUMN_PROPID = convert(int,null),

    ORDINAL = convert(int,

    case

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15

    when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16

    end

    ),

    PK_NAME = i.name

    from sysindexes i, syscolumns c, sysobjects o

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and o.id = c.id

    and o.id = i.id

    and (i.status & 0x800) = 0x800 -- PRIMARY KEY

    and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or

    c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)

    )

    and permissions(o.id) <> 0

    END

    go

    dump tran master with no_log

    go

    create procedure sp_primary_keys_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    COLUMN_NAME,

    COLUMN_GUID,

    COLUMN_PROPID,

    ORDINAL

    --PK_NAME

    from master.dbo.SYSREMOTE_PRIMARY_KEYS (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name )

    order by 1,2,3

    go

    grant execute on sp_primary_keys_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_primary_keys_rowset' and type = 'P '))

    begin

    drop procedure sp_primary_keys_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_provider_types_rowset'

    go

    /* Procedure for 6.0 and 6.50 servers */

    create proc sp_provider_types_rowset

    (

    @data_type smallint = null,

    @best_match tinyint = null

    )

    as

    select

    TYPE_NAME = case when t.usertype = 80 then t.name

    else d.type_name

    end,

    DATA_TYPE = d.oledb_data_type,

    COLUMN_SIZE = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/

    then @@max_precision

    else coalesce(d.column_size,d.data_precision,t.prec) end,

    LITERAL_PREFIX = d.literal_prefix,

    LITERAL_SUFFIX = d.literal_suffix,

    CREATE_PARAMS = convert(varchar(32),e.CREATE_PARAMS),

    IS_NULLABLE = t.allownulls,

    CASE_SENSITIVE = d.case_sensitive,

    SEARCHABLE = d.searchable,

    UNSIGNED_ATTRIBUTE = d.unsigned_attribute,

    FIXED_PREC_SCALE = d.fixed_prec_scale,

    AUTO_UNIQUE_VALUE = d.auto_unique_value,

    LOCAL_TYPE_NAME = case when t.usertype = 80 then t.name

    else d.local_type_name

    end,

    MINIMUM_SCALE = convert(smallint,

    case

    when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0

    else null

    end),

    MAXIMUM_SCALE = convert(smallint,

    case

    when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/

    then @@max_precision

    else null

    end),

    GUID = convert(binary(16),null),

    TYPELIB = convert(varchar(1),null),

    VERSION = convert(varchar(1),null),

    IS_LONG = d.is_long,

    BEST_MATCH = case when t.usertype = 80

    then convert(bit,0)

    else d.best_match

    end,

    IS_FIXEDLENGTH = convert(bit,

    case when d.fixlen is null then 0 else 1 end)

    from master.dbo.spt_provider_types d, master.dbo.spt_datatype_info_ext e, systypes t

    where d.ss_dtype = t.type

    and t.usertype <= 100

    and t.usertype <> 18 /* sysname */

    and (case when t.usertype = 80 /* TIMESTAMP */ then 1 else 0 end

    = case when d.type_name = 'timestamp' then 1 else 0 end)

    and t.usertype *= e.user_type

    and e.AUTO_INCREMENT = 0

    and t.type not in (111,109,38,110,55,63) /* get rid of nullable types */

    and (@data_type is null or d.oledb_data_type = @data_type)

    and (@best_match is null or d.best_match = @best_match)

    order by 2

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_provider_types_rowset

    go

    /* Procedure for 8.0 server */

    create proc sp_provider_types_rowset

    (

    @data_type smallint = null,

    @best_match tinyint = null

    )

    as

    select

    TYPE_NAME = case when t.usertype = 80 then t.name

    else d.type_name

    end,

    DATA_TYPE = d.oledb_data_type,

    COLUMN_SIZE = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/

    then @@max_precision

    else coalesce(d.column_size,d.data_precision,t.prec) end,

    LITERAL_PREFIX = d.literal_prefix,

    LITERAL_SUFFIX = d.literal_suffix,

    CREATE_PARAMS = convert(nvarchar(32),e.CREATE_PARAMS),

    IS_NULLABLE = t.allownulls,

    CASE_SENSITIVE = d.case_sensitive,

    SEARCHABLE = d.searchable,

    UNSIGNED_ATTRIBUTE = d.unsigned_attribute,

    FIXED_PREC_SCALE = d.fixed_prec_scale,

    AUTO_UNIQUE_VALUE = d.auto_unique_value,

    LOCAL_TYPE_NAME = case when t.usertype = 80 then t.name

    else d.local_type_name

    end,

    MINIMUM_SCALE = convert(smallint,

    case

    when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0

    else null

    end),

    MAXIMUM_SCALE = convert(smallint,

    case

    when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/

    then @@max_precision

    else null

    end),

    GUID = convert(uniqueidentifier,null),

    TYPELIB = convert(nvarchar(1),null),

    VERSION = convert(nvarchar(1),null),

    IS_LONG = d.is_long,

    BEST_MATCH = case when t.usertype = 80

    then convert(bit,0)

    else d.best_match

    end,

    IS_FIXEDLENGTH = convert(bit,

    case when d.fixlen is null then 0 else 1 end)

    from master.dbo.spt_provider_types d

    INNER JOIN master.dbo.systypes t on d.ss_dtype = t.xtype

    LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on

    t.xusertype = e.user_type

    and e.AUTO_INCREMENT = 0

    where (@data_type is null or d.oledb_data_type = @data_type)

    and (@best_match is null or d.best_match = @best_match)

    and t.usertype <= 255

    and t.usertype <> 18 /* sysname */

    order by 2

    go

    grant execute on sp_provider_types_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_provider_types_rowset' and type = 'P '))

    begin

    drop procedure sp_provider_types_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_procedure_params_rowset'

    go

    /* Procedure for 6.0 and 6.50 servers */

    create procedure sp_procedure_params_rowset

    (

    @procedure_name varchar(255) = null,

    @group_number int = null,

    @procedure_schema varchar(255) = null,

    @parameter_name varchar(255) = null

    )

    as

    IF @procedure_name is not null

    BEGIN

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,

    case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/

    then 0 else 1

    end),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    syscolumns c,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.name = @procedure_name

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.number = @group_number

    and c.type = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and (t.usertype != 80 or d.type_name='timestamp')

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = convert(sysname,'int'),

    LOCAL_TYPE_NAME = convert(sysname,'int')

    from

    syscomments c,

    sysobjects o

    where

    o.name = @procedure_name

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    and c.id = o.id

    and c.number = @group_number

    and c.colid = 1

    order by 2, 3, 5

    END

    ELSE

    BEGIN

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,

    case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/

    then 0 else 1

    end),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    syscolumns c,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.type = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and (t.usertype != 80 or d.type_name='timestamp')

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = convert(sysname,'int'),

    LOCAL_TYPE_NAME = convert(sysname,'int')

    from

    syscomments c,

    sysobjects o

    where

    o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    and c.id = o.id

    and c.colid = 1

    order by 2, 3, 5

    END

    go

    dump tran master with no_log

    go

    create procedure sp_procedure_params_rowset;2

    (

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @procedure_name varchar(255) = null,

    @group_number int = null,

    @procedure_schema varchar(255) = null,

    @parameter_name varchar(255) = null

    )

    as

    declare @ret int

    SET NOCOUNT ON

    create table #spprocparamrowset1

    (

    PROCEDURE_CATALOG sysname not null,

    PROCEDURE_SCHEMA sysname not null,

    PROCEDURE_NAME varchar(35) not null,

    PARAMETER_NAME sysname not null,

    ORDINAL_POSITION smallint not null,

    PARAMETER_TYPE smallint null,

    PARAMETER_HASDEFAULT tinyint null,

    PARAMETER_DEFAULT varchar(255) null,

    IS_NULLABLE bit not null,

    DATA_TYPE smallint null,

    CHARACTER_MAXIMUM_LENGTH int null,

    CHARACTER_OCTET_LENGTH int null,

    NUMERIC_PRECISION smallint null,

    NUMERIC_SCALE smallint null,

    DESCRIPTION varchar(1) null,

    TYPE_NAME sysname null,

    LOCAL_TYPE_NAME sysname null,

    )

    IF @procedure_name is not null

    BEGIN

    insert into #spprocparamrowset1

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,

    case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/

    then 0 else 1

    end),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    syscolumns c,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.name = @procedure_name

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.number = @group_number

    and c.type = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and (t.usertype != 80 or d.type_name='timestamp')

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = convert(sysname,'int'),

    LOCAL_TYPE_NAME = convert(sysname,'int')

    from

    syscomments c,

    sysobjects o

    where

    o.name = @procedure_name

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    and c.id = o.id

    and c.number = @group_number

    and c.colid = 1

    order by 2, 3, 5

    END

    ELSE

    BEGIN

    insert into #spprocparamrowset1

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,

    case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/

    then 0 else 1

    end),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    syscolumns c,

    sysobjects o,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.type = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.usertype = t.usertype

    and (t.usertype != 80 or d.type_name='timestamp')

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint,0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = convert(sysname,'int'),

    LOCAL_TYPE_NAME = convert(sysname,'int')

    from

    syscomments c,

    sysobjects o

    where

    o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    and c.id = o.id

    and c.colid = 1

    order by 2, 3, 5

    END

    exec @ret = sp_cursoropen @handle output, 'select * from #spprocparamrowset1',

    @scrollopt output, @ccopt output, @rows output

    drop table #spprocparamrowset1

    return isnull(@ret,0)

    go

    dump tran master with no_log

    go

    create procedure sp_procedure_params_rowset;3

    as

    select

    PROCEDURE_CATALOG = convert(sysname, ' '),

    PROCEDURE_SCHEMA = convert(sysname, ' '),

    PROCEDURE_NAME = convert(varchar(35), ' '),

    PARAMETER_NAME = convert(sysname, ' '),

    ORDINAL_POSITION = convert(smallint, 0),

    PARAMETER_TYPE = convert(smallint, 0),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(varchar(255),null),

    IS_NULLABLE = convert(bit, 0),

    DATA_TYPE = convert(smallint, 0),

    CHARACTER_MAXIMUM_LENGTH= convert(int, 0),

    CHARACTER_OCTET_LENGTH = convert(int, 0),

    NUMERIC_PRECISION = convert(smallint, 0),

    NUMERIC_SCALE = convert(smallint, 0),

    DESCRIPTION = convert(varchar(1),null),

    TYPE_NAME = convert(sysname,null),

    LOCAL_TYPE_NAME = convert(sysname,null)

    where 1=0

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_procedure_params_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 servers */

    create procedure sp_procedure_params_rowset

    (

    @procedure_name sysname,

    @group_number int = 1,

    @procedure_schema sysname = null,

    @parameter_name sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.name = @procedure_name

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.number = @group_number

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = convert(sysname,N'int'),

    LOCAL_TYPE_NAME = convert(sysname,N'int')

    from

    sysobjects o,

    syscomments c

    where

    o.name = @procedure_name

    and o.id = c.id

    and c.number = @group_number

    and c.colid = 1

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    order by 2, 3, 5

    go

    dump tran master with no_log

    go

    create procedure sp_procedure_params_rowset;2

    (

    @procedure_schema sysname = null,

    @parameter_name sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = convert(sysname,N'int'),

    LOCAL_TYPE_NAME = convert(sysname,N'int')

    from

    sysobjects o,

    syscomments c

    where

    o.type = 'P' /* Just Procedures */

    and o.id = c.id

    and c.colid = 1

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    order by 2, 3, 5

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_procedure_params_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 servers */

    create procedure sp_procedure_params_rowset

    (

    @procedure_name sysname,

    @group_number int = 1,

    @procedure_schema sysname = null,

    @parameter_name sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.name = @procedure_name

    and (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and ((c.number = @group_number and o.type = 'P')

    or (c.number = 0 and o.type = 'FN')

    or (c.number = 1 and o.type in ('TF', 'IF')))

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = convert(sysname,N'int'),

    LOCAL_TYPE_NAME = convert(sysname,N'int')

    from

    sysobjects o,

    syscomments c

    where

    o.name = @procedure_name

    and o.id = c.id

    and c.number = @group_number

    and c.colid = 1

    and o.type = 'P' /* Just Procedures */

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    UNION ALL

    SELECT /* UDF return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint, 0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit, c.isnullable),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH = convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    FROM

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    WHERE

    o.name = @procedure_name

    and o.id = c.id

    and c.number = 0

    and c.colid = 0

    and o.type = 'FN' /* UDF scalar functions */

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    UNION ALL

    SELECT /* UDF table value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint, 0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 0), /*DBTYPE_EMPTY*/

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(50), N'Result table returned by table valued function'),

    TYPE_NAME = N'table',

    LOCAL_TYPE_NAME = N'table'

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d

    where

    o.name = @procedure_name

    and o.id = c.id

    and c.number = 0

    and c.colid = 1

    and o.type in ('TF', 'IF') /* UDF table functions */

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')

    order by 2, 3, 5

    go

    dump tran master with no_log

    go

    create procedure sp_procedure_params_rowset;2

    (

    @procedure_schema sysname = null,

    @parameter_name sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = c.name,

    ORDINAL_POSITION = convert(smallint, c.colid),

    PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    where

    (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.id = c.id

    and (o.type = 'P' or (c.number = 0 and o.type = 'FN') or (c.number = 1 and o.type in ('TF', 'IF')))

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@parameter_name is null or @parameter_name = c.name)

    UNION ALL

    SELECT /* return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint,0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),

    CHARACTER_MAXIMUM_LENGTH= convert(int,null),

    CHARACTER_OCTET_LENGTH = convert(int,null),

    NUMERIC_PRECISION = convert(smallint,10),

    NUMERIC_SCALE = convert(smallint,null),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = convert(sysname,N'int'),

    LOCAL_TYPE_NAME = convert(sysname,N'int')

    from

    sysobjects o,

    syscomments c

    where

    o.type = 'P' /* Just Procedures */

    and o.id = c.id

    and c.colid = 1

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    UNION ALL

    SELECT /* UDF return value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint, 0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit, c.isnullable),

    DATA_TYPE = d.oledb_data_type,

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = d.type_name,

    LOCAL_TYPE_NAME = d.local_type_name

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d,

    systypes t

    where

    o.id = c.id

    and c.number = 0

    and c.colid = 0

    and o.type = 'FN' /* UDF scalar functions */

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and c.xusertype = t.xusertype

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')

    UNION ALL

    SELECT /* UDF table value row*/

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),

    PARAMETER_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),

    ORDINAL_POSITION = convert(smallint, 0),

    PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),

    PARAMETER_HASDEFAULT = convert(tinyint, 0),

    PARAMETER_DEFAULT = convert(nvarchar(255),null),

    IS_NULLABLE = convert(bit,0),

    DATA_TYPE = convert(smallint, 0), /*DBTYPE_EMPTY*/

    CHARACTER_MAXIMUM_LENGTH= convert(int,

    case

    when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size,c.length/2)

    else null

    end),

    CHARACTER_OCTET_LENGTH = convert(int,

    case when d.oledb_data_type = 129 /*DBTYPE_STR*/

    or d.oledb_data_type = 128 /*DBTYPE_BYTES*/

    then coalesce(d.column_size,c.length)

    when d.oledb_data_type = 130 /*DBTYPE_WSTR*/

    then coalesce(d.column_size*2,c.length)

    else null

    end),

    NUMERIC_PRECISION = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec

    when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)

    then d.data_precision else null end),

    NUMERIC_SCALE = convert(smallint,

    case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),

    DESCRIPTION = convert(nvarchar(1),null),

    TYPE_NAME = N'table',

    LOCAL_TYPE_NAME = N'table'

    from

    sysobjects o,

    syscolumns c,

    master.dbo.spt_provider_types d

    where

    o.id = c.id

    and c.number = 0

    and c.colid = 1

    and o.type in ('TF', 'IF') /* UDF table functions */

    and c.xtype = d.ss_dtype

    and c.length = case when d.fixlen > 0 then d.fixlen else c.length end

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')

    order by 2, 3, 5

    go

    grant execute on sp_procedure_params_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_procedure_params_rowset' and type = 'P '))

    begin

    drop procedure sp_procedure_params_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_procedures_rowset'

    go

    /* pre 7.0 version */

    create procedure sp_procedures_rowset

    (

    @procedure_name varchar(255),

    @group_number int = 1,

    @procedure_schema varchar(255) = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(varchar(1),null),

    DESCRIPTION = convert(varchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from

    sysobjects o,

    syscomments p,

    sysusers u

    where

    o.name = @procedure_name

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type = 'P' /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    and p.number = @group_number

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and ( suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_procedures_rowset;2

    (

    @procedure_schema varchar(255) = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(varchar(1),null),

    DESCRIPTION = convert(varchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from

    sysobjects o,

    syscomments p,

    sysusers u

    where

    (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type = 'P' /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and ( suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_procedures_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 7.0 version */

    create procedure sp_procedures_rowset

    (

    @procedure_name sysname,

    @group_number int = 1,

    @procedure_schema sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(nvarchar(1),null),

    DESCRIPTION = convert(nvarchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from

    sysobjects o,

    syscomments p

    where

    permissions(o.id) <> 0

    and o.name = @procedure_name

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type = 'P' /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    and p.number = @group_number

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_procedures_rowset;2

    (

    @procedure_schema sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(nvarchar(1),null),

    DESCRIPTION = convert(nvarchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysobjects o, syscomments p

    where

    permissions(o.id) <> 0

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type = 'P' /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    order by 2, 3

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_procedures_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    create procedure sp_procedures_rowset

    (

    @procedure_name sysname,

    @group_number int = 1,

    @procedure_schema sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(nvarchar(1),null),

    DESCRIPTION = convert(nvarchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from

    sysobjects o,

    syscomments p

    where

    permissions(o.id) <> 0

    and o.name = @procedure_name

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    and p.number = @group_number

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_procedures_rowset;2

    (

    @procedure_schema sysname = null

    )

    as

    select

    PROCEDURE_CATALOG = db_name(),

    PROCEDURE_SCHEMA = user_name(o.uid),

    PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),

    PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),

    PROCEDURE_DEFINITION = convert(nvarchar(1),null),

    DESCRIPTION = convert(nvarchar(1),null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysobjects o, syscomments p

    where

    permissions(o.id) <> 0

    and (@procedure_schema is null or @procedure_schema = user_name(o.uid))

    and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure */

    and p.colid = 1

    and p.id = o.id

    order by 2, 3

    go

    grant execute on sp_procedures_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_procedures_rowset' and type = 'P '))

    begin

    drop procedure sp_procedures_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_schemata_rowset'

    go

    /* 6.0 and 6.5 and 7.0 version */

    create procedure sp_schemata_rowset

    (

    @schema_name varchar(90) = null,

    @schema_owner varchar(90) = null

    )

    as

    select distinct

    CATALOG_NAME = db_name(),

    SCHEMA_NAME = user_name(o.uid),

    SCHEMA_OWNER = user_name(o.uid),

    DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,'master'),

    DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,'dbo'),

    DEFAULT_CHARACTER_SET_NAME = convert(sysname,a_cha.name)

    from

    sysobjects o,

    master.dbo.sysconfigures cfg,

    master.dbo.syscharsets a_cha, /* charset/1001, not sortorder */

    master.dbo.syscharsets b_cha /* sortorder/2001, not charset */

    where

    (@schema_name is null or @schema_name = user_name(o.uid))

    and (@schema_owner is null or @schema_owner = user_name(o.uid))

    and a_cha.type = 1001 /* type is charset */

    and b_cha.type = 2001 /* type is sortorder */

    and a_cha.id = b_cha.csid

    and b_cha.id = cfg.value

    order by 2

    go

    dump tran master with no_log

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_schemata_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    create procedure sp_schemata_rowset

    (

    @schema_name sysname = null,

    @schema_owner sysname = null

    )

    as

    select distinct

    CATALOG_NAME = db_name(),

    SCHEMA_NAME = user_name(o.uid),

    SCHEMA_OWNER = user_name(o.uid),

    DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,N'master'),

    DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,N'dbo'),

    DEFAULT_CHARACTER_SET_NAME = convert(sysname,a_cha.name)

    from

    sysobjects o,

    master.dbo.syscharsets a_cha /* charset/1001, not sortorder */

    where

    (@schema_name is null or @schema_name = user_name(o.uid))

    and (@schema_owner is null or @schema_owner = user_name(o.uid))

    and a_cha.type = 1001 /* type is charset */

    and a_cha.id = convert(tinyint, DatabasePropertyEx(db_name(), 'sqlcharset')) /* what is charset of a table? */

    order by 2

    go

    dump tran master with no_log

    go

    /* The following stored procedure is used for Sphinx and Hydra */

    create procedure sp_schemata_rowset;3

    as

    select

    CATALOG_NAME = convert(sysname,' '),

    SCHEMA_NAME = convert(sysname,' '),

    SCHEMA_OWNER = convert(sysname,' '),

    DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,' '),

    DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,' '),

    DEFAULT_CHARACTER_SET_NAME = convert(sysname,' ')

    where 1=0

    go

    grant execute on sp_schemata_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_schemata_rowset' and type = 'P '))

    begin

    drop procedure sp_schemata_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_statistics_rowset'

    go

    /* 6.0 and 6.5 version */

    create procedure sp_statistics_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null

    )

    as

    select db_name() as TABLE_CATALOG,

    user_name(o.uid) as TABLE_SCHEMA,

    o.name as TABLE_NAME,

    x.rows as CARDINALITY

    from sysobjects o, sysindexes x, sysusers u

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and x.id = o.id

    and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_statistics_rowset;2

    (

    @table_schema varchar(255) = null

    )

    as

    select db_name() as TABLE_CATALOG,

    user_name(o.uid) as TABLE_SCHEMA,

    o.name as TABLE_NAME,

    x.rows as CARDINALITY

    from sysobjects o, sysindexes x, sysusers u

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and x.id = o.id

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_statistics_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* 8.0 version */

    create procedure sp_statistics_rowset

    (

    @table_name sysname,

    @table_schema sysname = null

    )

    as

    select db_name() as TABLE_CATALOG,

    user_name(o.uid) as TABLE_SCHEMA,

    o.name as TABLE_NAME,

    x.rows as CARDINALITY

    from sysobjects o, sysindexes x

    where o.type in ('U')

    and o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and x.id = o.id

    and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */

    and permissions(o.id) <> 0

    order by 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_statistics_rowset;2

    (

    @table_schema sysname = null

    )

    as

    select db_name() as TABLE_CATALOG,

    user_name(o.uid) as TABLE_SCHEMA,

    o.name as TABLE_NAME,

    x.rows as CARDINALITY

    from sysobjects o, sysindexes x

    where o.type in ('U')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and x.id = o.id

    and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */

    and permissions(o.id) <> 0

    order by 2, 3

    go

    grant execute on sp_statistics_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_statistics_rowset' and type = 'P '))

    begin

    drop procedure sp_statistics_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_tables_rowset'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_tables_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int,null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysusers u, sysobjects o

    where o.type in ('U','V','S')

    and o.name = @table_name

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_rowset;2

    (

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int,null),

    DATE_CREATED = o.crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysusers u, sysobjects o

    where o.type in ('U','V','S')

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_tables_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_tables_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(uid),

    TABLE_NAME = name,

    TABLE_TYPE = convert(nvarchar(30),

    case type

    when 'U' then

    case when ObjectProperty(id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int,null),

    DATE_CREATED = crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysobjects

    where name = @table_name

    and type in ('U','V','S')

    and permissions(id) <> 0

    ) as o

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_rowset;2

    (

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(uid),

    TABLE_NAME = name,

    TABLE_TYPE = convert(nvarchar(30),

    case type

    when 'U' then

    case when ObjectProperty(id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int,null),

    DATE_CREATED = crdate,

    DATE_MODIFIED = convert(datetime,null)

    from sysobjects

    where type in ('U','V','S')

    and permissions(id) <> 0

    ) as o

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null,

    @table_type sysname = null

    )

    as

    select

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    TABLE_TYPE,

    TABLE_GUID,

    DESCRIPTION

    -- TABLE_PROPID,

    -- DATE_CREATED,

    -- DATE_MODIFIED

    from master.dbo.SYSREMOTE_TABLES (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    @table_type )

    order by 4,1,2,3

    go

    grant execute on sp_tables_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_tables_rowset' and type = 'P '))

    begin

    drop procedure sp_tables_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_tables_info_rowset'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_tables_info_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysusers u,

    sysobjects o,

    sysindexes x

    where o.type in ('U','V','S')

    and o.name = @table_name

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and o.id *= x.id

    and x.indid in (0,1)

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset;2

    (

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysusers u,

    sysobjects o,

    sysindexes x

    where o.type in ('U','V','S')

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and o.id *= x.id

    and x.indid in (0,1)

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_tables_info_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 server */

    create procedure sp_tables_info_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.name = @table_name

    and o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset;2

    (

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_tables_info_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_tables_info_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.name = @table_name

    and o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset;2

    (

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    grant execute on sp_tables_info_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_tables_info_rowset' and type = 'P '))

    begin

    drop procedure sp_tables_info_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_tables_info_rowset_64'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_tables_info_rowset_64

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysusers u,

    sysobjects o,

    sysindexes x

    where o.type in ('U','V','S')

    and o.name = @table_name

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and o.id *= x.id

    and x.indid in (0,1)

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset_64;2

    (

    @table_schema varchar(255) = null,

    @table_type varchar(255) = null

    )

    as

    select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(varchar(30),

    case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end),

    TABLE_GUID = convert(binary(16), null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(varchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysusers u,

    sysobjects o,

    sysindexes x

    where o.type in ('U','V','S')

    and ( @table_schema is null

    or @table_schema = user_name(o.uid)

    )

    and (

    @table_type is null

    or @table_type = case o.type

    when 'U' then 'TABLE'

    when 'V' then 'VIEW'

    when 'S' then 'SYSTEM TABLE'

    end

    )

    and o.id *= x.id

    and x.indid in (0,1)

    and u.uid = user_id() /* constrain sysusers uid for use in subquery */

    and (

    suser_id() = 1 /* User is the System Administrator */

    or o.uid = user_id() /* User created the object */

    /* here's the magic... select the highest precedence of permissions in the order (user,group,public) */

    or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))

    from sysprotects p

    /* join to correlate with all rows in sysobjects */

    where p.id = o.id

    /* get rows for public,current user,user's group */

    and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)

    /* check for SELECT,EXECUTE privilege */

    and (action in (193,224)))&1 /* more magic...normalize GRANT */

    ) = 1 /* final magic...compare Grants */

    )

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_tables_info_rowset_64

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 7.0 server */

    create procedure sp_tables_info_rowset_64

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.name = @table_name

    and o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset_64;2

    (

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(int, o.schema_ver),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    if (charindex('8.00', @@version) > 0)

    drop procedure sp_tables_info_rowset_64

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_tables_info_rowset_64

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.name = @table_name

    and o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    dump tran master with no_log

    go

    create procedure sp_tables_info_rowset_64;2

    (

    @table_schema sysname = null,

    @table_type nvarchar(255) = null

    )

    as

    select *

    from (select TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    TABLE_TYPE = convert(nvarchar(30),

    case o.type

    when 'U' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'TABLE' else N'SYSTEM TABLE' end

    when 'S' then N'SYSTEM TABLE'

    when 'V' then

    case when ObjectProperty(o.id, 'IsMSShipped') = 0

    then N'VIEW' else N'SYSTEM VIEW' end

    end),

    TABLE_GUID = convert(uniqueidentifier, null),

    BOOKMARKS = convert(bit, 1),

    BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),

    BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),

    BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),

    BOOKMARK_INFORMATION = convert(int, 0),

    TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),

    CARDINALITY = x.rows,

    DESCRIPTION = convert(nvarchar(1), null),

    TABLE_PROPID = convert(int, null)

    from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)

    where o.type in ('U','V','S')

    and permissions(o.id) <> 0) as t

    where (@table_schema is null or @table_schema = TABLE_SCHEMA)

    and (@table_type is null or @table_type = TABLE_TYPE)

    order by 4, 2, 3

    go

    grant execute on sp_tables_info_rowset_64 to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_tables_info_rowset_64' and type = 'P '))

    begin

    drop procedure sp_tables_info_rowset_64

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_table_constraints_rowset'

    go

    /* Procedure for 6.50 and earlier servers */

    create procedure sp_table_constraints_rowset

    (

    @table_name varchar(255),

    @table_schema varchar(255) = null,

    @table_catalog varchar(255) = null,

    @constraint_name varchar(255) = null,

    @constraint_schema varchar(255) = null,

    @constraint_catalog varchar(255) = null,

    @constraint_type varchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_TYPE = case (c.status & 0xf)

    when 1 then 'PRIMARY KEY'

    when 2 then 'UNIQUE'

    when 3 then 'FOREIGN KEY'

    when 4 then 'CHECK'

    end,

    IS_DEFERRABLE = convert(tinyint, 0),

    INITIALLY_DEFERRED = convert(tinyint, 0),

    DESCRIPTION = convert(varchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c

    where

    t_obj.name = @table_name

    and t_obj.type in ('U','S')

    and (@table_catalog is null or @table_catalog = db_name())

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c.id = t_obj.id

    and (c.status & 0xf) between 1 and 4

    and c_obj.id = c.constid

    and c_obj.uid = user_id()

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_catalog is null or @constraint_catalog = db_name())

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and (@constraint_type is null

    or (c.status & 0xf)

    = case @constraint_type

    when 'PRIMARY KEY' then 1

    when 'UNIQUE' then 2

    when 'FOREIGN KEY' then 3

    when 'CHECK' then 4

    end)

    order by 2,3,5,6,7

    go

    dump tran master with no_log

    go

    create procedure sp_table_constraints_rowset;2

    (

    @table_schema varchar(255) = null,

    @table_catalog varchar(255) = null,

    @constraint_name varchar(255) = null,

    @constraint_schema varchar(255) = null,

    @constraint_catalog varchar(255) = null,

    @constraint_type varchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_TYPE = case (c.status & 0xf)

    when 1 then 'PRIMARY KEY'

    when 2 then 'UNIQUE'

    when 3 then 'FOREIGN KEY'

    when 4 then 'CHECK'

    end,

    IS_DEFERRABLE = convert(tinyint, 0),

    INITIALLY_DEFERRED = convert(tinyint, 0),

    DESCRIPTION = convert(varchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c

    where

    t_obj.type in ('U','S')

    and (@table_catalog is null or @table_catalog = db_name())

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c.id = t_obj.id

    and (c.status & 0xf) between 1 and 4

    and c_obj.id = c.constid

    and c_obj.uid = user_id()

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_catalog is null or @constraint_catalog = db_name())

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and (@constraint_type is null

    or (c.status & 0xf)

    = case @constraint_type

    when 'PRIMARY KEY' then 1

    when 'UNIQUE' then 2

    when 'FOREIGN KEY' then 3

    when 'CHECK' then 4

    end)

    order by 2,3,5,6,7

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) > 0 or

    charindex('8.00', @@version) > 0)

    drop procedure sp_table_constraints_rowset

    else

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_table_constraints_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @constraint_name sysname = null,

    @constraint_schema sysname = null,

    @constraint_catalog sysname = null,

    @constraint_type nvarchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_TYPE = case (c.status & 0xf)

    when 1 then N'PRIMARY KEY'

    when 2 then N'UNIQUE'

    when 3 then N'FOREIGN KEY'

    when 4 then N'CHECK'

    end,

    IS_DEFERRABLE = convert(bit, 0),

    INITIALLY_DEFERRED = convert(bit, 0),

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c

    where

    t_obj.name = @table_name

    and t_obj.type in ('U','S')

    and (@table_catalog is null or @table_catalog = db_name())

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c.id = t_obj.id

    and (c.status & 0xf) between 1 and 4

    and c_obj.id = c.constid

    and c_obj.uid = user_id()

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_catalog is null or @constraint_catalog = db_name())

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and (@constraint_type is null

    or (c.status & 0xf)

    = case @constraint_type

    when N'PRIMARY KEY' then 1

    when N'UNIQUE' then 2

    when N'FOREIGN KEY' then 3

    when N'CHECK' then 4

    end)

    order by 2,3,5,6,7

    go

    dump tran master with no_log

    go

    create procedure sp_table_constraints_rowset;2

    (

    @table_schema sysname = null,

    @table_catalog sysname = null,

    @constraint_name sysname = null,

    @constraint_schema sysname = null,

    @constraint_catalog sysname = null,

    @constraint_type nvarchar(255) = null

    )

    as

    select

    CONSTRAINT_CATALOG = db_name(),

    CONSTRAINT_SCHEMA = user_name(c_obj.uid),

    CONSTRAINT_NAME = c_obj.name,

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(t_obj.uid),

    TABLE_NAME = t_obj.name,

    CONSTRAINT_TYPE = case (c.status & 0xf)

    when 1 then N'PRIMARY KEY'

    when 2 then N'UNIQUE'

    when 3 then N'FOREIGN KEY'

    when 4 then N'CHECK'

    end,

    IS_DEFERRABLE = convert(bit, 0),

    INITIALLY_DEFERRED = convert(bit, 0),

    DESCRIPTION = convert(nvarchar(1), null)

    from

    sysobjects c_obj, sysobjects t_obj, sysconstraints c

    where

    t_obj.type in ('U','S')

    and (@table_catalog is null or @table_catalog = db_name())

    and (@table_schema is null or @table_schema = user_name(t_obj.uid))

    and c.id = t_obj.id

    and (c.status & 0xf) between 1 and 4

    and c_obj.id = c.constid

    and c_obj.uid = user_id()

    and (@constraint_name is null or c_obj.name = @constraint_name)

    and (@constraint_catalog is null or @constraint_catalog = db_name())

    and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))

    and (@constraint_type is null

    or (c.status & 0xf)

    = case @constraint_type

    when N'PRIMARY KEY' then 1

    when N'UNIQUE' then 2

    when N'FOREIGN KEY' then 3

    when N'CHECK' then 4

    end)

    order by 2,3,5,6,7

    go

    dump tran master with no_log

    grant execute on sp_table_constraints_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_table_constraints_rowset' and type = 'P '))

    begin

    drop procedure sp_table_constraints_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_table_privileges_rowset'

    go

    /* Procedure for 6.0 and 6.5 server */

    CREATE PROCEDURE sp_table_privileges_rowset

    (

    @table_name varchar(255) = null,

    @table_schema varchar(255) = null,

    @grantor varchar(255) = null,

    @grantee varchar(255) = null

    )

    as

    IF @table_name is not null

    BEGIN

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and o.type in ('U','V','S')

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and o.type in ('U','V','S')

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    END

    ELSE

    BEGIN

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    END

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_table_privileges_rowset;2

    (

    @handle int output,

    @scrollopt int output,

    @ccopt int output,

    @rows int output,

    @table_name varchar(255) = null,

    @table_schema varchar(255) = null,

    @grantor varchar(255) = null,

    @grantee varchar(255) = null

    )

    as

    declare @ret int

    SET NOCOUNT ON

    create table #sptprivsrowset1

    (

    GRANTOR sysname not null,

    GRANTEE sysname not null,

    TABLE_CATALOG sysname not null,

    TABLE_SCHEMA sysname not null,

    TABLE_NAME sysname not null,

    PRIVILEGE_TYPE sysname not null,

    IS_GRANTABLE bit not null

    )

    IF @table_name is not null

    BEGIN

    insert into #sptprivsrowset1

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and o.type in ('U','V','S')

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and o.type in ('U','V','S')

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    END

    ELSE

    BEGIN

    insert into #sptprivsrowset1

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case p.action

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups */

    and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(varchar(30),

    case v.number

    when 193 then 'SELECT'

    when 195 then 'INSERT'

    when 196 then 'DELETE'

    when 197 then 'UPDATE'

    else 'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    END

    exec @ret = sp_cursoropen @handle output, 'select * from #sptprivsrowset1',

    @scrollopt output, @ccopt output, @rows output

    drop table #sptprivsrowset1

    return isnull(@ret,0)

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_table_privileges_rowset;3

    as

    select

    GRANTOR = convert(sysname, ' '),

    GRANTEE = convert(sysname, ' '),

    TABLE_CATALOG = convert(sysname, ' '),

    TABLE_SCHEMA = convert(sysname, ' '),

    TABLE_NAME = convert(sysname, ' '),

    PRIVILEGE_TYPE = convert(varchar(30), ' '),

    IS_GRANTABLE = convert(bit, 0)

    where 1=0

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_table_privileges_rowset

    go

    /* Procedure for 8.0 server */

    CREATE PROCEDURE sp_table_privileges_rowset

    (

    @table_name sysname,

    @table_schema sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case p.action

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 196 then N'DELETE'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, sysmembers m

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and o.type in ('U','V','S')

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups - AKUNDONE: only 1 level of grp unrolling. */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case v.number

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 196 then N'DELETE'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.name = @table_name

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and o.type in ('U','V','S')

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    go

    dump tran master with no_log

    go

    CREATE PROCEDURE sp_table_privileges_rowset;2

    (

    @table_schema sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR = user_name(p.grantor),

    GRANTEE = user_name(u.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case p.action

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 196 then N'DELETE'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)

    from

    sysprotects p, sysobjects o, sysusers u, sysmembers m

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(u.uid))

    and p.id = o.id

    and (@grantor is null or @grantor = user_name(p.grantor))

    /* expand groups - AKUNDONE: only 1 level of grp unrolling. */

    and (u.uid > 0 and u.uid < 16384)

    and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))

    and p.protecttype <> 206 /* only grant rows */

    and p.action in (26,193,195,196,197)

    and o.uid <> u.uid /* no rows for owner */

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = p.action

    and p1.id = p.id

    and p1.uid = u.uid)

    union

    select /* Add rows for table owner */

    GRANTOR = user_name(u.uid),

    GRANTEE = user_name(o.uid),

    TABLE_CATALOG = db_name(),

    TABLE_SCHEMA = user_name(o.uid),

    TABLE_NAME = o.name,

    PRIVILEGE_TYPE = convert(nvarchar(30),

    case v.number

    when 193 then N'SELECT'

    when 195 then N'INSERT'

    when 196 then N'DELETE'

    when 197 then N'UPDATE'

    else N'REFERENCES'

    end),

    IS_GRANTABLE = convert(bit,1)

    from

    sysobjects o, master.dbo.spt_values v, sysusers u

    where

    o.type in ('U','V','S')

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@grantee is null or @grantee = user_name(o.uid))

    and u.uid = 1 /* grantor is dbo of database */

    and (@grantor is null or @grantor = user_name(u.uid))

    and v.type = 'P' /* cross product to get all exposed privileges */

    and v.number in (26,193,195,196,197)

    and not exists ( /* exclude revoke'd privileges */

    select *

    from sysprotects p1

    where p1.protecttype = 206

    and p1.action = v.number

    and p1.id = o.id

    and p1.uid = o.uid)

    order by 4,5,6,1,2

    go

    dump tran master with no_log

    go

    create procedure sp_table_privileges_rowset;5

    (

    @table_server sysname,

    @table_catalog sysname = null,

    @table_name sysname = null,

    @table_schema sysname = null,

    @grantor sysname = null,

    @grantee sysname = null

    )

    as

    select

    GRANTOR,

    GRANTEE,

    TABLE_CATALOG,

    TABLE_SCHEMA,

    TABLE_NAME,

    PRIVILEGE_TYPE,

    IS_GRANTABLE

    from master.dbo.SYSREMOTE_TABLE_PRIVILEGES (

    @table_server,

    @table_catalog,

    @table_schema,

    @table_name,

    @grantor,

    @grantee )

    order by 3,4,5,6,1,2

    go

    grant execute on sp_table_privileges_rowset to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_table_privileges_rowset' and type = 'P '))

    begin

    drop proc sp_table_privileges_rowset

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_linkedservers_rowset'

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create proc sp_linkedservers_rowset

    (

    @srvname sysname

    )

    as

    select

    SVR_NAME = srvname,

    SVR_PRODUCT = srvproduct,

    SVR_PROVIDERNAME= providername,

    SVR_DATASOURCE= datasource,

    SVR_PROVIDERSTRING = case when is_srvrolemember('sysadmin') = 1 then providerstring else NULL end,

    SVR_LOCATION= location,

    SVR_CATALOG = catalog

    from master.dbo.sysservers

    where srvname = @srvname and (srvstatus & 128) = 128

    order by 1

    go

    dump tran master with no_log

    go

    create proc sp_linkedservers_rowset;2

    as

    select

    SVR_NAME = srvname,

    SVR_PRODUCT = srvproduct,

    SVR_PROVIDERNAME= providername,

    SVR_DATASOURCE= datasource,

    SVR_PROVIDERSTRING = case when is_srvrolemember('sysadmin') = 1 then providerstring else NULL end,

    SVR_LOCATION= location,

    SVR_CATALOG = catalog

    from master.dbo.sysservers

    where (srvstatus & 128) = 128

    order by 1

    go

    grant execute on sp_linkedservers_rowset to public

    go

    dump tran master with no_log

    go

    print ''

    print 'creating sp_table_statistics_rowset'

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.00 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.00 server */

    create proc sp_table_statistics_rowset

    as

    select

    TABLE_CATALOG = convert(sysname, null),

    TABLE_SCHEMA = convert(sysname, null),

    TABLE_NAME = convert(sysname, null),

    STATISTICS_CATALOG = convert(sysname, null),

    STATISTICS_SCHEMA = convert(sysname, null),

    STATISTICS_NAME = convert(sysname, null),

    STATISTICS_TYPE = convert(smallint,0),

    COLUMN_NAME = convert(sysname, null),

    COLUMN_GUID = convert(uniqueidentifier, null),

    COLUMN_PROPID = convert(int, null),

    ORDINAL_POSITION = convert(int, null),

    SAMPLE_PCT = convert(smallint, null),

    LAST_UPDATE_TIME = convert(datetime, null),

    NO_OF_RANGES = convert(int, null),

    COLUMN_CARDINALITY = convert(bigint, null),

    TUPLE_CARDINALITY = convert(bigint, null),

    TABLE_CARDINALITY = convert(bigint, null),

    AVG_COLUMN_LENGTH = convert(int, null)

    where 1=0

    go

    dump tran master with no_log

    go

    create proc sp_table_statistics_rowset;2

    (@table_catalog sysname = null,

    @table_schema sysname = null,

    @table_name sysname = null,

    @stat_catalog sysname = null,

    @stat_schema sysname = null,

    @stat_name sysname = null)

    as

    begin

    set nocount on

    -- check in parameters

    if ((@table_catalog is not null) and (db_name() <> @table_catalog)

    or (@stat_catalog is not null) and (db_name() <> @stat_catalog))

    begin /* If qualifier doesn't match current database */

    raiserror 20001 '~~Rush_5~~'

    return

    end

    --- create temp table

    create table #spstattab(

    tblcatalog sysname collate database_default not null,

    tblschema sysname collate database_default not null,

    tblname sysname collate database_default not null,

    statname sysname collate database_default not null

    )

    insert into #spstattab

    select

    db_name(),

    user_name(o.uid),

    o.name,

    x.name

    from sysobjects o, sysindexes x

    where o.type in ('U')

    and (@table_name is null or o.name = @table_name)

    and (@table_schema is null or @table_schema = user_name(o.uid))

    and (@stat_name is null or @stat_name = x.name)

    and (@stat_schema is null or @stat_schema = user_name(o.uid))

    and x.id = o.id

    and permissions(o.id) <> 0

    and x.statblob is not null

    order by 1,2,3,4

    -- fast forward CURSOR OVER THE temp TABLE

    declare ff_csr cursor fast_forward for

    select tblcatalog, tblschema, tblname, statname from #spstattab

    declare @tblcatalog sysname,

    @tblschema sysname,

    @tblname sysname,

    @statname sysname,

    @qtbl nvarchar(4000),

    @rowsetcount int

    set @rowsetcount = 0

    open ff_csr

    fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname

    while @@fetch_status >= 0

    begin

    set @rowsetcount = @rowsetcount + 1

    set @qtbl = @tblcatalog + '.' + @tblschema + '.' + @tblname

    dbcc show_statistics(@qtbl, @statname) with stat_header join density_vector

    fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname

    end

    close ff_csr

    deallocate ff_csr

    --- drop temp table

    drop table #spstattab

    if @rowsetcount = 0

    begin

    select

    TABLE_CATALOG = convert(sysname, null),

    TABLE_SCHEMA = convert(sysname, null),

    TABLE_NAME = convert(sysname, null),

    STATISTICS_CATALOG = convert(sysname, null),

    STATISTICS_SCHEMA = convert(sysname, null),

    STATISTICS_NAME = convert(sysname, null),

    STATISTICS_TYPE = convert(smallint,0),

    COLUMN_NAME = convert(sysname, null),

    COLUMN_GUID = convert(uniqueidentifier, null),

    COLUMN_PROPID = convert(int, null),

    ORDINAL_POSITION = convert(int, null),

    SAMPLE_PCT = convert(smallint, null),

    LAST_UPDATE_TIME = convert(datetime, null),

    NO_OF_RANGES = convert(int, null),

    COLUMN_CARDINALITY = convert(bigint, null),

    TUPLE_CARDINALITY = convert(bigint, null),

    TABLE_CARDINALITY = convert(bigint, null),

    AVG_COLUMN_LENGTH = convert(int, null)

    where 1=0

    end

    set nocount off

    end

    go

    grant execute on sp_table_statistics_rowset to public

    go

    dump tran master with no_log

    go

    print ''

    print 'creating sp_oledb_column_constraints'

    go

    /* Procedure for 6.5 server */

    create procedure sp_oledb_column_constraints

    (@tblname varchar(225) -- the table to check for constraints

    ,@colname varchar(225) -- the column to check for constraints

    ,@dropcnst smallint)

    as

    begin

    -- PRELIM

    set nocount on

    declare @tblid int -- the object id of the table

    ,@cnstname varchar(225) -- name of const. currently under consideration

    ,@cnstid int

    ,@cnstatus int

    ,@dbname varchar(30)

    -- Create temp table

    create table #spcnsttab

    (cnst_name varchar(225) NOT NULL)

    -- Check to see that the object names are local to the current database.

    if @tblname like '%.%.%'

    and substring(@tblname, 1, charindex('.', @tblname) - 1) <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    -- Check to see if the table exists and initialize @objid.

    select @tblid = object_id(@tblname)

    if @tblid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@tblname,@dbname)

    return (1)

    end

    -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS

    declare cnst_csr insensitive cursor for

    select c.constid, c.status, o.name

    from sysconstraints c, sysobjects o

    where c.id = @tblid and o.id = c.constid

    and ((c.status & 0xf)=1 and (@dropcnst & 16)<> 0

    or (c.status & 0xf)=2 and (@dropcnst & 32)<> 0

    or (c.status & 0xf)=5 and (@dropcnst & 2)<> 0)

    -- ONLY 6.5 sysconstraints objects

    for read only

    -- Now check out each constraint, figure out its type and keys and

    -- save the info in a temporary table that we'll print out at the end.

    open cnst_csr

    fetch cnst_csr into @cnstid, @cnstatus, @cnstname

    while @@fetch_status >= 0

    begin

    if ((@cnstatus & 0xf) in (1, 2)) ---- primary key, unique

    begin

    -- get indid

    declare @indid smallint

    select @indid = indid

    from sysindexes

    where name = object_name(@cnstid) and id = @tblid

    if (@colname = index_col(@tblname, @indid, 1))

    and (index_col(@tblname, @indid, 2) is null)

    begin

    -- ADD TO TABLE

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    else

    if (@cnstatus & 0xf) = 5

    begin

    if (select col_name(id, colid) from sysconstraints where colid > 0 and constid=@cnstid) = @colname

    begin

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    fetch cnst_csr into @cnstid ,@cnstatus ,@cnstname

    end --of major loop

    close cnst_csr

    deallocate cnst_csr

    -- Now print out the contents of the temporary index table.

    select 'constraint_name' = cnst_name

    from #spcnsttab

    drop table #spcnsttab

    set nocount off

    return (0)

    end

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 7.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_oledb_column_constraints

    go

    /* Procedure for 7.0 server */

    create procedure sp_oledb_column_constraints

    (@tblname nvarchar(776) -- the table to check for constraints

    ,@colname nvarchar(776) -- the column to check for constraints

    ,@dropcnst smallint)

    as

    begin

    -- PRELIM

    set nocount on

    declare @tblid int -- the object id of the table

    ,@cnstname sysname -- name of const. currently under consideration

    ,@cnstid int

    ,@cnsttype character(2)

    ,@dbname sysname

    -- Create temp table

    create table #spcnsttab

    (cnst_name sysname NOT NULL)

    -- Check to see that the object names are local to the current database.

    select @dbname = parsename(@tblname,3)

    if @dbname is not null and @dbname <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    -- Check to see if the table exists and initialize @objid.

    select @tblid = object_id(@tblname)

    if @tblid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@tblname,@dbname)

    return (1)

    end

    -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS

    declare cnst_csr cursor fast_forward for

    select id, xtype, name

    from sysobjects

    where parent_obj = @tblid

    and ((xtype = 'PK' and (@dropcnst & 16)<> 0)

    or (xtype = 'UQ' and (@dropcnst & 32)<> 0)

    or (xtype = 'D ' and (@dropcnst & 2)<> 0))

    -- ONLY 6.5 sysconstraints objects

    for read only

    -- Now check out each constraint, figure out its type and keys and

    -- save the info in a temporary table that we'll print out at the end.

    open cnst_csr

    fetch cnst_csr into @cnstid, @cnsttype, @cnstname

    while @@fetch_status >= 0

    begin

    if @cnsttype in ('PK','UQ')

    begin

    -- get indid

    declare @indid smallint

    select @indid = indid

    from sysindexes

    where name = object_name(@cnstid) and id = @tblid

    if (@colname = index_col(@tblname, @indid, 1))

    and (index_col(@tblname, @indid, 2) is null)

    begin

    -- ADD TO TABLE

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    else

    if (@cnsttype = 'D ')

    begin

    if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname

    begin

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname

    end --of major loop

    close cnst_csr

    deallocate cnst_csr

    -- Now print out the contents of the temporary index table.

    select 'constraint_name' = cnst_name

    from #spcnsttab

    drop table #spcnsttab

    set nocount off

    return (0)

    end

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_oledb_column_constraints

    go

    /* Procedure for 8.0 server */

    create procedure sp_oledb_column_constraints

    (@tblname nvarchar(776) -- the table to check for constraints

    ,@colname nvarchar(776) -- the column to check for constraints

    ,@dropcnst smallint)

    as

    begin

    -- PRELIM

    set nocount on

    declare @tblid int -- the object id of the table

    ,@cnstname sysname -- name of const. currently under consideration

    ,@cnstid int

    ,@cnsttype character(2)

    ,@dbname sysname

    -- Create temp table

    create table #spcnsttab

    (cnst_name sysname collate database_default NOT NULL)

    -- Check to see that the object names are local to the current database.

    select @dbname = parsename(@tblname,3)

    if @dbname is not null and @dbname <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    -- Check to see if the table exists and initialize @objid.

    select @tblid = object_id(@tblname)

    if @tblid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@tblname,@dbname)

    return (1)

    end

    -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS

    declare cnst_csr cursor fast_forward for

    select id, xtype, name

    from sysobjects

    where parent_obj = @tblid

    and ((xtype = 'PK' and (@dropcnst & 16)<> 0)

    or (xtype = 'UQ' and (@dropcnst & 32)<> 0)

    or (xtype = 'D ' and (@dropcnst & 2)<> 0))

    -- ONLY 6.5 sysconstraints objects

    for read only

    -- Now check out each constraint, figure out its type and keys and

    -- save the info in a temporary table that we'll print out at the end.

    open cnst_csr

    fetch cnst_csr into @cnstid, @cnsttype, @cnstname

    while @@fetch_status >= 0

    begin

    if @cnsttype in ('PK','UQ')

    begin

    -- get indid

    declare @indid smallint

    select @indid = indid

    from sysindexes

    where name = object_name(@cnstid) and id = @tblid

    if (@colname = index_col(@tblname, @indid, 1))

    and (index_col(@tblname, @indid, 2) is null)

    begin

    -- ADD TO TABLE

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    else

    if (@cnsttype = 'D ')

    begin

    if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname

    begin

    insert into #spcnsttab

    values (@cnstname)

    end

    end

    fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname

    end --of major loop

    close cnst_csr

    deallocate cnst_csr

    -- Now print out the contents of the temporary index table.

    select 'constraint_name' = cnst_name

    from #spcnsttab

    drop table #spcnsttab

    set nocount off

    return (0)

    end

    go

    grant execute on sp_oledb_column_constraints to public

    go

    dump tran master with no_log

    go

    print ''

    print 'creating sp_oledb_indexinfo'

    go

    /* Procedure for 6.5 server */

    create procedure sp_oledb_indexinfo

    @objname varchar(225) -- the table to check for indexes

    ,@indname varchar(225)

    as

    begin

    -- PRELIM

    set nocount on

    declare @objid int, -- the object id of the table

    @indid smallint, -- the index id of an index

    @status int,

    @dbname varchar(30),

    @OrigFillFactor tinyint,

    @i int,

    @thiskey varchar(32),

    @tptr varbinary(16) -- pointer for building text strings.

    ---- Check to see that the object names are local to the current database.

    if @objname like '%.%.%'

    and substring(@objname, 1, charindex('.', @objname) - 1) <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    ---- Check to see if the table exists and initialize @objid.

    select @objid = object_id(@objname)

    ---- Table does not exist so return.

    if @objid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@objname,@dbname)

    return (1)

    end

    select @indid = indid, @status = status, @OrigFillFactor = OrigFillFactor

    from sysindexes

    where id = @objid and name = @indname

    -- IF NO INDEX, QUIT

    if @indid is NULL

    begin

    raiserror(15472,-1,-1) --'Object does not have any indexes.'

    return (1)

    end

    -- create temp table

    create table #spindtab

    (

    status int,

    OrigFillFactor tinyint,

    index_keys text NOT NULL,

    )

    -- Now check out each index, figure out its type and keys and

    -- First we'll figure out what the keys are.

    select @i = 1

    while (@i <= 16)

    begin

    select @thiskey = index_col(@objname, @indid, @i)

    if @thiskey is NULL

    goto keysdone

    if @i=1

    begin

    insert into #spindtab

    values (@status, @OrigFillFactor, @thiskey)

    select @tptr = textptr(index_keys) from #spindtab

    end

    else

    begin

    select @thiskey = ', ' + @thiskey

    if @tptr is not null

    updatetext #spindtab.index_keys @tptr null null @thiskey

    end

    select @i = @i + 1

    end --loop 16

    ---- When we get here we now have all the keys.

    keysdone:

    select * from #spindtab

    drop table #spindtab

    set nocount off

    return (0)

    end

    go

    dump tran master with no_log

    go

    if (charindex('7.00', @@version) = 0 and

    charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    else

    drop proc sp_oledb_indexinfo

    go

    /* Procedure for 8.0 server */

    create proc sp_oledb_indexinfo

    @objname nvarchar(776) -- the table to check for indexes

    ,@indname nvarchar(776)

    as

    begin

    -- PRELIM

    set nocount on

    declare @objid int, -- the object id of the table

    @indid smallint, -- the index id of an index

    @status int,

    @keys nvarchar(2078),-- string build index key list, length = (16*max_id_length)+(15*2)

    @dbname sysname,

    @OrigFillFactor tinyint

    -- Check to see that the object names are local to the current database.

    select @dbname = parsename(@objname,3)

    if @dbname is not null and @dbname <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    -- Check to see the the table exists and initialize @objid.

    select @objid = object_id(@objname)

    if @objid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@objname,@dbname)

    return (1)

    end

    select @indid = indid, @status = status, @OrigFillFactor = OrigFillFactor

    from sysindexes

    where id = @objid and name = @indname

    -- IF NO INDEX, QUIT

    if @indid is NULL

    begin

    raiserror(15472,-1,-1) --'Object does not have any indexes.'

    return (1)

    end

    -- First we'll figure out what the keys are.

    declare @i int, @thiskey sysname

    select @keys = index_col(@objname, @indid, 1),

    @i = 2, @thiskey = index_col(@objname, @indid, 2)

    while (@thiskey is not null )

    begin

    select @keys = @keys + ', ' + @thiskey, @i = @i + 1

    select @thiskey = index_col(@objname, @indid, @i)

    end

    -- DISPLAY THE RESULTS

    select 'Status'=@status, 'OrigFillFactor' =@OrigFillFactor, 'Index keys'=@keys

    set nocount off

    return (0)

    end

    go

    grant execute on sp_oledb_indexinfo to public

    go

    dump tran master with no_log

    go

    print ''

    print 'creating sp_oledb_ro_usrname'

    go

    create procedure sp_oledb_ro_usrname

    as

    begin

    select substring('NY',status/1024&1+1,1),user_name()

    from master..sysdatabases

    where name=DB_NAME()

    end

    go

    grant execute on sp_oledb_ro_usrname to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_oledb_ro_usrname' and type = 'P '))

    begin

    drop proc sp_oledb_ro_usrname

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_oledb_deflang'

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_oledb_deflang

    as

    begin

    select ISNULL(language,'us_english')

    from master..syslogins

    where sid=SUSER_SID()

    end

    go

    grant execute on sp_oledb_deflang to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_oledb_deflang' and type = 'P '))

    begin

    drop proc sp_oledb_deflang

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_oledb_defdb'

    go

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    create procedure sp_oledb_defdb

    as

    begin

    select dbname from master..syslogins where sid=SUSER_SID()

    end

    go

    grant execute on sp_oledb_defdb to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_oledb_defdb' and type = 'P '))

    begin

    drop proc sp_oledb_defdb

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_oledb_database'

    go

    create procedure sp_oledb_database

    as

    begin

    select name from master..sysdatabases

    end

    go

    grant execute on sp_oledb_database to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_oledb_database' and type = 'P '))

    begin

    drop proc sp_oledb_database

    dump tran master with no_log

    end

    end

    go

    print ''

    print 'creating sp_oledb_language'

    go

    create procedure sp_oledb_language

    as

    begin

    select 'English','us_english'

    union

    select alias,name from master..syslanguages

    end

    go

    grant execute on sp_oledb_language to public

    go

    dump tran master with no_log

    go

    if (charindex('6.00', @@version) > 0 or

    charindex('6.50', @@version) > 0 or

    charindex('7.00', @@version) > 0)

    begin

    if (exists (select * from sysobjects

    where name = 'sp_oledb_language' and type = 'P '))

    begin

    drop proc sp_oledb_language

    dump tran master with no_log

    end

    end

    go

    /*---------------------------- END OLEDB CATALOG PROCS ------------------------*/

    /*---------------------------- BEGIN BCP CATALOG PROCS ------------------------*/

    print 'creating sp_tablecollations'

    go

    /* Used by BCP to gather all the collation names for a table */

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_tablecollations (@object nvarchar(4000))

    as

    begin

    select c.colid,

    c.name,

    tds_collation = c.tdscollation,

    collation_name = BCPCollationName(c.tdscollation, c.xtype)

    from syscolumns c inner join sysobjects t on c.id = t.id

    where t.id = object_id(@object, 'local')

    order by c.colid

    end

    go

    grant execute on sp_tablecollations to public

    go

    print 'creating sp_bcp_dbcmptlevel'

    go

    /* Used by BCP to get current db compatibility level */

    if (charindex('8.00', @@version) = 0)

    begin

    print ''

    print ''

    print 'Warning:'

    print 'you are installing the stored procedures '

    print 'on a pre 8.0 SQL Server.'

    print 'Ignore the following errors.'

    end

    go

    /* Procedure for 8.0 server */

    create procedure sp_bcp_dbcmptlevel (@dbname sysname)

    as

    begin

    select cmptlevel

    from master.dbo.sysdatabases

    where name = @dbname

    end

    go

    grant execute on sp_bcp_dbcmptlevel to public

    go

    /*---------------------------- END BCP CATALOG PROCS ------------------------*/

    dump tran master with no_log

    go

    if (exists (select * from sysobjects

    where name = 'sp_configure' and type = 'P '))

    begin

    exec sp_configure 'allow updates',0

    reconfigure with override

    end

    go

    exec sp_MS_upd_sysobj_category 2 /* set category | 2 based on crdate. */

    go

    if exists (select * from sysobjects where name = 'sp_check_objects'

    and type = 'P ')

    begin

    /* Only supported on 6.0 servers */

    print ''

    print 'Checking objects created by instcat.sql.'

    exec sp_check_objects 'catalog'

    end

    go

    print ''

    print 'instcat.sql completed successfully.'

    go

    set quoted_identifier off

    go

    dump tran master with no_log

    go

    checkpoint

    go

    /**/

  • /**** SCRIPT INSTCAT.SQL OUTPUT ****/

    Changed database context to 'master'.

    Configuration option 'allow updates' changed from 0 to 1. Run the RECONFIGURE statement to install.

    Msg 2812, Level 16, State 62, Server SERVERNAME, Line 2

    Could not find stored procedure 'sp_MS_upd_sysobj_category'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_tables', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_statistics', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_columns', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_fkeys', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_pkeys', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_stored_procedures', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_sproc_columns', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_table_privileges', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_column_privileges', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_server_info', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_datatype_info', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_special_columns', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_databases', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_ddopen', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 3

    Cannot drop the procedure 'sp_tableswc', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_tablecollations', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_bcp_dbcmptlevel', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_catalogs_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_column_privileges_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_columns_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_check_constraints_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_check_constbytable_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_foreign_keys_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_indexes_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_primary_keys_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_procedure_params_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_procedures_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_provider_types_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_schemata_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_statistics_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_tables_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_tables_info_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_tables_info_rowset_64', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_table_constraints_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_table_privileges_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_linkedservers_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_table_statistics_rowset', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_oledb_ro_usrname', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_oledb_deflang', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_oledb_defdb', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_oledb_database', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_oledb_language', because it does not exist or you do not have permission.

    creating table spt_datatype_info_ext

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following error.

    (1 rows affected)

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating table spt_datatype_info

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following error.

    (1 rows affected)

    (1 rows affected)

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating table spt_server_info

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_add_server_sortinfo', because it does not exist or you do not have permission.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 5

    Cannot drop the procedure 'sp_add_server_sortinfo75', because it does not exist or you do not have permission.

    (1 rows affected)

    creating sp_column_privileges

    Warning:

    you are installing the stored procedures

    on a pre 6.50 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_column_privileges, Line 32

    There is already an object named 'sp_column_privileges' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_column_privileges, Line 40

    There is already an object named 'sp_column_privileges' in the database.

    creating sp_columns

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns, Line 91

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns, Line 146

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following error.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns, Line 110

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns, Line 181

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_columns, Line 123

    There is already an object named 'sp_columns' in the database.

    creating sp_databases

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_databases, Line 32

    There is already an object named 'sp_databases' in the database.

    creating sp_datatype_info

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_datatype_info, Line 35

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_datatype_info, Line 67

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following errors.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_datatype_info, Line 56

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_datatype_info, Line 112

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_datatype_info, Line 22

    There is already an object named 'sp_datatype_info' in the database.

    creating sp_fkeys

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_fkeys, Line 404

    There is already an object named 'sp_fkeys' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_fkeys, Line 287

    There is already an object named 'sp_fkeys' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_fkeys, Line 287

    There is already an object named 'sp_fkeys' in the database.

    creating sp_pkeys

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following error.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_pkeys, Line 37

    There is already an object named 'sp_pkeys' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_pkeys, Line 38

    There is already an object named 'sp_pkeys' in the database.

    creating sp_server_info

    creating sp_special_columns

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_special_columns, Line 104

    There is already an object named 'sp_special_columns' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_special_columns, Line 116

    There is already an object named 'sp_special_columns' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_special_columns, Line 116

    There is already an object named 'sp_special_columns' in the database.

    creating sp_sproc_columns

    Warning:

    you are installing the stored procedures

    on a pre 6.0 SQL Server.

    Ignore the following error.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_sproc_columns, Line 157

    There is already an object named 'sp_sproc_columns' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_sproc_columns, Line 166

    There is already an object named 'sp_sproc_columns' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_sproc_columns, Line 247

    There is already an object named 'sp_sproc_columns' in the database.

    creating sp_statistics

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_statistics, Line 189

    There is already an object named 'sp_statistics' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_statistics, Line 189

    There is already an object named 'sp_statistics' in the database.

    creating sp_stored_procedures

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_stored_procedures, Line 76

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_stored_procedures, Line 52

    There is already an object named 'sp_stored_procedures' in the database.

    creating sp_table_privileges

    Warning:

    you are installing the stored procedures

    on a pre 6.50 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_table_privileges, Line 23

    There is already an object named 'sp_table_privileges' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_table_privileges, Line 22

    There is already an object named 'sp_table_privileges' in the database.

    creating sp_tables

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_tables, Line 139

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 7

    Cannot drop the procedure 'sp_linkedservers', because it does not exist or you do not have permission.

    Creating 'sp_linkedservers'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_catalogs', because it does not exist or you do not have permission.

    Creating 'sp_catalogs'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_tables_ex', because it does not exist or you do not have permission.

    Creating 'sp_tables_ex'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_columns_ex', because it does not exist or you do not have permission.

    Creating 'sp_columns_ex'.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Creating 'sp_columns_ex'.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_columns_ex, Line 441

    There is already an object named 'sp_columns_ex' in the database.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_table_privileges_ex', because it does not exist or you do not have permission.

    Creating 'sp_table_privileges_ex'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_column_privileges_ex', because it does not exist or you do not have permission.

    Creating 'sp_column_privileges_ex'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_indexes', because it does not exist or you do not have permission.

    Creating 'sp_indexes'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_foreignkeys', because it does not exist or you do not have permission.

    Creating 'sp_foreignkeys'.

    Msg 3701, Level 11, State 5, Server SERVERNAME, Line 4

    Cannot drop the procedure 'sp_primarykeys', because it does not exist or you do not have permission.

    Creating 'sp_primarykeys'.

    Warning:

    you are installing the stored procedures

    on a pre 6.50 SQL Server.

    Ignore the following errors.

    creating sp_ddopen

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_ddopen, Line 165

    There is already an object named 'sp_ddopen' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_ddopen, Line 165

    There is already an object named 'sp_ddopen' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 30

    Procedure 'sp_ddopen' has already been created with group number 2. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 52

    Procedure 'sp_ddopen' has already been created with group number 3. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 40

    Procedure 'sp_ddopen' has already been created with group number 4. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 38

    Procedure 'sp_ddopen' has already been created with group number 5. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 27

    Procedure 'sp_ddopen' has already been created with group number 6. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 33

    Procedure 'sp_ddopen' has already been created with group number 7. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 43

    Procedure 'sp_ddopen' has already been created with group number 8. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 37

    Procedure 'sp_ddopen' has already been created with group number 9. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 29

    Procedure 'sp_ddopen' has already been created with group number 10. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 28

    Procedure 'sp_ddopen' has already been created with group number 11. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 35

    Procedure 'sp_ddopen' has already been created with group number 12. Create procedure with an unused group number.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_ddopen, Line 49

    Procedure 'sp_ddopen' has already been created with group number 13. Create procedure with an unused group number.

    creating sp_tableswc

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_tableswc, Line 39

    There is already an object named 'sp_tableswc' in the database.

    creating spt_provider_types

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    (1 rows affected)

    (1 rows affected)

    (1 rows affected)

    (1 rows affected)

    (1 rows affected)

    (1 rows affected)

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    (1 rows affected)

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_catalogs_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_catalogs_rowset, Line 8

    There is already an object named 'sp_catalogs_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_catalogs_rowset, Line 6

    Procedure 'sp_catalogs_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_column_privileges_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_column_privileges_rowset, Line 13

    There is already an object named 'sp_column_privileges_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_column_privileges_rowset, Line 9

    Procedure 'sp_column_privileges_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_columns_rowset

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns_rowset, Line 146

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_columns_rowset, Line 142

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_columns_rowset, Line 10

    There is already an object named 'sp_columns_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_columns_rowset, Line 10

    Procedure 'sp_columns_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_columns_rowset, Line 12

    Procedure 'sp_columns_rowset' has already been created with group number 5. Create procedure with an unused group number.

    creating sp_check_constraints_rowset

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_check_constraints_rowset, Line 9

    There is already an object named 'sp_check_constraints_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_check_constraints_rowset, Line 7

    Procedure 'sp_check_constraints_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_check_constbytable_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_check_constbytable_rowset, Line 11

    There is already an object named 'sp_check_constbytable_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_check_constbytable_rowset, Line 8

    Procedure 'sp_check_constbytable_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_foreign_keys_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_foreign_keys_rowset, Line 13

    There is already an object named 'sp_foreign_keys_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_foreign_keys_rowset, Line 10

    Procedure 'sp_foreign_keys_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_foreign_keys_rowset, Line 9

    Procedure 'sp_foreign_keys_rowset' has already been created with group number 3. Create procedure with an unused group number.

    creating sp_indexes_rowset

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_indexes_rowset, Line 10

    There is already an object named 'sp_indexes_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_indexes_rowset, Line 7

    Procedure 'sp_indexes_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_indexes_rowset, Line 10

    There is already an object named 'sp_indexes_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_indexes_rowset, Line 7

    Procedure 'sp_indexes_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_indexes_rowset, Line 10

    Procedure 'sp_indexes_rowset' has already been created with group number 5. Create procedure with an unused group number.

    creating sp_primary_keys_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_primary_keys_rowset, Line 9

    There is already an object named 'sp_primary_keys_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_primary_keys_rowset, Line 6

    Procedure 'sp_primary_keys_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_provider_types_rowset

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_provider_types_rowset, Line 57

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_procedure_params_rowset

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_procedure_params_rowset, Line 11

    There is already an object named 'sp_procedure_params_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_procedure_params_rowset, Line 7

    Procedure 'sp_procedure_params_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_procedure_params_rowset, Line 11

    There is already an object named 'sp_procedure_params_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_procedure_params_rowset, Line 7

    Procedure 'sp_procedure_params_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_procedures_rowset

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_procedures_rowset, Line 10

    There is already an object named 'sp_procedures_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_procedures_rowset, Line 6

    Procedure 'sp_procedures_rowset' has already been created with group number 2. Create procedure with an unused group number.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_procedures_rowset, Line 10

    There is already an object named 'sp_procedures_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_procedures_rowset, Line 6

    Procedure 'sp_procedures_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_schemata_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_schemata_rowset, Line 9

    There is already an object named 'sp_schemata_rowset' in the database.

    creating sp_statistics_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_statistics_rowset, Line 9

    There is already an object named 'sp_statistics_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_statistics_rowset, Line 6

    Procedure 'sp_statistics_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_tables_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_tables_rowset, Line 10

    There is already an object named 'sp_tables_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_tables_rowset, Line 7

    Procedure 'sp_tables_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_tables_info_rowset

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 49

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 102, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 62

    Incorrect syntax near '&'.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 44

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 102, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 57

    Incorrect syntax near '&'.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 10

    There is already an object named 'sp_tables_info_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset, Line 7

    Procedure 'sp_tables_info_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_tables_info_rowset_64

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 49

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 102, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 62

    Incorrect syntax near '&'.

    Msg 4147, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 44

    The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

    Msg 102, Level 15, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 57

    Incorrect syntax near '&'.

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 10

    There is already an object named 'sp_tables_info_rowset_64' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_tables_info_rowset_64, Line 7

    Procedure 'sp_tables_info_rowset_64' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_table_constraints_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_table_constraints_rowset, Line 14

    There is already an object named 'sp_table_constraints_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_table_constraints_rowset, Line 11

    Procedure 'sp_table_constraints_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_table_privileges_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_table_privileges_rowset, Line 12

    There is already an object named 'sp_table_privileges_rowset' in the database.

    Msg 2004, Level 16, State 1, Server SERVERNAME, Procedure sp_table_privileges_rowset, Line 8

    Procedure 'sp_table_privileges_rowset' has already been created with group number 2. Create procedure with an unused group number.

    creating sp_linkedservers_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_table_statistics_rowset

    Warning:

    you are installing the stored procedures

    on a pre 8.00 SQL Server.

    Ignore the following errors.

    creating sp_oledb_column_constraints

    Warning:

    you are installing the stored procedures

    on a pre 7.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_oledb_column_constraints, Line 94

    There is already an object named 'sp_oledb_column_constraints' in the database.

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_oledb_column_constraints, Line 94

    There is already an object named 'sp_oledb_column_constraints' in the database.

    creating sp_oledb_indexinfo

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Msg 2714, Level 16, State 3, Server SERVERNAME, Procedure sp_oledb_indexinfo, Line 59

    There is already an object named 'sp_oledb_indexinfo' in the database.

    creating sp_oledb_ro_usrname

    creating sp_oledb_deflang

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_oledb_defdb

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_oledb_database

    creating sp_oledb_language

    creating sp_tablecollations

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    creating sp_bcp_dbcmptlevel

    Warning:

    you are installing the stored procedures

    on a pre 8.0 SQL Server.

    Ignore the following errors.

    Configuration option 'allow updates' changed from 1 to 0. Run the RECONFIGURE statement to install.

    Msg 2812, Level 16, State 62, Server SERVERNAME, Line 2

    Could not find stored procedure 'sp_MS_upd_sysobj_category'.

    instcat.sql completed successfully.

  • Hi,

    It is a huge script. I did not have enough time to check the whole script. But there are a ew things I can see from your output:

    1- No all the stored procedures were dropped (that is good)

    2- Some of them well (That is not so good).

    3- If it is a development server and everything is working fine it is not such a big issue, but you do

    want to have the same configuration as in production.

    As I see it you can choose between taking the time to find out what did you exactly changed or just restore the master database. Restore the master database is not a big issue if you need any help with that I can provide you some scripts. Finding out what was exactly changed may take some time, but it can be also very interesting. Please let me know what you will decide.

    This week I will be quite busy at work and next week I will be in Seattle for the PASS summit, so it may take me longer to reply.

Viewing 11 posts - 1 through 11 (of 11 total)

You must be logged in to reply to this topic. Login to reply