home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 July & August / Pcwk78a98.iso / Micrsoft / VJ / OS / SYSTEM / INSTCAT.SQL < prev    next >
Text File  |  1998-02-12  |  635KB  |  20,266 lines

  1.  
  2. /*
  3. **    INSTCAT.SQL
  4. **    Installs catalog stored procedures on the Microsoft SQL Server.
  5. **    Copyright 1992-1998, Microsoft Corp.    All rights reserved.
  6. */
  7.  
  8. /*
  9. NOTE:  you MUST change the last row inserted into spt_server_info
  10. to be version number of this file.    the convention is j.nn.bbb, where
  11. jj is the major version number ('7' now), nn is the minor version number
  12. ('00' now), and bbb is the build number.
  13. insert into spt_server_info
  14.     values (500, 'SYS_SPROC_VERSION', '7.00.bbb')
  15. */
  16.  
  17. /****************************************************************************/
  18. /* This portion sets up the ability to perform all the functions in this    */
  19. /* script                                                                    */
  20. /****************************************************************************/
  21. go
  22. use master
  23. go
  24. dump tran master with no_log
  25. go
  26.  
  27. set quoted_identifier on
  28. go
  29.  
  30. if (exists (select * from sysobjects
  31.         where name = 'sp_configure' and type = 'P '))
  32. begin
  33.     execute sp_configure 'update',1
  34. end
  35. reconfigure with override
  36. go
  37.  
  38. exec sp_MS_upd_sysobj_category 1 /*Capture datetime for use below.*/
  39.  
  40. go
  41.  
  42. /*
  43. ** If old versions of tables exist, drop them.
  44. */
  45. if (exists (select * from sysobjects
  46.         where name = 'MSdatatype_info' and type = 'U '))
  47.     drop table MSdatatype_info
  48. go
  49. if (exists (select * from sysobjects
  50.         where name = 'MSdatatype_info_ext' and type = 'U '))
  51.     drop table MSdatatype_info_ext
  52. go
  53. if (exists (select * from sysobjects
  54.         where name = 'MStable_types' and type = 'U '))
  55.     drop table MStable_types
  56. go
  57. if (exists (select * from sysobjects
  58.         where name = 'MSserver_info' and type = 'U '))
  59.     drop table MSserver_info
  60. go
  61. if (exists (select * from sysobjects
  62.         where name = 'spt_table_types' and type = 'U '))
  63.     drop table spt_table_types
  64. go
  65. if (exists (select * from sysobjects
  66.         where name = 'spt_provider_types' and type = 'U '))
  67.     drop table spt_provider_types
  68. go
  69. /*
  70. ** If tables or procs already exist, drop them.
  71. */
  72.  
  73. if (exists (select * from sysobjects
  74.         where name = 'spt_datatype_info' and type = 'U '))
  75.     drop table spt_datatype_info
  76. go
  77. if (exists (select * from sysobjects
  78.         where name = 'spt_datatype_info_ext' and type = 'U '))
  79.     drop table spt_datatype_info_ext
  80. go
  81. if (exists (select * from sysobjects
  82.         where name = 'spt_server_info' and type = 'U '))
  83.     drop table spt_server_info
  84. go
  85. if (exists (select * from sysobjects
  86.         where name = 'sp_tables' and type = 'P '))
  87.     drop proc sp_tables
  88. go
  89. if (exists (select * from sysobjects
  90.         where name = 'sp_statistics' and type = 'P '))
  91.     drop proc sp_statistics
  92. go
  93. if (exists (select * from sysobjects
  94.         where name = 'sp_columns' and type = 'P '))
  95.     drop proc sp_columns
  96. go
  97. if (exists (select * from sysobjects
  98.         where name = 'sp_fkeys' and type = 'P '))
  99.     drop proc sp_fkeys
  100. go
  101. if (exists (select * from sysobjects
  102.         where name = 'sp_pkeys' and type = 'P '))
  103.     drop proc sp_pkeys
  104. dump tran master with no_log
  105. go
  106.  
  107. go
  108. if (exists (select * from sysobjects
  109.         where name = 'sp_stored_procedures' and type = 'P '))
  110.     drop proc sp_stored_procedures
  111. go
  112. if (exists (select * from sysobjects
  113.         where name = 'sp_sproc_columns' and type = 'P '))
  114.     drop proc sp_sproc_columns
  115. go
  116. if (exists (select * from sysobjects
  117.         where name = 'sp_table_privileges' and type = 'P '))
  118.     drop proc sp_table_privileges
  119. go
  120. if (exists (select * from sysobjects
  121.         where name = 'sp_column_privileges' and type = 'P '))
  122.     drop proc sp_column_privileges
  123. go
  124. dump tran master with no_log
  125. go
  126. if (exists (select * from sysobjects
  127.         where name = 'sp_server_info' and type = 'P '))
  128.     drop proc sp_server_info
  129. go
  130. if (exists (select * from sysobjects
  131.         where name = 'sp_datatype_info' and type = 'P '))
  132.     drop proc sp_datatype_info
  133. go
  134. if (exists (select * from sysobjects
  135.         where name = 'sp_special_columns' and type = 'P '))
  136.     drop proc sp_special_columns
  137. go
  138. if (exists (select * from sysobjects
  139.         where name = 'sp_databases' and type = 'P '))
  140.     drop proc sp_databases
  141. go
  142. dump tran master with no_log
  143. go
  144. if (exists (select * from sysobjects
  145.         where name = 'sp_ddopen' and type = 'P '))
  146.     drop proc sp_ddopen
  147. go
  148.  
  149. dump tran master with no_log
  150. go
  151.  
  152.  
  153. if (exists (select * from sysobjects
  154.         where name = 'sp_catalogs_rowset' and type = 'P '))
  155.     drop procedure sp_catalogs_rowset
  156. go
  157. if (exists (select * from sysobjects
  158.         where name = 'sp_column_privileges_rowset' and type = 'P '))
  159.     drop procedure sp_column_privileges_rowset
  160. go
  161. if (exists (select * from sysobjects
  162.         where name = 'sp_columns_rowset' and type = 'P '))
  163.     drop procedure sp_columns_rowset
  164. go
  165. if (exists (select * from sysobjects
  166.         where name = 'sp_foreign_keys_rowset' and type = 'P '))
  167.     drop procedure sp_foreign_keys_rowset
  168. go
  169. if (exists (select * from sysobjects
  170.         where name = 'sp_indexes_rowset' and type = 'P '))
  171.     drop procedure sp_indexes_rowset
  172. go
  173. if (exists (select * from sysobjects
  174.         where name = 'sp_primary_keys_rowset' and type = 'P '))
  175.     drop procedure sp_primary_keys_rowset
  176. go
  177. if (exists (select * from sysobjects
  178.         where name = 'sp_procedure_params_rowset' and type = 'P '))
  179.     drop procedure sp_procedure_params_rowset
  180. go
  181. if (exists (select * from sysobjects
  182.         where name = 'sp_procedures_rowset' and type = 'P '))
  183.     drop procedure sp_procedures_rowset
  184. go
  185. if (exists (select * from sysobjects
  186.         where name = 'sp_provider_types_rowset' and type = 'P '))
  187.     drop procedure sp_provider_types_rowset
  188. go
  189. if (exists (select * from sysobjects
  190.         where name = 'sp_schemata_rowset' and type = 'P '))
  191.     drop procedure sp_schemata_rowset
  192. go
  193. if (exists (select * from sysobjects
  194.         where name = 'sp_statistics_rowset' and type = 'P '))
  195.     drop procedure sp_statistics_rowset
  196. go
  197. if (exists (select * from sysobjects
  198.         where name = 'sp_tables_rowset' and type = 'P '))
  199.     drop procedure sp_tables_rowset
  200. go
  201. if (exists (select * from sysobjects
  202.         where name = 'sp_table_privileges_rowset' and type = 'P '))
  203.     drop proc sp_table_privileges_rowset
  204. go
  205. if (exists (select * from sysobjects
  206.         where name = 'sp_linkedservers_rowset' and type = 'P '))
  207.     drop proc sp_linkedservers_rowset
  208. go
  209.  
  210. dump tran master with no_log
  211. go
  212.  
  213. print 'creating table spt_datatype_info_ext'
  214. go
  215.  
  216. if (charindex('6.00', @@version) = 0 and
  217.     charindex('6.50', @@version) = 0 and
  218.     charindex('7.00', @@version) = 0)
  219. begin    /*    Pre 6.0 server */
  220.     print ''
  221.     print ''
  222.     print 'Warning:'
  223.     print 'you are installing the stored procedures '
  224.     print 'on a pre 6.0 SQL Server.'
  225.     print 'Ignore the following error.'
  226.     create table spt_datatype_info_ext (
  227.                 user_type        smallint    not null,
  228.                 CREATE_PARAMS    varchar(32) null,
  229.                 AUTO_INCREMENT    smallint null,
  230.                 typename        varchar(32))
  231. end
  232. go
  233. if (charindex('6.00', @@version) > 0 or
  234.     charindex('6.50', @@version) > 0 or
  235.     charindex('7.00', @@version) > 0)
  236. begin    /* 6.0 or later server */
  237.     create table spt_datatype_info_ext (
  238.                 user_type        smallint    not null,
  239.                 CREATE_PARAMS    varchar(32) null,
  240.                 AUTO_INCREMENT    smallint null,
  241.                 typename        sysname)    /* from systypes, to avoid xusertype hard-code */
  242. end
  243. go
  244.  
  245. grant select on spt_datatype_info_ext to public
  246. go
  247.  
  248.  
  249. insert into spt_datatype_info_ext
  250.     /* CHAR      user_type, create_params, auto_increment */
  251.     values             (1,    'length' ,0, 'char')
  252.  
  253. insert into spt_datatype_info_ext
  254.     /* VARCHAR     user_type, create_params, auto_increment */
  255.     values             (2,    'max length' ,0, 'varchar')
  256.  
  257. insert into spt_datatype_info_ext
  258.     /* BINARY     user_type, create_params, auto_increment */
  259.     values             (3,    'length' ,0, 'binary')
  260.  
  261. insert into spt_datatype_info_ext
  262.     /* VARBINARY user_type, create_params, auto_increment */
  263.     values             (4,    'max length' ,0, 'varbinary')
  264.  
  265. if    (charindex('6.00', @@version) > 0 or
  266.      charindex('6.50', @@version) > 0 or
  267.      charindex('7.00', @@version) > 0)
  268. begin    /*    Add 6.0 data types */
  269.     insert into spt_datatype_info_ext
  270.         /* DECIMAL user_type, create_params, auto_increment */
  271.         values             (26,    'precision,scale' ,0, 'decimal')
  272.  
  273.     insert into spt_datatype_info_ext
  274.         /* NUMERIC user_type, create_params, auto_increment */
  275.         values             (25,    'precision,scale' ,0, 'numeric')
  276.  
  277.     insert into spt_datatype_info_ext
  278.         /* DECIMAL IDENTITY user_type, create_params, auto_increment */
  279.         values             (26,    'precision' ,1, 'decimal')
  280.  
  281.     insert into spt_datatype_info_ext
  282.         /* NUMERIC IDENTITY user_type, create_params, auto_increment */
  283.         values             (25,    'precision' ,1, 'numeric')
  284.  
  285. end
  286. else    /*    Pre 6.0 server, add SYSNAME create param */
  287.     begin
  288.         insert into spt_datatype_info_ext
  289.             /* SYSNAME     user_type, create_param, auto_increments */
  290.             values             (18,    'max length' ,0, 'sysname')
  291.  
  292.     end
  293. go
  294.  
  295. if (charindex('7.00', @@version) = 0)
  296. begin
  297.     print ''
  298.     print ''
  299.     print 'Warning:'
  300.     print 'you are installing the stored procedures '
  301.     print 'on a pre 7.0 SQL Server.'
  302.     print 'Ignore the following errors.'
  303. end
  304. go
  305. if (charindex('7.00', @@version) > 0)
  306. begin    /*    Update usertypes for 7.00 server */
  307.     begin tran
  308.     insert into spt_datatype_info_ext
  309.         /* NCHAR     user_type, create_params, auto_increment */
  310.         values             (0,    'length' ,0, 'nchar')
  311.  
  312.     insert into spt_datatype_info_ext
  313.         /* NVARCHAR     user_type, create_params, auto_increment */
  314.         values             (0,    'max length' ,0, 'nvarchar')
  315.  
  316.     /* SET user_type TO SPHINX VALUES */
  317.     update spt_datatype_info_ext set user_type = xusertype
  318.         from spt_datatype_info_ext e, systypes t where t.name = e.typename
  319.  
  320.     commit tran
  321. end
  322. go
  323.  
  324. create unique clustered index datatypeinfoextclust on spt_datatype_info_ext(user_type,AUTO_INCREMENT)
  325. go
  326.  
  327. print 'creating table spt_datatype_info'
  328. go
  329. if (charindex('6.00', @@version) = 0 and
  330.     charindex('6.50', @@version) = 0 and
  331.     charindex('7.00', @@version) = 0)
  332. begin    /*    Pre 6.0 server */
  333.     print ''
  334.     print ''
  335.     print 'Warning:'
  336.     print 'you are installing the stored procedures '
  337.     print 'on a pre 6.0 SQL Server.'
  338.     print 'Ignore the following error.'
  339.     create table spt_datatype_info (
  340.         ss_dtype            tinyint     not null,
  341.         fixlen                int         null,        /* datatype len for variable, else null */
  342.         ODBCVer             tinyint     null,        /* version if needed, else null */
  343.         TYPE_NAME            varchar(32)    not null,
  344.         DATA_TYPE            smallint    not null,
  345.         data_precision        int         null,
  346.         numeric_scale        smallint    null,    /* min scale if 6.0 */
  347.         RADIX                smallint    null,
  348.         length                int         null,
  349.         LITERAL_PREFIX        varchar(32) null,
  350.         LITERAL_SUFFIX        varchar(32) null,
  351.         CREATE_PARAMS        varchar(32) null,
  352.         NULLABLE            smallint    not null,
  353.         CASE_SENSITIVE        smallint    not null,
  354.         SEARCHABLE            smallint    not null,
  355.         UNSIGNED_ATTRIBUTE    smallint    null,
  356.         MONEY                smallint    not null,
  357.         AUTO_INCREMENT        smallint    null,
  358.         LOCAL_TYPE_NAME     varchar(32)    null,
  359.         charbin             tinyint     null, /* 0 for char/binary types, NULL for all others */
  360.         SQL_DATA_TYPE        smallint    not null,
  361.         SQL_DATETIME_SUB    smallint    null)
  362. end
  363. go
  364. if (charindex('6.00', @@version) > 0 or
  365.     charindex('6.50', @@version) > 0 or
  366.     charindex('7.00', @@version) > 0)
  367. begin    /* 6.0 or later server */
  368.     create table spt_datatype_info (
  369.         ss_dtype            tinyint     not null,
  370.         fixlen                int         null,        /* datatype len for variable, else null */
  371.         ODBCVer             tinyint     null,        /* version if needed, else null */
  372.         TYPE_NAME            sysname     not null,
  373.         DATA_TYPE            smallint    not null,
  374.         data_precision        int         null,
  375.         numeric_scale        smallint    null,    /* min scale if 6.0 */
  376.         RADIX                smallint    null,
  377.         length                int         null,
  378.         LITERAL_PREFIX        varchar(32) null,
  379.         LITERAL_SUFFIX        varchar(32) null,
  380.         CREATE_PARAMS        varchar(32) null,
  381.         NULLABLE            smallint    not null,
  382.         CASE_SENSITIVE        smallint    not null,
  383.         SEARCHABLE            smallint    not null,
  384.         UNSIGNED_ATTRIBUTE    smallint    null,
  385.         MONEY                smallint    not null,
  386.         AUTO_INCREMENT        smallint    null,
  387.         LOCAL_TYPE_NAME     sysname     null,
  388.         charbin             tinyint     null, /* 0 for char/binary types, NULL for all others */
  389.         SQL_DATA_TYPE        smallint    not null,
  390.         SQL_DATETIME_SUB    smallint    null)
  391. end
  392. go
  393.  
  394. grant select on spt_datatype_info to public
  395. go
  396.  
  397. /* Get case sensitivity */
  398. /*(leih 10/8/96) SID: Part I. break into two batches to avoid OOM error */
  399. if 'A' = 'A' /* create dummy begin block */
  400. begin
  401.     declare @case smallint
  402.  
  403.     begin tran
  404.     select @case = 0
  405.     select @case = 1 where 'a' <> 'A'
  406.  
  407.     /* Local Binary */
  408.     insert into spt_datatype_info values
  409.     (45,null,null,'binary',-2,null,null,null,null,'0x',null,'length',1,0,2,null,0,null,'binary',0,-2,null)
  410.  
  411.     /* Local Bit */
  412.     insert into spt_datatype_info values
  413.     (50,null,null,'bit',-7,1,0,2,null,null,null,null,0,0,2,null,0,null,'bit',null,-7,null)
  414.  
  415.     /* Local Char */
  416.     insert into spt_datatype_info values
  417.     (47,null,null,'char',1,null,null,null,null,'''','''','length',1,@case,3,null,0,null,'char',0,1,null)
  418.  
  419.     /* Local Datetime */
  420.     insert into spt_datatype_info values
  421.     (61,8,2,'datetime',11,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  422.     insert into spt_datatype_info values
  423.     (61,8,3,'datetime',93,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  424.  
  425.     /* Local Smalldatetime */
  426.     insert into spt_datatype_info values
  427.     (58,4,2,'smalldatetime',11,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  428.     insert into spt_datatype_info values
  429.     (58,4,3,'smalldatetime',93,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  430.  
  431.     /* Local Float */
  432.     insert into spt_datatype_info values
  433.     (62,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  434.     insert into spt_datatype_info values
  435.     (62,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  436.  
  437.     /* Local Real */
  438.     insert into spt_datatype_info values
  439.     (59,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  440.     insert into spt_datatype_info values
  441.     (59,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  442.  
  443.     /* Local Smallmoney */
  444.     insert into spt_datatype_info values
  445.     (122,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
  446.  
  447.     /* Local Money */
  448.     insert into spt_datatype_info values
  449.     (60,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
  450.  
  451.     /* Local Int */
  452.     insert into spt_datatype_info values
  453.     (56,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
  454.  
  455.     commit tran
  456. end
  457. go
  458.  
  459. /*(leih 10/8/96) SID: Part II. break into two batches to avoid OOM error */
  460. if 'A' = 'A' /* create dummy begin block */
  461. begin
  462.     declare @case smallint
  463.  
  464.     begin tran
  465.     select @case = 0
  466.     select @case = 1 where 'a' <> 'A'
  467.  
  468.  
  469.     /* Local Smallint */
  470.     insert into spt_datatype_info values
  471.     (52,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  472.     insert into spt_datatype_info values
  473.     (52,2,1,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  474.  
  475.     /* Local Tinyint */
  476.     insert into spt_datatype_info values
  477.     (48,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
  478.  
  479.     /* Local Text */
  480.     insert into spt_datatype_info values
  481.     (35,null,null,'text',-1,2147483647,null,null,2147483647,'''','''',null,1,@case,1,null,0,null,'text',0,-1,null)
  482.  
  483.     /* Local Varbinary */
  484.     insert into spt_datatype_info values
  485.     (37,null,null,'varbinary',-3,null,null,null,null,'0x',null,'max length',1,0,2,null,0,null,'varbinary',0,-3,null)
  486.  
  487.     /* Local Varchar */
  488.     insert into spt_datatype_info values
  489.     (39,null,null,'varchar',12,null,null,null,null,'''','''','max length',1,@case,3,null,0,null,'varchar',0,12,null)
  490.  
  491.     /* Local Image */
  492.     insert into spt_datatype_info values
  493.     (34,null,null,'image',-4,2147483647,null,null,2147483647,'0x',null,null,1,0,0,null,0,null,'image',0,-4,null)
  494.  
  495.     if (charindex('6.00', @@version) > 0 or
  496.         charindex('6.50', @@version) > 0 or
  497.         charindex('7.00', @@version) > 0)
  498.     begin    /*    Add 6.0 data types */
  499.         /* Local Decimal */
  500.         insert into spt_datatype_info values    /* sql server type is 'decimaln' */
  501.         (55,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
  502.  
  503.         /* Local Numeric */
  504.         insert into spt_datatype_info values    /* sql server type is 'numericn' */
  505.         (63,null,null,'numeric',2    ,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
  506.  
  507.         /* Identity attribute data types */
  508.  
  509.         /* Identity Int */
  510.         insert into spt_datatype_info values
  511.         (56,null,null,'int identity',4,10,0,10,null,null,null,null,0,0,2,0,0,1,'int identity',null,4,null)
  512.  
  513.         /* Identity Smallint */
  514.         insert into spt_datatype_info values
  515.         (52,null,null,'smallint identity',5,5,0,10,null,null,null,null,0,0,2,0,0,1,'smallint identity',null,5,null)
  516.  
  517.         /* Identity Tinyint */
  518.         insert into spt_datatype_info values
  519.         (48,null,null,'tinyint identity',-6,3,0,10,null,null,null,null,0,0,2,1,0,1,'tinyint identity',null,-6,null)
  520.  
  521.         /* Identity Numeric */
  522.         insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  523.         (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)
  524.  
  525.         /* Identity Numeric */
  526.         insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  527.         (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)
  528.  
  529.     end
  530.  
  531.     if (charindex('7.00', @@version) = 0)
  532.     begin    /*    Add nullable type for non-Sphinx server */
  533.         /* Local Datetimn */
  534.         insert into spt_datatype_info values
  535.         (111,4,2,'smalldatetime',11,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  536.         insert into spt_datatype_info values
  537.         (111,4,3,'smalldatetime',93,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  538.         insert into spt_datatype_info values /* sql server type is 'datetimn' */
  539.         (111,8,2,'datetime',11,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  540.         insert into spt_datatype_info values
  541.         (111,8,3,'datetime',93,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  542.  
  543.         /* Local Floatn */
  544.         insert into spt_datatype_info values /* sql server type is 'floatn' */
  545.         (109,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  546.         insert into spt_datatype_info values
  547.         (109,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  548.         insert into spt_datatype_info values /* sql server type is 'floatn' */
  549.         (109,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  550.         insert into spt_datatype_info values
  551.         (109,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  552.  
  553.         /* Local Moneyn */
  554.         insert into spt_datatype_info values    /* sql server type is 'moneyn' */
  555.         (110,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
  556.         insert into spt_datatype_info values    /* sql server type is 'moneyn' */
  557.         (110,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
  558.  
  559.         /* Local Intn */
  560.         insert into spt_datatype_info values /* sql server type is 'intn' */
  561.         (38,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
  562.         insert into spt_datatype_info values /* sql server type is 'intn' */
  563.         (38,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  564.         insert into spt_datatype_info values
  565.         (38,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
  566.  
  567.         if (charindex('6.00', @@version) > 0 or
  568.             charindex('6.50', @@version) > 0 or
  569.             charindex('7.00', @@version) > 0)
  570.         begin    /*    Add 6.0 data types */
  571.             /* Local Decimaln */
  572.             insert into spt_datatype_info values    /* sql server type is 'decimaln' */
  573.             (106,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
  574.             insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  575.             (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)
  576.  
  577.             /* Local Numericn */
  578.             insert into spt_datatype_info values    /* sql server type is 'numericn' */
  579.             (108,null,null,'numeric',2,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
  580.             insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  581.             (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)
  582.         end
  583.     end
  584.  
  585.     commit tran
  586. end
  587. go
  588.  
  589. if (charindex('7.00', @@version) = 0)
  590. begin
  591.     print ''
  592.     print ''
  593.     print 'Warning:'
  594.     print 'you are installing the stored procedures '
  595.     print 'on a pre 7.0 SQL Server.'
  596.     print 'Ignore the following errors.'
  597. end
  598. go
  599. if (charindex('7.00', @@version) > 0)
  600.     begin
  601.         declare @case smallint
  602.  
  603.         select @case = 0
  604.         select @case = 1 where 'a' <> 'A'
  605.  
  606.         /* Local Timestamp */
  607.         insert into spt_datatype_info values
  608.         (0,null,null,'timestamp',-2,8,null,null,null,'0x',null,null,1,0,2,null,0,null,'timestamp',0,-2,null)
  609.  
  610.         /* Local GUID */
  611.         insert into spt_datatype_info values
  612.         (0,null,null,'uniqueidentifier',-11,16,null,null,null,'''','''',null,1,0,2,null,0,null,'uniqueidentifier',NULL,-11,null)
  613.  
  614.         /* Local NChar */
  615.         insert into spt_datatype_info values
  616.         (0,null,null,'nchar',-8,null,null,null,null,'N''','''','length',1,@case,3,null,0,null,'nchar',0,-8,null)
  617.  
  618.         /* Local NVarchar */
  619.         insert into spt_datatype_info values
  620.         (0,null,null,'nvarchar',-9,null,null,null,null,'N''','''','max length',1,@case,3,null,0,null,'nvarchar',0,-9,null)
  621.  
  622.         /* Local NText */
  623.         insert into spt_datatype_info values
  624.         (0,null,null,'ntext',-10,2147483646,null,null,2147483646,'N''','''',null,1,@case,1,null,0,null,'ntext',0,-10,null)
  625.  
  626.         update spt_datatype_info set ss_dtype = (select xtype from systypes
  627.             where TYPE_NAME like name+'%')
  628.     end
  629. go
  630.  
  631. create unique clustered index datatypeinfoclust on spt_datatype_info(ss_dtype,fixlen,ODBCVer,AUTO_INCREMENT)
  632. go
  633.  
  634. dump tran master with no_log
  635. go
  636.  
  637. print 'creating table spt_server_info'
  638. go
  639. create table spt_server_info (
  640.               attribute_id        int NOT NULL,
  641.               attribute_name    varchar(60) NOT NULL,
  642.               attribute_value    varchar(255) NOT NULL)
  643. go
  644.  
  645. create unique clustered index serverinfoclust on spt_server_info(attribute_id)
  646. go
  647.  
  648. /*(leih 10/8/96) SID: Part I break into two batches to avoid OOM error */
  649. insert into spt_server_info
  650.     values (1,'DBMS_NAME','Microsoft SQL Server')
  651. insert into spt_server_info
  652.     values (2,'DBMS_VER',@@version)
  653. insert into spt_server_info
  654.     values (10,'OWNER_TERM','owner')
  655. insert into spt_server_info
  656.     values (11,'TABLE_TERM','table')
  657. insert into spt_server_info
  658.     values (12,'MAX_OWNER_NAME_LENGTH','30')
  659. insert into spt_server_info
  660.     values (13,'TABLE_LENGTH','30')
  661. insert into spt_server_info
  662.     values (14,'MAX_QUAL_LENGTH','30')
  663. insert into spt_server_info
  664.     values (15,'COLUMN_LENGTH','30')
  665. if 'A' = 'a' /* If not case sensitive server */
  666. begin
  667.     insert into spt_server_info
  668.         values (16,'IDENTIFIER_CASE','MIXED')
  669. end
  670. else
  671. begin
  672.     insert into spt_server_info
  673.         values (16,'IDENTIFIER_CASE','SENSITIVE')
  674. end
  675. insert into spt_server_info
  676.     values (17,'TX_ISOLATION','2')
  677. insert into spt_server_info
  678.     select 18,'COLLATION_SEQ',
  679.         'charset='+t2.name+' sort_order='+t1.name
  680.         +' charset_num='+rtrim(convert(char(4),t1.csid))+
  681.         ' sort_order_num='+rtrim(convert(char(4),t1.id))
  682.     from master.dbo.syscharsets t1, master.dbo.syscharsets t2, master.dbo.sysconfigures t3
  683.     where t1.csid=t2.id and t1.id=t3.value and t3.config in (123,1123)
  684. insert into spt_server_info
  685.     values (19,'SAVEPOINT_SUPPORT','Y')
  686. insert into spt_server_info
  687.     values (20,'MULTI_RESULT_SETS','Y')
  688. insert into spt_server_info
  689.     values (22,'ACCESSIBLE_TABLES','Y')
  690. go
  691.  
  692. /*(leih 10/8/96) SID: Part II. break into two batches to avoid OOM error */
  693. insert into spt_server_info
  694.     values (100,'USERID_LENGTH','30')
  695. insert into spt_server_info
  696.     values (101,'QUALIFIER_TERM','database')
  697. insert into spt_server_info
  698.     values (102,'NAMED_TRANSACTIONS','Y')
  699. insert into spt_server_info
  700.     values (103,'SPROC_AS_LANGUAGE','Y')
  701. insert into spt_server_info
  702.     values (104,'ACCESSIBLE_SPROC','Y')
  703. insert into spt_server_info
  704.     values (105,'MAX_INDEX_COLS','16')
  705. insert into spt_server_info
  706.     values (106,'RENAME_TABLE','Y')
  707. insert into spt_server_info
  708.     values (107,'RENAME_COLUMN','Y')
  709. insert into spt_server_info
  710.     values (108,'DROP_COLUMN','N')
  711. insert into spt_server_info
  712.     values (109,'INCREASE_COLUMN_LENGTH','N')
  713. if (charindex('6.50', @@version) = 0 and
  714.     charindex('7.00', @@version) = 0)
  715. begin
  716.     insert into spt_server_info
  717.         values (110,'DDL_IN_TRANSACTION','N')
  718. end
  719. else
  720. begin
  721.     insert into spt_server_info
  722.         values (110,'DDL_IN_TRANSACTION','Y')
  723. end
  724. insert into spt_server_info
  725.     values (111,'DESCENDING_INDEXES','N')
  726. insert into spt_server_info
  727.     values (112,'SP_RENAME','Y')
  728. insert into spt_server_info
  729.     values (113,'REMOTE_SPROC','Y')
  730. insert into spt_server_info
  731.     values (500,'SYS_SPROC_VERSION','7.00.408')
  732. go
  733.  
  734. if (charindex('7.00', @@version) > 0)
  735. begin    /*    Update values for 7.00 server */
  736.     update spt_server_info set attribute_value = '128'
  737.         where attribute_id in (12,13,14,15,100)
  738. end
  739. go
  740.  
  741. grant select on spt_server_info to public
  742. go
  743.  
  744. print 'creating sp_column_privileges'
  745. go
  746.  
  747. /*    Procedure for pre 6.50 server */
  748. CREATE PROCEDURE sp_column_privileges (
  749.             @table_name         varchar(32),
  750.             @table_owner        varchar(32) = null,
  751.             @table_qualifier    varchar(32) = null,
  752.             @column_name        varchar(96) = null)    /* 3*32 */
  753. as
  754.  
  755.     declare @table_id     int
  756.     DECLARE @full_table_name    varchar(65)    /* 2*32 + 1 */
  757.     declare @low smallint                     /* range of userids to check */
  758.     declare @high smallint
  759.     declare @owner_uid smallint
  760.  
  761.     select @low = 0, @high = 32767
  762.  
  763.     if @column_name is null /*    If column name not supplied, match all */
  764.         select @column_name = '%'
  765.  
  766.     if @table_qualifier is not null
  767.     begin
  768.         if db_name() <> @table_qualifier
  769.         begin    /* If qualifier doesn't match current database */
  770.             raiserror 20001 'Table qualifier must be name of current database'
  771.             return
  772.         end
  773.     end
  774.     if @table_owner is null
  775.     begin    /* If unqualified table name */
  776.         SELECT @full_table_name = @table_name
  777.     end
  778.     else
  779.     begin    /* Qualified table name */
  780.         SELECT @full_table_name = @table_owner + '.' + @table_name
  781.     end
  782.     /*    Get Object ID */
  783.     select @table_id = object_id(@full_table_name)
  784.  
  785.     if (@@trancount <> 0)
  786.     begin    /* If inside a transaction */
  787.         raiserror 20003 'The procedure ''sp_column_privileges'' cannot be executed from within a transaction.'
  788.         return
  789.     end
  790.  
  791.     /*
  792.     ** We need to create a table which will contain a row for every row to
  793.     ** be returned to the client.
  794.     */
  795.  
  796.     create table #column_priv1(
  797.         COLUMN_NAME             varchar(32) NOT NULL,
  798.         grantor                 smallint NOT NULL,
  799.         grantee                 smallint NOT NULL,
  800.         select_privilege        bit,
  801.         select_grantable        bit,
  802.         insert_privilege        bit,
  803.         insert_grantable        bit,
  804.         update_privilege        bit,
  805.         update_grantable        bit,
  806.         references_privilege    bit,
  807.         references_grantable    bit,
  808.         uid                     smallint NOT NULL,
  809.         gid                     smallint NOT NULL)
  810.  
  811. /*
  812. ** insert a row for the table owner (who has all permissions)
  813. */
  814.     select @owner_uid = (
  815.         select uid
  816.         from sysobjects
  817.         where id = @table_id)
  818.  
  819.     if (charindex('6.00', @@version) > 0)
  820.     begin
  821.         insert into #column_priv1
  822.             select
  823.                 c.name,
  824.                 u.uid,
  825.                 @owner_uid,
  826.                 0,
  827.                 1,
  828.                 0,
  829.                 1,
  830.                 0,
  831.                 1,
  832.                 0,
  833.                 1,
  834.                 @owner_uid,
  835.                 0
  836.             from syscolumns c, sysusers u
  837.             where id = @table_id
  838.                 and c.number = 0
  839.                 and u.suid = 1        /* grantor is dbo of database */
  840.     end
  841.     else
  842.     begin
  843.         insert into #column_priv1
  844.             select
  845.                 c.name,
  846.                 u.uid,
  847.                 @owner_uid,
  848.                 0,
  849.                 1,
  850.                 0,
  851.                 1,
  852.                 0,
  853.                 1,
  854.                 0,
  855.                 0,
  856.                 @owner_uid,
  857.                 0
  858.             from syscolumns c, sysusers u
  859.             where id = @table_id
  860.                 and c.number = 0
  861.                 and u.suid = 1        /* grantor is dbo of database */
  862.     end
  863. /*
  864. ** now stick in a row for every column for every user in the database
  865. ** we will need to weed out those who have no permissions later
  866. ** (and yes this is a cartesion product: the uid field in sysprotects
  867. ** can also have a group id, in which case we need to extend those
  868. ** privileges to all group members).
  869. */
  870.  
  871.     insert into #column_priv1
  872.         select distinct
  873.             c.name,
  874.             o.uid,
  875.             u.uid,
  876.             0,
  877.             0,
  878.             0,
  879.             0,
  880.             0,
  881.             0,
  882.             0,
  883.             0,
  884.             u.uid,
  885.             u.gid
  886.         from sysusers u, syscolumns c, sysobjects o
  887.         where o.id = @table_id
  888.             and c.id = o.id
  889.             and c.number = 0
  890.             and u.gid <> u.uid
  891.             and u.uid <> @owner_uid
  892.  
  893.     /*
  894.     ** we need to create another temporary table to contain all the various
  895.     ** protection information for the table in question
  896.     */
  897.     create table #protects (
  898.                 uid         smallint NOT NULL,
  899.                 grantor        smallint NOT NULL,
  900.                 action        tinyint NOT NULL,
  901.                 protecttype tinyint NOT NULL,
  902.                 name        varchar(32) NOT NULL)
  903.  
  904.     insert into #protects
  905.         select
  906.             p.uid,
  907.             p.uid,
  908.             p.action,
  909.             p.protecttype,
  910.             isnull(col_name(id, c.number), '~All')
  911.             from
  912.                 sysprotects p,
  913.                 master.dbo.spt_values c,
  914.                 master.dbo.spt_values a,
  915.                 master.dbo.spt_values b
  916.             where
  917.                 convert(tinyint, substring(isnull(p.columns, 0x1), c.low, 1))
  918.                     & c.high <> 0
  919.                     and c.number <= (
  920.                         select count(*)
  921.                         from syscolumns
  922.                         where id = @table_id)
  923.                 and c.type = 'P'
  924.                 and a.type = 'T'
  925.                 and a.number = p.action
  926.                 and p.action in (193,195,197,26)
  927.                 and b.type = 'T'
  928.                 and b.number = p.protecttype
  929.                 and p.id = @table_id
  930.                 and p.uid between @low and @high
  931.  
  932.  
  933.     update #column_priv1
  934.     set select_privilege = 1
  935.         from #protects p
  936.     where
  937.         p.protecttype = 205
  938.         and p.action = 193
  939.         and (p.name = #column_priv1.COLUMN_NAME
  940.             or name = '~All')
  941.         and (p.uid = 0
  942.             or p.uid = #column_priv1.gid
  943.             or p.uid = #column_priv1.uid)
  944.         and not exists (
  945.             select * from #protects
  946.             where
  947.                 protecttype = 206
  948.                 and action = 193
  949.                 and (name = #column_priv1.COLUMN_NAME
  950.                     or name = '~All')
  951.                 and ( uid = 0
  952.                     or uid = #column_priv1.gid
  953.                     or uid = #column_priv1.uid))
  954.  
  955.     update #column_priv1
  956.     set insert_privilege = 1
  957.         from #protects p
  958.     where
  959.         p.protecttype = 205
  960.         and p.action = 195
  961.         and (p.name = #column_priv1.COLUMN_NAME
  962.             or name = '~All')
  963.         and (p.uid = 0
  964.             or p.uid = #column_priv1.gid
  965.             or p.uid = #column_priv1.uid)
  966.         and not exists (
  967.             select * from #protects
  968.             where
  969.                 protecttype = 206
  970.                 and action = 195
  971.                 and (name = #column_priv1.COLUMN_NAME
  972.                        or name = '~All')
  973.                 and (uid = 0
  974.                     or uid = #column_priv1.gid
  975.                     or uid = #column_priv1.uid))
  976.  
  977.     update #column_priv1
  978.     set update_privilege = 1
  979.         from #protects p
  980.     where
  981.         p.protecttype = 205
  982.         and p.action = 197
  983.         and (p.name = #column_priv1.COLUMN_NAME
  984.             or name = '~All')
  985.         and (p.uid = 0
  986.             or p.uid = #column_priv1.gid
  987.             or p.uid = #column_priv1.uid)
  988.         and not exists (
  989.             select * from #protects
  990.                 where protecttype = 206
  991.                 and action = 197
  992.                 and (name = #column_priv1.COLUMN_NAME
  993.                     or name = '~All')
  994.                 and (uid = 0
  995.                     or uid = #column_priv1.gid
  996.                     or uid = #column_priv1.uid))
  997.  
  998.     update #column_priv1
  999.     set references_privilege = 1
  1000.         from #protects p
  1001.     where
  1002.         p.protecttype = 205
  1003.         and p.action = 26
  1004.         and (p.name = #column_priv1.COLUMN_NAME
  1005.             or name = '~All')
  1006.         and (p.uid = 0
  1007.             or p.uid = #column_priv1.gid
  1008.             or p.uid = #column_priv1.uid)
  1009.         and not exists (
  1010.             select * from #protects
  1011.                 where protecttype = 206
  1012.                 and action = 26
  1013.                 and (name = #column_priv1.COLUMN_NAME
  1014.                     or name = '~All')
  1015.                 and (uid = 0
  1016.                     or uid = #column_priv1.gid
  1017.                     or uid = #column_priv1.uid))
  1018.  
  1019.     update #column_priv1
  1020.     set select_grantable = 1
  1021.         from #protects p
  1022.     where
  1023.         p.protecttype = 204
  1024.         and p.action = 193
  1025.         and (p.name = #column_priv1.COLUMN_NAME
  1026.             or name = '~All')
  1027.         and (p.uid = 0
  1028.             or p.uid = #column_priv1.gid
  1029.             or p.uid = #column_priv1.uid)
  1030.         and not exists (
  1031.             select * from #protects
  1032.             where
  1033.                 protecttype = 206
  1034.                 and action = 193
  1035.                 and (name = #column_priv1.COLUMN_NAME
  1036.                     or name = '~All')
  1037.                 and ( uid = 0
  1038.                     or uid = #column_priv1.gid
  1039.                     or uid = #column_priv1.uid))
  1040.  
  1041.     update #column_priv1
  1042.     set insert_grantable = 1
  1043.         from #protects p
  1044.     where
  1045.         p.protecttype = 204
  1046.         and p.action = 195
  1047.         and (p.name = #column_priv1.COLUMN_NAME
  1048.             or name = '~All')
  1049.         and (p.uid = 0
  1050.             or p.uid = #column_priv1.gid
  1051.             or p.uid = #column_priv1.uid)
  1052.         and not exists (
  1053.             select * from #protects
  1054.             where
  1055.                 protecttype = 206
  1056.                 and action = 195
  1057.                 and (name = #column_priv1.COLUMN_NAME
  1058.                     or name = '~All')
  1059.                 and ( uid = 0
  1060.                     or uid = #column_priv1.gid
  1061.                     or uid = #column_priv1.uid))
  1062.  
  1063.     update #column_priv1
  1064.     set update_grantable = 1
  1065.         from #protects p
  1066.     where
  1067.         p.protecttype = 204
  1068.         and p.action = 197
  1069.         and (p.name = #column_priv1.COLUMN_NAME
  1070.             or name = '~All')
  1071.         and (p.uid = 0
  1072.             or p.uid = #column_priv1.gid
  1073.             or p.uid = #column_priv1.uid)
  1074.         and not exists (
  1075.             select * from #protects
  1076.             where
  1077.                 protecttype = 206
  1078.                 and action = 197
  1079.                 and (name = #column_priv1.COLUMN_NAME
  1080.                     or name = '~All')
  1081.                 and ( uid = 0
  1082.                     or uid = #column_priv1.gid
  1083.                     or uid = #column_priv1.uid))
  1084.  
  1085.     update #column_priv1
  1086.     set references_grantable = 1
  1087.         from #protects p
  1088.     where
  1089.         p.protecttype = 204
  1090.         and p.action = 26
  1091.         and (p.name = #column_priv1.COLUMN_NAME
  1092.             or name = '~All')
  1093.         and (p.uid = 0
  1094.             or p.uid = #column_priv1.gid
  1095.             or p.uid = #column_priv1.uid)
  1096.         and not exists (
  1097.             select * from #protects
  1098.             where
  1099.                 protecttype = 206
  1100.                 and action = 26
  1101.                 and (name = #column_priv1.COLUMN_NAME
  1102.                     or name = '~All')
  1103.                 and ( uid = 0
  1104.                     or uid = #column_priv1.gid
  1105.                     or uid = #column_priv1.uid))
  1106.  
  1107.     create table #column_priv2(
  1108.         COLUMN_NAME     varchar(32) NOT NULL,
  1109.         grantor         smallint NULL,
  1110.         grantee         smallint NOT NULL,
  1111.         PRIVILEGE        varchar(32) NOT NULL,
  1112.         IS_GRANTABLE    varchar(3) NULL)
  1113.  
  1114.     insert into #column_priv2
  1115.         select
  1116.             COLUMN_NAME,
  1117.             grantor,
  1118.             grantee,
  1119.             'SELECT',
  1120.             'NO'
  1121.         from #column_priv1
  1122.         where select_privilege = 1 and select_grantable    = 0
  1123.  
  1124.     insert into #column_priv2
  1125.         select
  1126.             COLUMN_NAME,
  1127.             grantor,
  1128.             grantee,
  1129.             'INSERT',
  1130.             'NO'
  1131.         from #column_priv1
  1132.         where insert_privilege = 1 and insert_grantable = 0
  1133.  
  1134.     insert into #column_priv2
  1135.         select
  1136.             COLUMN_NAME,
  1137.             grantor,
  1138.             grantee,
  1139.             'UPDATE',
  1140.             'NO'
  1141.         from #column_priv1
  1142.         where update_privilege = 1 and update_grantable = 0
  1143.  
  1144.     insert into #column_priv2
  1145.         select
  1146.             COLUMN_NAME,
  1147.             grantor,
  1148.             grantee,
  1149.             'REFERENCES',
  1150.             'NO'
  1151.         from #column_priv1
  1152.         where references_privilege = 1 and references_grantable = 0
  1153.  
  1154.     insert into #column_priv2
  1155.         select
  1156.             COLUMN_NAME,
  1157.             grantor,
  1158.             grantee,
  1159.             'SELECT',
  1160.             'YES'
  1161.         from #column_priv1
  1162.         where select_grantable = 1
  1163.  
  1164.     insert into #column_priv2
  1165.         select
  1166.             COLUMN_NAME,
  1167.             grantor,
  1168.             grantee,
  1169.             'INSERT',
  1170.             'YES'
  1171.         from #column_priv1
  1172.         where insert_grantable = 1
  1173.  
  1174.     insert into #column_priv2
  1175.         select
  1176.             COLUMN_NAME,
  1177.             grantor,
  1178.             grantee,
  1179.             'UPDATE',
  1180.             'YES'
  1181.         from #column_priv1
  1182.         where update_grantable = 1
  1183.  
  1184.     insert into #column_priv2
  1185.         select
  1186.             COLUMN_NAME,
  1187.             grantor,
  1188.             grantee,
  1189.             'REFERENCES',
  1190.             'YES'
  1191.         from #column_priv1
  1192.         where references_grantable = 1
  1193.  
  1194.     select
  1195.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1196.         convert(varchar(32),user_name(@owner_uid)) TABLE_OWNER,
  1197.         @table_name TABLE_NAME,
  1198.         COLUMN_NAME,
  1199.         convert(varchar(32),user_name(grantor)) GRANTOR,
  1200.         convert(varchar(32),user_name(grantee)) GRANTEE,
  1201.         PRIVILEGE,
  1202.         IS_GRANTABLE
  1203.     from #column_priv2
  1204.     where COLUMN_NAME like @column_name
  1205.     order by 4, 7
  1206. go
  1207.  
  1208. if (charindex('6.50', @@version) = 0 and
  1209.     charindex('7.00', @@version) = 0)
  1210. begin
  1211.     print ''
  1212.     print ''
  1213.     print 'Warning:'
  1214.     print 'you are installing the stored procedures '
  1215.     print 'on a pre 6.50 SQL Server.'
  1216.     print 'Ignore the following errors.'
  1217. end
  1218. else
  1219.     drop proc sp_column_privileges
  1220. go
  1221.  
  1222. /*    Procedure for 6.50 server */
  1223. CREATE PROCEDURE sp_column_privileges (
  1224.             @table_name         varchar(32),
  1225.             @table_owner        varchar(32) = null,
  1226.             @table_qualifier    varchar(32) = null,
  1227.             @column_name        varchar(96) = null)    /* 3*32 */
  1228. as
  1229.  
  1230.     declare @table_id     int
  1231.  
  1232.     if @column_name is null /*    If column name not supplied, match all */
  1233.         select @column_name = '%'
  1234.  
  1235.     if @table_qualifier is not null
  1236.     begin
  1237.         if db_name() <> @table_qualifier
  1238.         begin    /* If qualifier doesn't match current database */
  1239.             raiserror (15250, -1,-1)
  1240.             return
  1241.         end
  1242.     end
  1243.     if @table_owner is null
  1244.     begin    /* If unqualified table name */
  1245.         select @table_id = object_id(@table_name)
  1246.     end
  1247.     else
  1248.     begin    /* Qualified table name */
  1249.         select @table_id = object_id(@table_owner + '.' + @table_name)
  1250.     end
  1251.  
  1252.     select
  1253.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1254.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  1255.         @table_name TABLE_NAME,
  1256.         convert(varchar(32),c.name) COLUMN_NAME,
  1257.         convert(varchar(32),user_name(p.grantor)) GRANTOR,
  1258.         convert(varchar(32),user_name(u.uid)) GRANTEE,
  1259.         convert (varchar(32),case p.action
  1260.              when 193 then 'SELECT'
  1261.              when 195 then 'INSERT'
  1262.              when 197 then 'UPDATE'
  1263.              else 'REFERENCES'
  1264.         end) PRIVILEGE,
  1265.         convert (varchar(3),case when p.protecttype = 205 then 'NO'
  1266.             else 'YES'
  1267.         end) IS_GRANTABLE
  1268.     from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  1269.     where
  1270.         c.id = @table_id
  1271.         and c.name like @column_name
  1272.         and c.id = p.id
  1273.         and c.id = o.id
  1274.         and case substring(p.columns, 1, 1) & 1
  1275.                 when NULL then 255    /* all columns have permission */
  1276.                 when 0 then convert(tinyint, substring(p.columns, v.low, 1))
  1277.                 else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
  1278.             end
  1279.             & v.high <> 0            /* permission applies to this column */
  1280.         and v.number <= (select count(*) from syscolumns
  1281.             where id = @table_id)    /* ranges from 1 to # of columns in table */
  1282.         and v.type = 'P'
  1283.         and v.number = c.colid
  1284.             /* expand groups */
  1285.         and ((p.uid = u.uid and u.uid <> u.gid) or
  1286.              (p.uid = u.gid and u.uid <> u.gid))
  1287.         and p.protecttype <> 206    /* only grant rows */
  1288.         and p.action in (26,193,195,197)
  1289.         and o.uid <> u.uid            /* no rows for owner */
  1290.         and not exists (            /* exclude revoke'd privileges */
  1291.             select *
  1292.             from sysprotects p1
  1293.             where
  1294.                 p1.protecttype = 206
  1295.                 and p1.action = p.action
  1296.                 and p1.id = p.id
  1297.                 and p1.uid = u.uid
  1298.                 and case substring(p1.columns, 1, 1) & 1
  1299.                         when NULL then 255    /* all columns have permission */
  1300.                         when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  1301.                                             else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
  1302.                     end
  1303.                     & v.high <> 0)            /* permission applies to this column */
  1304.     union all
  1305.     select    /*    Add rows for table owner */
  1306.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1307.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  1308.         @table_name TABLE_NAME,
  1309.         convert(varchar(32),col_name(@table_id, c.colid)) COLUMN_NAME,
  1310.         convert(varchar(32),user_name(u.uid)) grantor,
  1311.         convert(varchar(32),user_name(o.uid)) grantee,
  1312.         convert (varchar(32),case v.number
  1313.             when 193 then 'SELECT'
  1314.             when 195 then 'INSERT'
  1315.             when 197 then 'UPDATE'
  1316.             else 'REFERENCES'
  1317.         end) PRIVILEGE,
  1318.         convert(varchar(3),'YES') IS_GRANTABLE
  1319.     from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  1320.     where
  1321.         c.id = @table_id
  1322.         and c.name like @column_name
  1323.         and c.id = o.id
  1324.         and u.suid = 1        /* grantor is dbo of database */
  1325.         and v.type = 'P'    /* cross product to get all exposed privileges */
  1326.         and v.number in (26,193,195,197)
  1327.         and not exists (    /* exclude revoke'd privileges */
  1328.             select *
  1329.             from sysprotects p1
  1330.             where
  1331.                 p1.protecttype = 206
  1332.                 and p1.action = v.number
  1333.                 and p1.id = o.id
  1334.                 and p1.uid = o.uid)
  1335.     order by 4, 7
  1336. go
  1337.  
  1338.  
  1339.  
  1340. if (charindex('7.00', @@version) = 0)
  1341. begin
  1342.     print ''
  1343.     print ''
  1344.     print 'Warning:'
  1345.     print 'you are installing the stored procedures '
  1346.     print 'on a pre 7.0 SQL Server.'
  1347.     print 'Ignore the following errors.'
  1348. end
  1349. else
  1350.     drop proc sp_column_privileges
  1351. go
  1352.  
  1353. /*    Procedure for 7.00 server */
  1354. CREATE PROCEDURE sp_column_privileges (
  1355.             @table_name         sysname,
  1356.             @table_owner        sysname = null,
  1357.             @table_qualifier    sysname = null,
  1358.             @column_name        nvarchar(384) = null)    /* 3*128 */
  1359. as
  1360.  
  1361.     declare @table_id     int
  1362.  
  1363.     if @column_name is null /*    If column name not supplied, match all */
  1364.         select @column_name = '%'
  1365.  
  1366.     if @table_qualifier is not null
  1367.     begin
  1368.         if db_name() <> @table_qualifier
  1369.         begin    /* If qualifier doesn't match current database */
  1370.             raiserror (15250, -1,-1)
  1371.             return
  1372.         end
  1373.     end
  1374.     if @table_owner is null
  1375.     begin    /* If unqualified table name */
  1376.         select @table_id = object_id(quotename(@table_name))
  1377.     end
  1378.     else
  1379.     begin    /* Qualified table name */
  1380.         if @table_owner = N''
  1381.         begin    /* If empty owner name */
  1382.             select @table_id = 0
  1383.         end
  1384.         else
  1385.         begin
  1386.             select @table_id = object_id(quotename(@table_owner) +
  1387.                 '.' + quotename(@table_name))
  1388.         end
  1389.     end
  1390.  
  1391.     select
  1392.         convert(sysname,db_name()) TABLE_QUALIFIER,
  1393.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  1394.         @table_name TABLE_NAME,
  1395.         convert(sysname,c.name) COLUMN_NAME,
  1396.         convert(sysname,user_name(p.grantor)) GRANTOR,
  1397.         convert(sysname,user_name(u.uid)) GRANTEE,
  1398.         convert (varchar(32),case p.action
  1399.              when 193 then 'SELECT'
  1400.              when 195 then 'INSERT'
  1401.              when 197 then 'UPDATE'
  1402.              else 'REFERENCES'
  1403.         end) PRIVILEGE,
  1404.         convert (varchar(3),case when p.protecttype = 205 then 'NO'
  1405.             else 'YES'
  1406.         end) IS_GRANTABLE
  1407.     from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  1408.     where
  1409.         c.id = @table_id
  1410.         and c.name like @column_name
  1411.         and c.id = p.id
  1412.         and c.id = o.id
  1413.         and case substring(p.columns, 1, 1) & 1
  1414.                 when NULL then 255    /* all columns have permission */
  1415.                 when 0 then convert(tinyint, substring(p.columns, v.low, 1))
  1416.                 else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
  1417.             end
  1418.             & v.high <> 0            /* permission applies to this column */
  1419.         and v.number <= (select count(*) from syscolumns
  1420.             where id = @table_id)    /* ranges from 1 to # of columns in table */
  1421.         and v.type = 'P'
  1422.         and v.number = c.colid
  1423.             /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  1424.         and (u.uid > 0 and u.uid < 16384)
  1425.         and ((p.uid = u.uid) or 
  1426.              (p.uid = m.groupuid and u.uid = m.memberuid))
  1427.         and p.protecttype <> 206    /* only grant rows */
  1428.         and p.action in (26,193,195,197)
  1429.         and o.uid <> u.uid            /* no rows for owner */
  1430.         and not exists (            /* exclude revoke'd privileges */
  1431.             select *
  1432.             from sysprotects p1
  1433.             where
  1434.                 p1.protecttype = 206
  1435.                 and p1.action = p.action
  1436.                 and p1.id = p.id
  1437.                 and p1.uid = u.uid
  1438.                 and case substring(p1.columns, 1, 1) & 1
  1439.                         when NULL then 255    /* all columns have permission */
  1440.                         when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  1441.                                             else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
  1442.                     end
  1443.                     & v.high <> 0)            /* permission applies to this column */
  1444.     union all
  1445.     select    /*    Add rows for table owner */
  1446.         convert(sysname,db_name()) TABLE_QUALIFIER,
  1447.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  1448.         @table_name TABLE_NAME,
  1449.         convert(sysname,col_name(@table_id, c.colid)) COLUMN_NAME,
  1450.         convert(sysname,user_name(u.uid)) grantor,
  1451.         convert(sysname,user_name(o.uid)) grantee,
  1452.         convert (varchar(32),case v.number
  1453.             when 193 then 'SELECT'
  1454.             when 195 then 'INSERT'
  1455.             when 197 then 'UPDATE'
  1456.             else 'REFERENCES'
  1457.         end) PRIVILEGE,
  1458.         convert(varchar(3),'YES') IS_GRANTABLE
  1459.     from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  1460.     where
  1461.         c.id = @table_id
  1462.         and c.name like @column_name
  1463.         and c.id = o.id
  1464.         and u.uid = 1        /* grantor is 'dbo' of database */
  1465.         and v.type = 'P'    /* cross product to get all exposed privileges */
  1466.         and v.number in (26,193,195,197)
  1467.         and not exists (    /* exclude revoke'd privileges */
  1468.             select *
  1469.             from sysprotects p1
  1470.             where
  1471.                 p1.protecttype = 206
  1472.                 and p1.action = v.number
  1473.                 and p1.id = o.id
  1474.                 and p1.uid = o.uid)
  1475.     order by 4, 7
  1476. go
  1477.  
  1478.  
  1479. grant execute on sp_column_privileges to public
  1480. go
  1481.  
  1482. dump tran master with no_log
  1483. go
  1484.  
  1485. print 'creating sp_columns'
  1486. go
  1487.  
  1488. /*    Procedure for pre-6.0 server */
  1489. CREATE PROCEDURE sp_columns (
  1490.                  @table_name        varchar(96),
  1491.                  @table_owner        varchar(96) = null,
  1492.                  @table_qualifier    varchar(32) = null,
  1493.                  @column_name        varchar(96) = null,
  1494.                  @ODBCVer            int = 2)
  1495. AS
  1496.     DECLARE @full_table_name    varchar(193)
  1497.     DECLARE @table_id int
  1498.  
  1499.     if @ODBCVer <> 3
  1500.         select @ODBCVer = 2
  1501.     if @column_name is null /*    If column name not supplied, match all */
  1502.         select @column_name = '%'
  1503.     if @table_qualifier is not null
  1504.     begin
  1505.         if db_name() <> @table_qualifier
  1506.         begin    /* If qualifier doesn't match current database */
  1507.             raiserror 20001 'Table qualifier must be name of current database'
  1508.             return
  1509.         end
  1510.     end
  1511.     if @table_name is null
  1512.     begin    /*    If table name not supplied, match all */
  1513.         select @table_name = '%'
  1514.     end
  1515.     if @table_owner is null
  1516.     begin    /* If unqualified table name */
  1517.         SELECT @full_table_name = @table_name
  1518.     end
  1519.     else
  1520.     begin    /* Qualified table name */
  1521.         SELECT @full_table_name = @table_owner + '.' + @table_name
  1522.     end
  1523.  
  1524.     /*    Get Object ID */
  1525.     SELECT @table_id = object_id(@full_table_name)
  1526.     if ((charindex('%',@full_table_name) = 0) and
  1527.         (charindex('_',@full_table_name) = 0)  and
  1528.         @table_id <> 0)
  1529.     begin
  1530.         /* this block is for the case where there is no pattern
  1531.              matching required for the table name */
  1532.         SELECT
  1533.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1534.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1535.             TABLE_NAME = convert(varchar(32),o.name),
  1536.             COLUMN_NAME = convert(varchar(32),c.name),
  1537.             d.DATA_TYPE,
  1538.             TYPE_NAME = t.name,
  1539.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  1540.             LENGTH = isnull(d.length, convert(int,c.length)),
  1541.             SCALE = d.numeric_scale,
  1542.             d.RADIX,
  1543.             NULLABLE =    /* set nullability from status flag */
  1544.                 convert(smallint, convert(bit, c.status&8)),
  1545.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1546.             COLUMN_DEF = text,
  1547.             d.SQL_DATA_TYPE,
  1548.             d.SQL_DATETIME_SUB,
  1549.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  1550.             ORDINAL_POSITION = convert(int,c.colid),
  1551.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1552.             SS_DATA_TYPE = c.type
  1553.         FROM
  1554.             syscolumns c,
  1555.             sysobjects o,
  1556.             syscomments m,
  1557.             master.dbo.spt_datatype_info d,
  1558.             systypes t
  1559.         WHERE
  1560.             o.id = @table_id
  1561.             AND c.id = o.id
  1562.             AND t.type = d.ss_dtype
  1563.             AND c.length = isnull(d.fixlen, c.length)
  1564.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1565.             AND o.type <> 'P'
  1566.             AND c.usertype = t.usertype
  1567.             AND c.name like @column_name
  1568.             AND c.cdefault *= m.id
  1569.             AND m.colid = 1
  1570.         ORDER BY 17
  1571.     end
  1572.     else
  1573.     begin
  1574.         /* this block is for the case where there IS pattern
  1575.              matching done on the table name */
  1576.         if @table_owner is null /*    If owner not supplied, match all */
  1577.             select @table_owner = '%'
  1578.         SELECT
  1579.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1580.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1581.             TABLE_NAME = convert(varchar(32),o.name),
  1582.             COLUMN_NAME = convert(varchar(32),c.name),
  1583.             d.DATA_TYPE,
  1584.             TYPE_NAME = t.name,
  1585.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  1586.             LENGTH = isnull(d.length, convert(int,c.length)),
  1587.             SCALE = d.numeric_scale,
  1588.             d.RADIX,
  1589.             NULLABLE =    /* set nullability from status flag */
  1590.                 convert(smallint, convert(bit, c.status&8)),
  1591.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1592.             COLUMN_DEF = text,
  1593.             d.SQL_DATA_TYPE,
  1594.             d.SQL_DATETIME_SUB,
  1595.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  1596.             ORDINAL_POSITION = convert(int,c.colid),
  1597.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1598.             SS_DATA_TYPE = c.type
  1599.         FROM
  1600.             syscolumns c,
  1601.             sysobjects o,
  1602.             syscomments m,
  1603.             master.dbo.spt_datatype_info d,
  1604.             systypes t
  1605.         WHERE
  1606.             o.name like @table_name
  1607.             AND user_name(o.uid) like @table_owner
  1608.             AND o.id = c.id
  1609.             AND t.type = d.ss_dtype
  1610.             AND c.length = isnull(d.fixlen, c.length)
  1611.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1612.             AND o.type <> 'P'
  1613.             AND c.usertype = t.usertype
  1614.             AND c.name like @column_name
  1615.             AND c.cdefault *= m.id
  1616.             AND m.colid = 1
  1617.         ORDER BY 2, 3, 17
  1618.     end
  1619. go
  1620.  
  1621. if (charindex('6.00', @@version) = 0 and
  1622.     charindex('6.50', @@version) = 0 and
  1623.     charindex('7.00', @@version) = 0)
  1624. begin
  1625.     print ''
  1626.     print ''
  1627.     print 'Warning:'
  1628.     print 'you are installing the stored procedures '
  1629.     print 'on a pre 6.0 SQL Server.'
  1630.     print 'Ignore the following error.'
  1631. end
  1632. else
  1633.     drop proc sp_columns
  1634. go
  1635.  
  1636. /*    Procedure for 6.0 and 6.50 server */
  1637. CREATE PROCEDURE sp_columns (
  1638.                  @table_name        varchar(96),
  1639.                  @table_owner        varchar(96) = null,
  1640.                  @table_qualifier    varchar(32) = null,
  1641.                  @column_name        varchar(96) = null,
  1642.                  @ODBCVer            int = 2)
  1643. AS
  1644.     DECLARE @full_table_name    varchar(193)
  1645.     DECLARE @table_id int
  1646.  
  1647.     if @ODBCVer <> 3
  1648.         select @ODBCVer = 2
  1649.     if @column_name is null /*    If column name not supplied, match all */
  1650.         select @column_name = '%'
  1651.     if @table_qualifier is not null
  1652.     begin
  1653.         if db_name() <> @table_qualifier
  1654.         begin    /* If qualifier doesn't match current database */
  1655.             raiserror (15250, -1,-1)
  1656.             return
  1657.         end
  1658.     end
  1659.     if @table_name is null
  1660.     begin    /*    If table name not supplied, match all */
  1661.         select @table_name = '%'
  1662.     end
  1663.     if @table_owner is null
  1664.     begin    /* If unqualified table name */
  1665.         SELECT @full_table_name = @table_name
  1666.     end
  1667.     else
  1668.     begin    /* Qualified table name */
  1669.         SELECT @full_table_name = @table_owner + '.' + @table_name
  1670.     end
  1671.  
  1672.     /*    Get Object ID */
  1673.     SELECT @table_id = object_id(@full_table_name)
  1674.     if ((charindex('%',@full_table_name) = 0) and
  1675.         (charindex('_',@full_table_name) = 0)  and
  1676.         @table_id <> 0)
  1677.     begin
  1678.         /* this block is for the case where there is no pattern
  1679.             matching required for the table name */
  1680.         SELECT
  1681.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1682.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1683.             TABLE_NAME = convert(varchar(32),o.name),
  1684.             COLUMN_NAME = convert(varchar(32),c.name),
  1685.             d.DATA_TYPE,
  1686.             convert(varchar(32),case
  1687.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  1688.                 else d.TYPE_NAME
  1689.             end) TYPE_NAME,
  1690.             convert(int,case
  1691.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  1692.                 else isnull(convert(int,c.prec), 2147483647)
  1693.             end) "PRECISION",
  1694.             convert(int,case
  1695.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  1696.                     c.prec+2
  1697.                 else
  1698.                     isnull(d.length, c.length)
  1699.             end) LENGTH,
  1700.             SCALE = convert(smallint, c.scale),
  1701.             d.RADIX,
  1702.             NULLABLE =    /* set nullability from status flag */
  1703.                 convert(smallint, convert(bit, c.status&8)),
  1704.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1705.             COLUMN_DEF = text,
  1706.             d.SQL_DATA_TYPE,
  1707.             d.SQL_DATETIME_SUB,
  1708.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  1709.             ORDINAL_POSITION = convert(int,c.colid),
  1710.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1711.             SS_DATA_TYPE = c.type
  1712.         FROM
  1713.             syscolumns c,
  1714.             sysobjects o,
  1715.             syscomments m,
  1716.             master.dbo.spt_datatype_info d,
  1717.             systypes t
  1718.         WHERE
  1719.             o.id = @table_id
  1720.             AND c.id = o.id
  1721.             AND t.type = d.ss_dtype
  1722.             AND c.length = isnull(d.fixlen, c.length)
  1723.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1724.             AND o.type <> 'P'
  1725.             AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  1726.             AND c.usertype = t.usertype
  1727.             AND c.name like @column_name
  1728.             AND c.cdefault *= m.id
  1729.             AND m.colid = 1
  1730.         ORDER BY 17
  1731.     end
  1732.     else
  1733.     begin
  1734.         /* this block is for the case where there IS pattern
  1735.             matching done on the table name */
  1736.         if @table_owner is null /*    If owner not supplied, match all */
  1737.             select @table_owner = '%'
  1738.         SELECT
  1739.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1740.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1741.             TABLE_NAME = convert(varchar(32),o.name),
  1742.             COLUMN_NAME = convert(varchar(32),c.name),
  1743.             d.DATA_TYPE,
  1744.             convert(varchar(32),case
  1745.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  1746.                 else d.TYPE_NAME
  1747.             end) TYPE_NAME,
  1748.             convert(int,case
  1749.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  1750.                 else isnull(convert(int,c.prec), 2147483647)
  1751.             end) "PRECISION",
  1752.             convert(int,case
  1753.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  1754.                     c.prec+2
  1755.                 else
  1756.                     isnull(d.length, c.length)
  1757.             end) LENGTH,
  1758.             SCALE = convert(smallint, c.scale),
  1759.             d.RADIX,
  1760.             NULLABLE =    /* set nullability from status flag */
  1761.                 convert(smallint, convert(bit, c.status&8)),
  1762.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1763.             COLUMN_DEF = text,
  1764.             d.SQL_DATA_TYPE,
  1765.             d.SQL_DATETIME_SUB,
  1766.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  1767.             ORDINAL_POSITION = convert(int,c.colid),
  1768.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1769.             SS_DATA_TYPE = c.type
  1770.         FROM
  1771.             syscolumns c,
  1772.             sysobjects o,
  1773.             syscomments m,
  1774.             master.dbo.spt_datatype_info d,
  1775.             systypes t
  1776.         WHERE
  1777.             o.name like @table_name
  1778.             AND user_name(o.uid) like @table_owner
  1779.             AND o.id = c.id
  1780.             AND t.type = d.ss_dtype
  1781.             AND c.length = isnull(d.fixlen, c.length)
  1782.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1783.             AND o.type <> 'P'
  1784.             AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  1785.             AND c.usertype = t.usertype
  1786.             AND c.name like @column_name
  1787.             AND c.cdefault *= m.id
  1788.             AND m.colid = 1
  1789.         ORDER BY 2, 3, 17
  1790.     end
  1791. go
  1792.  
  1793. if (charindex('7.00', @@version) = 0)
  1794. begin
  1795.     print ''
  1796.     print ''
  1797.     print 'Warning:'
  1798.     print 'you are installing the stored procedures '
  1799.     print 'on a pre 7.0 SQL Server.'
  1800.     print 'Ignore the following errors.'
  1801. end
  1802. else
  1803.     drop proc sp_columns
  1804. go
  1805.  
  1806. /*    Procedure for 7.0 server */
  1807. CREATE PROCEDURE sp_columns (
  1808.                  @table_name        nvarchar(384),
  1809.                  @table_owner        nvarchar(384) = null,
  1810.                  @table_qualifier    sysname = null,
  1811.                  @column_name        nvarchar(384) = null,
  1812.                  @ODBCVer            int = 2)
  1813. AS
  1814.     DECLARE @full_table_name    nvarchar(769)
  1815.     DECLARE @table_id int
  1816.  
  1817.     if @ODBCVer <> 3
  1818.         select @ODBCVer = 2
  1819.     if @column_name is null /*    If column name not supplied, match all */
  1820.         select @column_name = '%'
  1821.     if @table_qualifier is not null
  1822.     begin
  1823.         if db_name() <> @table_qualifier
  1824.         begin    /* If qualifier doesn't match current database */
  1825.             raiserror (15250, -1,-1)
  1826.             return
  1827.         end
  1828.     end
  1829.     if @table_name is null
  1830.     begin    /*    If table name not supplied, match all */
  1831.         select @table_name = '%'
  1832.     end
  1833.     if @table_owner is null
  1834.     begin    /* If unqualified table name */
  1835.         SELECT @full_table_name = quotename(@table_name)
  1836.     end
  1837.     else
  1838.     begin    /* Qualified table name */
  1839.         if @table_owner = ''
  1840.         begin    /* If empty owner name */
  1841.             SELECT @full_table_name = quotename(@table_owner)
  1842.         end
  1843.         else
  1844.         begin
  1845.             SELECT @full_table_name = quotename(@table_owner) +
  1846.                 '.' + quotename(@table_name)
  1847.         end
  1848.     end
  1849.  
  1850.     /*    Get Object ID */
  1851.     SELECT @table_id = object_id(@full_table_name)
  1852.     if ((charindex('%',@full_table_name) = 0) and
  1853.         (charindex('_',@full_table_name) = 0)  and
  1854.         @table_id <> 0)
  1855.     begin
  1856.         /* this block is for the case where there is no pattern
  1857.             matching required for the table name */
  1858.         SELECT
  1859.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  1860.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  1861.             TABLE_NAME = convert(sysname,o.name),
  1862.             COLUMN_NAME = convert(sysname,c.name),
  1863.             d.DATA_TYPE,
  1864.             convert (sysname,case
  1865.                 when t.xusertype > 255 then t.name
  1866.                 else d.TYPE_NAME
  1867.             end) TYPE_NAME,
  1868.             convert(int,case
  1869.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  1870.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  1871.             end) "PRECISION",
  1872.             convert(int,case
  1873.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  1874.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  1875.                 else
  1876.                     isnull(d.length, c.length)
  1877.             end) LENGTH,
  1878.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  1879.             d.RADIX,
  1880.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  1881.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1882.             COLUMN_DEF = text,
  1883.             d.SQL_DATA_TYPE,
  1884.             d.SQL_DATETIME_SUB,
  1885.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  1886.             ORDINAL_POSITION = convert(int,c.colid),
  1887.             IS_NULLABLE = convert(varchar(254),
  1888.                 substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
  1889.             SS_DATA_TYPE = c.type
  1890.         FROM
  1891.             sysobjects o,
  1892.             master.dbo.spt_datatype_info d,
  1893.             systypes t,
  1894.             syscolumns c
  1895.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  1896.                 AND m.colid = 1
  1897.         WHERE
  1898.             o.id = @table_id
  1899.             AND c.id = o.id
  1900.             AND t.xtype = d.ss_dtype
  1901.             AND c.length = isnull(d.fixlen, c.length)
  1902.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1903.             AND o.type <> 'P'
  1904.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  1905.             AND c.xusertype = t.xusertype
  1906.             AND c.name like @column_name
  1907.         ORDER BY 17
  1908.     end
  1909.     else
  1910.     begin
  1911.         /* this block is for the case where there IS pattern
  1912.             matching done on the table name */
  1913.         if @table_owner is null /*    If owner not supplied, match all */
  1914.             select @table_owner = '%'
  1915.         SELECT
  1916.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  1917.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  1918.             TABLE_NAME = convert(sysname,o.name),
  1919.             COLUMN_NAME = convert(sysname,c.name),
  1920.             d.DATA_TYPE,
  1921.             convert (sysname,case
  1922.                 when t.xusertype > 255 then t.name
  1923.                 else d.TYPE_NAME
  1924.             end) TYPE_NAME,
  1925.             convert(int,case
  1926.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  1927.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  1928.             end) "PRECISION",
  1929.             convert(int,case
  1930.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  1931.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  1932.                 else
  1933.                     isnull(d.length, c.length)
  1934.             end) LENGTH,
  1935.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  1936.             d.RADIX,
  1937.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  1938.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1939.             COLUMN_DEF = text,
  1940.             d.SQL_DATA_TYPE,
  1941.             d.SQL_DATETIME_SUB,
  1942.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  1943.             ORDINAL_POSITION = convert(int,c.colid),
  1944.             IS_NULLABLE = convert(varchar(254),
  1945.                 rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
  1946.             SS_DATA_TYPE = c.type
  1947.         FROM
  1948.             sysobjects o,
  1949.             master.dbo.spt_datatype_info d,
  1950.             systypes t,
  1951.             syscolumns c
  1952.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  1953.                 AND m.colid = 1
  1954.         WHERE
  1955.             o.name like @table_name
  1956.             AND user_name(o.uid) like @table_owner
  1957.             AND o.id = c.id
  1958.             AND t.xtype = d.ss_dtype
  1959.             AND c.length = isnull(d.fixlen, c.length)
  1960.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1961.             AND o.type <> 'P'
  1962.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  1963.             AND c.xusertype = t.xusertype
  1964.             AND c.name like @column_name
  1965.         ORDER BY 2, 3, 17
  1966.     end
  1967. go
  1968.  
  1969. grant execute on sp_columns to public
  1970. go
  1971.  
  1972. dump tran master with no_log
  1973. go
  1974.  
  1975. print 'creating sp_databases'
  1976. go
  1977.  
  1978. /*    Procedure for pre-7.0 server */
  1979. create proc sp_databases
  1980. as
  1981.     /* Use temporary table to sum up database size w/o using group by */
  1982.     create table #databases (
  1983.                   DATABASE_NAME varchar(32) NOT NULL,
  1984.                   size int NOT NULL)
  1985.  
  1986.     /* Insert row for each database */
  1987.     insert into #databases
  1988.         select
  1989.             name,
  1990.             (select sum(size) from master.dbo.sysusages
  1991.                 where dbid = d.dbid)
  1992.         from master.dbo.sysdatabases d
  1993.  
  1994.     select
  1995.          DATABASE_NAME,
  1996.          DATABASE_SIZE = size*2,    /* Convert from 2048 byte pages to K */
  1997.          REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  1998.     from #databases
  1999.     order by 1
  2000. go
  2001.  
  2002. if (charindex('7.00', @@version) = 0)
  2003. begin
  2004.     print ''
  2005.     print ''
  2006.     print 'Warning:'
  2007.     print 'you are installing the stored procedures '
  2008.     print 'on a pre 7.0 SQL Server.'
  2009.     print 'Ignore the following errors.'
  2010. end
  2011. else
  2012.     drop proc sp_databases
  2013. go
  2014.  
  2015. /*    Procedure for 7.0 server */
  2016. create proc sp_databases
  2017. as
  2018.     declare @name sysname
  2019.     declare @SQL  nvarchar(600)
  2020.  
  2021.     /* Use temporary table to sum up database size w/o using group by */
  2022.     create table #databases (
  2023.                   DATABASE_NAME sysname NOT NULL,
  2024.                   size int NOT NULL)
  2025.  
  2026.     declare c1 cursor for 
  2027.         select name from master.dbo.sysdatabases
  2028.  
  2029.     open c1
  2030.     fetch c1 into @name
  2031.  
  2032.     while @@fetch_status >= 0
  2033.     begin
  2034.         select @SQL = 'insert into #databases
  2035.                 select N'''+ @name + ''', sum(size) from '
  2036.                 + QuoteName(@name) + '.dbo.sysfiles'
  2037.         /* Insert row for each database */
  2038.         execute (@SQL)
  2039.         fetch c1 into @name
  2040.     end
  2041.     deallocate c1
  2042.  
  2043.     select    
  2044.         DATABASE_NAME,
  2045.         DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */
  2046.         REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  2047.     from #databases
  2048.     order by 1
  2049. go
  2050.  
  2051. grant execute on sp_databases to public
  2052. go
  2053.  
  2054. dump tran master with no_log
  2055. go
  2056.  
  2057. print 'creating sp_datatype_info'
  2058. go
  2059.  
  2060. /*    Procedure for pre-6.0 server */
  2061. create proc sp_datatype_info
  2062.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2063. as
  2064.     if @ODBCVer <> 3
  2065.         select @ODBCVer = 2
  2066.     if @data_type = 0
  2067.         select
  2068.             TYPE_NAME = t.name,
  2069.             d.DATA_TYPE,
  2070.             "PRECISION" = isnull(d.data_precision, convert(int,t.length)),
  2071.             d.LITERAL_PREFIX,
  2072.             d.LITERAL_SUFFIX,
  2073.             e.CREATE_PARAMS,
  2074.             d.NULLABLE,
  2075.             d.CASE_SENSITIVE,
  2076.             d.SEARCHABLE,
  2077.             d.UNSIGNED_ATTRIBUTE,
  2078.             d.MONEY,
  2079.             d.AUTO_INCREMENT,
  2080.             LOCAL_TYPE_NAME = t.name,
  2081.             MINIMUM_SCALE = d.numeric_scale,
  2082.             MAXIMUM_SCALE = d.numeric_scale,
  2083.             d.SQL_DATA_TYPE,
  2084.             d.SQL_DATETIME_SUB,
  2085.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2086.             INTERVAL_PRECISION = convert(smallint,NULL),
  2087.             USERTYPE = t.usertype
  2088.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2089.         where
  2090.             d.ss_dtype = t.type
  2091.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2092.             and t.usertype *= e.user_type
  2093.             and t.type not in (111,109,38,110)    /* get rid of nullable types */
  2094.         order by 2, 12, 11, t.usertype
  2095.  
  2096.     else
  2097.         select
  2098.             TYPE_NAME = t.name,
  2099.             d.DATA_TYPE,
  2100.             "PRECISION" = isnull(d.data_precision, convert(int,t.length)),
  2101.             d.LITERAL_PREFIX,
  2102.             d.LITERAL_SUFFIX,
  2103.             e.CREATE_PARAMS,
  2104.             d.NULLABLE,
  2105.             d.CASE_SENSITIVE,
  2106.             d.SEARCHABLE,
  2107.             d.UNSIGNED_ATTRIBUTE,
  2108.             d.MONEY,
  2109.             d.AUTO_INCREMENT,
  2110.             LOCAL_TYPE_NAME = t.name,
  2111.             MINIMUM_SCALE = d.numeric_scale,
  2112.             MAXIMUM_SCALE = d.numeric_scale,
  2113.             d.SQL_DATA_TYPE,
  2114.             d.SQL_DATETIME_SUB,
  2115.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2116.             INTERVAL_PRECISION = convert(smallint,NULL),
  2117.             USERTYPE = t.usertype
  2118.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2119.         where
  2120.             DATA_TYPE = @data_type
  2121.             and d.ss_dtype = t.type
  2122.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2123.             and t.usertype *= e.user_type
  2124.             and t.type not in (111,109,38,110)    /* get rid of nullable types */
  2125.         order by 12, 11, t.usertype
  2126.  
  2127. go
  2128.  
  2129. if (charindex('6.00', @@version) = 0 and
  2130.     charindex('6.50', @@version) = 0 and
  2131.     charindex('7.00', @@version) = 0)
  2132. begin
  2133.     print ''
  2134.     print ''
  2135.     print 'Warning:'
  2136.     print 'you are installing the stored procedures '
  2137.     print 'on a pre 6.0 SQL Server.'
  2138.     print 'Ignore the following errors.'
  2139. end
  2140. else
  2141.     drop proc sp_datatype_info
  2142. go
  2143.  
  2144. /*    Procedure for 6.0 and 6.50 servers */
  2145. create proc sp_datatype_info
  2146.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2147. as
  2148.     if @ODBCVer <> 3
  2149.         select @ODBCVer = 2
  2150.     if @data_type = 0
  2151.         select
  2152.             convert(varchar(32),case
  2153.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2154.                 else d.TYPE_NAME
  2155.             end) TYPE_NAME,
  2156.             d.DATA_TYPE,
  2157.             convert(int,case
  2158.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2159.                 when d.ss_dtype in (35,34) then 2147483647                /* TEXT/IMAGE */
  2160.                 when d.ss_dtype in (55,63,106,108) then @@max_precision /* DECIMAL/NUMERIC */
  2161.                 else t.prec
  2162.             end) "PRECISION",
  2163.             d.LITERAL_PREFIX,
  2164.             d.LITERAL_SUFFIX,
  2165.             e.CREATE_PARAMS,
  2166.             convert(smallint,case
  2167.                 when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2168.                 else t.allownulls
  2169.             end) NULLABLE,
  2170.             d.CASE_SENSITIVE,
  2171.             d.SEARCHABLE,
  2172.             d.UNSIGNED_ATTRIBUTE,
  2173.             d.MONEY,
  2174.             d.AUTO_INCREMENT,
  2175.             convert(varchar(32),case
  2176.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2177.                 else d.TYPE_NAME
  2178.             end) LOCAL_TYPE_NAME,
  2179.             MINIMUM_SCALE = d.numeric_scale,
  2180.             convert(smallint,case
  2181.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
  2182.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2183.                 else t.scale
  2184.             end) MAXIMUM_SCALE,
  2185.             d.SQL_DATA_TYPE,
  2186.             d.SQL_DATETIME_SUB,
  2187.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2188.             INTERVAL_PRECISION = convert(smallint,NULL),
  2189.             USERTYPE = t.usertype
  2190.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2191.         where
  2192.             d.ss_dtype = t.type
  2193.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2194.             and t.usertype *= e.user_type
  2195.             and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
  2196.             and t.type not in (111,109,38,110,55,63)    /* get rid of nullable types */
  2197.         order by 2, 12, 11, t.usertype
  2198.  
  2199.     else
  2200.         select
  2201.             convert(varchar(32),case
  2202.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2203.                 else d.TYPE_NAME
  2204.             end) TYPE_NAME,
  2205.             d.DATA_TYPE,
  2206.             convert(int,case
  2207.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2208.                 when d.ss_dtype in (35,34) then 2147483647                /* TEXT/IMAGE */
  2209.                 when d.ss_dtype in (55,63,106,108) then @@max_precision /* DECIMAL/NUMERIC */
  2210.                 else t.prec
  2211.             end) "PRECISION",
  2212.             d.LITERAL_PREFIX,
  2213.             d.LITERAL_SUFFIX,
  2214.             e.CREATE_PARAMS,
  2215.             convert(smallint,case
  2216.                 when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2217.                 else t.allownulls
  2218.             end) NULLABLE,
  2219.             d.CASE_SENSITIVE,
  2220.             d.SEARCHABLE,
  2221.             d.UNSIGNED_ATTRIBUTE,
  2222.             d.MONEY,
  2223.             d.AUTO_INCREMENT,
  2224.             convert(varchar(32),case
  2225.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2226.                 else d.TYPE_NAME
  2227.             end) LOCAL_TYPE_NAME,
  2228.             MINIMUM_SCALE = d.numeric_scale,
  2229.             convert(smallint,case
  2230.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
  2231.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2232.                 else t.scale
  2233.             end) MAXIMUM_SCALE,
  2234.             d.SQL_DATA_TYPE,
  2235.             d.SQL_DATETIME_SUB,
  2236.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2237.             INTERVAL_PRECISION = convert(smallint,NULL),
  2238.             USERTYPE = t.usertype
  2239.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2240.         where
  2241.             d.DATA_TYPE = @data_type
  2242.             and d.ss_dtype = t.type
  2243.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2244.             and t.usertype *= e.user_type
  2245.             and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
  2246.             and t.type not in (111,109,38,110,55,63)    /* get rid of nullable types */
  2247.         order by 12, 11, t.usertype
  2248. go
  2249.  
  2250. if (charindex('7.00', @@version) = 0)
  2251. begin
  2252.     print ''
  2253.     print ''
  2254.     print 'Warning:'
  2255.     print 'you are installing the stored procedures '
  2256.     print 'on a pre 7.0 SQL Server.'
  2257.     print 'Ignore the following errors.'
  2258. end
  2259. else
  2260.     drop proc sp_datatype_info
  2261. go
  2262.  
  2263. /*    Procedure for 7.0 server */
  2264. create proc sp_datatype_info
  2265.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2266. as
  2267.     declare @mintype int
  2268.     declare @maxtype int
  2269.  
  2270.     if @ODBCVer <> 3
  2271.         select @ODBCVer = 2
  2272.     if @data_type = 0
  2273.     begin
  2274.         select @mintype = -32768
  2275.         select @maxtype = 32767
  2276.     end
  2277.     else
  2278.     begin
  2279.         select @mintype = @data_type
  2280.         select @maxtype = @data_type
  2281.     end
  2282.  
  2283.     select
  2284.         convert(sysname,case
  2285.             when t.xusertype > 255 then t.name
  2286.             else d.TYPE_NAME
  2287.         end) TYPE_NAME,
  2288.         d.DATA_TYPE,
  2289.         convert(int,case
  2290.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2291.             when type_name(d.ss_dtype) IN ('numeric','decimal') then @@max_precision /* DECIMAL/NUMERIC */
  2292.             else TypeProperty (t.name, 'Precision')
  2293.         end) "PRECISION",
  2294.         d.LITERAL_PREFIX,
  2295.         d.LITERAL_SUFFIX,
  2296.         e.CREATE_PARAMS,
  2297.         convert(smallint,case
  2298.             when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2299.             else TypeProperty (t.name, 'AllowsNull')
  2300.         end) NULLABLE,
  2301.         d.CASE_SENSITIVE,
  2302.         d.SEARCHABLE,
  2303.         d.UNSIGNED_ATTRIBUTE,
  2304.         d.MONEY,
  2305.         d.AUTO_INCREMENT,
  2306.         convert(sysname,case
  2307.             when t.xusertype > 255 then t.name
  2308.             else d.LOCAL_TYPE_NAME
  2309.         end) LOCAL_TYPE_NAME,
  2310.         MINIMUM_SCALE = d.numeric_scale,
  2311.         convert(smallint,case
  2312.             when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
  2313.             when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2314.             else TypeProperty (t.name, 'Scale')
  2315.         end) MAXIMUM_SCALE,
  2316.         d.SQL_DATA_TYPE,
  2317.         d.SQL_DATETIME_SUB,
  2318.         NUM_PREC_RADIX = convert(int,d.RADIX),
  2319.         INTERVAL_PRECISION = convert(smallint,NULL),
  2320.         USERTYPE = t.usertype
  2321.     from master.dbo.spt_datatype_info d
  2322.         INNER JOIN systypes t on d.ss_dtype = t.xtype
  2323.         LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
  2324.             t.xusertype = e.user_type
  2325.             and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT
  2326.     where
  2327.         d.DATA_TYPE between @mintype and @maxtype
  2328.         and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2329.     order by 2, 12, 11,
  2330.     case
  2331.         when t.usertype=18 then 255
  2332.         else t.usertype
  2333.     end
  2334.  
  2335. go
  2336.  
  2337. grant execute on sp_datatype_info to public
  2338. go
  2339.  
  2340. dump tran master with no_log
  2341. go
  2342.  
  2343. print 'creating sp_fkeys'
  2344. go
  2345.  
  2346. /*    Procedure for pre-6.0 server */
  2347. CREATE PROCEDURE sp_fkeys(
  2348.                @pktable_name        varchar(32) = null,
  2349.                @pktable_owner        varchar(32) = null,
  2350.                @pktable_qualifier    varchar(32) = null,
  2351.                @fktable_name        varchar(32) = null,
  2352.                @fktable_owner        varchar(32) = null,
  2353.                @fktable_qualifier    varchar(32) = null )
  2354. as
  2355.     declare    @order_by_pk int
  2356.  
  2357.     select  @order_by_pk = 0
  2358.  
  2359.     if (@pktable_name is null) and (@fktable_name is null)
  2360.     begin    /* If neither primary key nor foreign key table names given */
  2361.         raiserror 20004 'PK table name or FK table name must be given.'
  2362.         return
  2363.     end
  2364.     if @fktable_qualifier is not null
  2365.     begin
  2366.         if db_name() <> @fktable_qualifier
  2367.         begin    /* If qualifier doesn't match current database */
  2368.             raiserror 20001 'Foreign Key Table qualifier must be name of current database'
  2369.             return
  2370.         end
  2371.     end
  2372.     if @pktable_qualifier is not null
  2373.     begin
  2374.         if db_name() <> @pktable_qualifier
  2375.         begin    /* If qualifier doesn't match current database */
  2376.             raiserror 20001 'Primary Key Table qualifier must be name of current database'
  2377.             return
  2378.         end
  2379.     end
  2380.  
  2381.     if @pktable_name is null
  2382.     begin /*  If table name not supplied, match all */
  2383.         select @pktable_name = '%'
  2384.         select @order_by_pk = 1
  2385.     end
  2386.     if @pktable_owner is null    /*    If PK owner not supplied, match all */
  2387.         select @pktable_owner = '%'
  2388.     if @fktable_name is null    /*    If table name not supplied, match all */
  2389.         select @fktable_name = '%'
  2390.     if @fktable_owner is null    /*    If FK owner not supplied, match all */
  2391.         select @fktable_owner = '%'
  2392.  
  2393.     if @@trancount <> 0
  2394.     begin    /* If inside a transaction */
  2395.         raiserror 20003 'The procedure ''sp_fkeys'' cannot be executed from within a transaction.'
  2396.         return
  2397.     end
  2398.     create table #fkeys(
  2399.              PKTABLE_QUALIFIER    varchar(32) NULL,
  2400.              PKTABLE_OWNER        varchar(32) NULL,
  2401.              PKTABLE_NAME        varchar(32) NOT NULL,
  2402.              PKCOLUMN_NAME        varchar(32) NOT NULL,
  2403.              FKTABLE_QUALIFIER    varchar(32) NULL,
  2404.              FKTABLE_OWNER        varchar(32) NULL,
  2405.              FKTABLE_NAME        varchar(32) NOT NULL,
  2406.              FKCOLUMN_NAME        varchar(32) NOT NULL,
  2407.              KEY_SEQ            smallint NOT NULL)
  2408.  
  2409.     /*    SQL Server supports upto 8 PK/FK relationships between 2 tables */
  2410.     /*    Process syskeys for each relationship */
  2411.     /*    The inserts below adds a row to the temp table for each of the
  2412.         8 possible relationships */
  2413.     insert into #fkeys
  2414.         select
  2415.             db_name(),
  2416.             user_name(o1.uid),
  2417.             object_name(k.depid),
  2418.             c2.name,
  2419.             db_name(),
  2420.             user_name(o2.uid),
  2421.             object_name(k.id),
  2422.             c1.name,
  2423.             1
  2424.         from
  2425.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2426.         where
  2427.             c1.id = k.id
  2428.             and k.type = 2    /* Foreign type key */
  2429.             and c1.colid = k.key1
  2430.             and c2.id = k.depid
  2431.             and c2.colid = k.depkey1
  2432.             and o1.id = k.depid
  2433.             and o2.id = k.id
  2434.     union all
  2435.         select
  2436.             db_name(),
  2437.             user_name(o1.uid),
  2438.             object_name(k.depid),
  2439.             c2.name,
  2440.             db_name(),
  2441.             user_name(o2.uid),
  2442.             object_name(k.id),
  2443.             c1.name,
  2444.             2
  2445.         from
  2446.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2447.         where
  2448.             c1.id = k.id
  2449.             and k.type = 2    /* Foreign type key */
  2450.             and c1.colid = k.key2
  2451.             and c2.id = k.depid
  2452.             and c2.colid = k.depkey2
  2453.             and o1.id = k.depid
  2454.             and o2.id = k.id
  2455.     union all
  2456.         select
  2457.             db_name(),
  2458.             user_name(o1.uid),
  2459.             object_name(k.depid),
  2460.             c2.name,
  2461.             db_name(),
  2462.             user_name(o2.uid),
  2463.             object_name(k.id),
  2464.             c1.name,
  2465.             3
  2466.         from
  2467.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2468.         where
  2469.             c1.id = k.id
  2470.             and k.type = 2    /* Foreign type key */
  2471.             and c1.colid = k.key3
  2472.             and c2.id = k.depid
  2473.             and c2.colid = k.depkey3
  2474.             and o1.id = k.depid
  2475.             and o2.id = k.id
  2476.     union all
  2477.         select
  2478.             db_name(),
  2479.             user_name(o1.uid),
  2480.             object_name(k.depid),
  2481.             c2.name,
  2482.             db_name(),
  2483.             user_name(o2.uid),
  2484.             object_name(k.id),
  2485.             c1.name,
  2486.             4
  2487.         from
  2488.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2489.         where
  2490.             c1.id = k.id
  2491.             and k.type = 2    /* Foreign type key */
  2492.             and c1.colid = k.key4
  2493.             and c2.id = k.depid
  2494.             and c2.colid = k.depkey4
  2495.             and o1.id = k.depid
  2496.             and o2.id = k.id
  2497.     union all
  2498.         select
  2499.             db_name(),
  2500.             user_name(o1.uid),
  2501.             object_name(k.depid),
  2502.             c2.name,
  2503.             db_name(),
  2504.             user_name(o2.uid),
  2505.             object_name(k.id),
  2506.             c1.name,
  2507.             5
  2508.         from
  2509.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2510.         where
  2511.             c1.id = k.id
  2512.             and k.type = 2    /* Foreign type key */
  2513.             and c1.colid = k.key5
  2514.             and c2.id = k.depid
  2515.             and c2.colid = k.depkey5
  2516.             and o1.id = k.depid
  2517.             and o2.id = k.id
  2518.     union all
  2519.         select
  2520.             db_name(),
  2521.             user_name(o1.uid),
  2522.             object_name(k.depid),
  2523.             c2.name,
  2524.             db_name(),
  2525.             user_name(o2.uid),
  2526.             object_name(k.id),
  2527.             c1.name,
  2528.             6
  2529.         from
  2530.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2531.         where
  2532.             c1.id = k.id
  2533.             and k.type = 2    /* Foreign type key */
  2534.             and c1.colid = k.key6
  2535.             and c2.id = k.depid
  2536.             and c2.colid = k.depkey6
  2537.             and o1.id = k.depid
  2538.             and o2.id = k.id
  2539.     union all
  2540.         select
  2541.             db_name(),
  2542.             user_name(o1.uid),
  2543.             object_name(k.depid),
  2544.             c2.name,
  2545.             db_name(),
  2546.             user_name(o2.uid),
  2547.             object_name(k.id),
  2548.             c1.name,
  2549.             7
  2550.         from
  2551.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2552.         where
  2553.             c1.id = k.id
  2554.             and k.type = 2    /* Foreign type key */
  2555.             and c1.colid = k.key7
  2556.             and c2.id = k.depid
  2557.             and c2.colid = k.depkey7
  2558.             and o1.id = k.depid
  2559.             and o2.id = k.id
  2560.     union all
  2561.         select
  2562.             db_name(),
  2563.             user_name(o1.uid),
  2564.             object_name(k.depid),
  2565.             c2.name,
  2566.             db_name(),
  2567.             user_name(o2.uid),
  2568.             object_name(k.id),
  2569.             c1.name,
  2570.             8
  2571.         from
  2572.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  2573.         where
  2574.             c1.id = k.id
  2575.             and k.type = 2    /* Foreign type key */
  2576.             and c1.colid = k.key8
  2577.             and c2.id = k.depid
  2578.             and c2.colid = k.depkey8
  2579.             and o1.id = k.depid
  2580.             and o2.id = k.id
  2581.  
  2582.     if @order_by_pk = 1 /*    If order by PK fields */
  2583.         select
  2584.             PKTABLE_QUALIFIER,
  2585.             PKTABLE_OWNER,
  2586.             PKTABLE_NAME,
  2587.             PKCOLUMN_NAME,
  2588.             FKTABLE_QUALIFIER,
  2589.             FKTABLE_OWNER,
  2590.             FKTABLE_NAME,
  2591.             FKCOLUMN_NAME,
  2592.             KEY_SEQ,
  2593.             UPDATE_RULE = convert(smallint, null),
  2594.             DELETE_RULE = convert(smallint,null),
  2595.             FK_NAME = convert(varchar(32),null),
  2596.             PK_NAME = convert(varchar(32),null),
  2597.             DEFERRABILITY = convert(smallint,7)
  2598.         from #fkeys
  2599.         where FKTABLE_NAME like @fktable_name
  2600.             and FKTABLE_OWNER like @fktable_owner
  2601.             and PKTABLE_NAME  like @pktable_name
  2602.             and PKTABLE_OWNER like @pktable_owner
  2603.         order by 1, 2, 3, 9
  2604.     else        /*    Order by FK fields */
  2605.         select
  2606.             PKTABLE_QUALIFIER,
  2607.             PKTABLE_OWNER,
  2608.             PKTABLE_NAME,
  2609.             PKCOLUMN_NAME,
  2610.             FKTABLE_QUALIFIER,
  2611.             FKTABLE_OWNER,
  2612.             FKTABLE_NAME,
  2613.             FKCOLUMN_NAME,
  2614.             KEY_SEQ,
  2615.             UPDATE_RULE = convert(smallint,null),
  2616.             DELETE_RULE = convert(smallint,null),
  2617.             FK_NAME = convert(varchar(32),null),
  2618.             PK_NAME = convert(varchar(32),null),
  2619.             DEFERRABILITY = convert(smallint,7)
  2620.         from #fkeys
  2621.         where FKTABLE_NAME like @fktable_name
  2622.             and FKTABLE_OWNER like @fktable_owner
  2623.             and PKTABLE_NAME  like @pktable_name
  2624.             and PKTABLE_OWNER like @pktable_owner
  2625.         order by 5, 6, 7, 9
  2626. go
  2627.  
  2628. if (charindex('6.00', @@version) = 0 and
  2629.     charindex('6.50', @@version) = 0 and
  2630.     charindex('7.00', @@version) = 0)
  2631. begin
  2632.     print ''
  2633.     print ''
  2634.     print 'Warning:'
  2635.     print 'you are installing the stored procedures '
  2636.     print 'on a pre 6.0 SQL Server.'
  2637.     print 'Ignore the following errors.'
  2638. end
  2639. else
  2640.     drop proc sp_fkeys
  2641. go
  2642.  
  2643. /*    Procedure for 6.0 and 6.50 servers */
  2644. CREATE PROCEDURE sp_fkeys(
  2645.                @pktable_name        varchar(32) = null,
  2646.                @pktable_owner        varchar(32) = null,
  2647.                @pktable_qualifier    varchar(32) = null,
  2648.                @fktable_name        varchar(32) = null,
  2649.                @fktable_owner        varchar(32) = null,
  2650.                @fktable_qualifier    varchar(32) = null )
  2651. as
  2652.     DECLARE @pktable_id            int
  2653.     DECLARE @pkfull_table_name    varchar(65) /* 2*32 +1 */
  2654.     DECLARE @fktable_id            int
  2655.     DECLARE @fkfull_table_name    varchar(65) /* 2*32 +1 */
  2656.     declare    @order_by_pk        int
  2657.  
  2658.     select  @order_by_pk = 0
  2659.  
  2660.     if (@pktable_name is null) and (@fktable_name is null)
  2661.     begin    /* If neither primary key nor foreign key table names given */
  2662.         raiserror (15252,-1,-1)
  2663.         return
  2664.     end
  2665.     if @fktable_qualifier is not null
  2666.     begin
  2667.         if db_name() <> @fktable_qualifier
  2668.         begin    /* If qualifier doesn't match current database */
  2669.             raiserror (15250, -1,-1)
  2670.             return
  2671.         end
  2672.     end
  2673.     if @pktable_qualifier is not null
  2674.     begin
  2675.         if db_name() <> @pktable_qualifier
  2676.         begin    /* If qualifier doesn't match current database */
  2677.             raiserror (15250, -1,-1)
  2678.             return
  2679.         end
  2680.     end
  2681.  
  2682.     if @pktable_owner is null
  2683.     begin    /* If unqualified primary key table name */
  2684.         SELECT @pkfull_table_name = @pktable_name
  2685.     end
  2686.     else
  2687.     begin    /* Qualified primary key table name */
  2688.         SELECT @pkfull_table_name = @pktable_owner + '.' + @pktable_name
  2689.     end
  2690.     /*    Get Object ID */
  2691.     SELECT @pktable_id = object_id(@pkfull_table_name)
  2692.  
  2693.     if @fktable_owner is null
  2694.     begin    /* If unqualified foreign key table name */
  2695.         SELECT @fkfull_table_name = @fktable_name
  2696.     end
  2697.     else
  2698.     begin    /* Qualified foreign key table name */
  2699.         SELECT @fkfull_table_name = @fktable_owner + '.' + @fktable_name
  2700.     end
  2701.     /*    Get Object ID */
  2702.     SELECT @fktable_id = object_id(@fkfull_table_name)
  2703.  
  2704.     if @fktable_name is not null
  2705.     begin
  2706.         if @fktable_id is null
  2707.             SELECT @fktable_id = 0    /* fk table not found, empty result */
  2708.     end
  2709.  
  2710.     if @pktable_name is null
  2711.     begin /*  If table name not supplied, match all */
  2712.         select @order_by_pk = 1
  2713.     end
  2714.     else
  2715.     begin
  2716.         if @pktable_id is null
  2717.         begin
  2718.             SELECT @pktable_id = 0    /* pk table not found, empty result */
  2719.         end
  2720.     end
  2721.  
  2722.     if (@@trancount <> 0 and
  2723.         charindex('6.50', @@version) = 0)
  2724.     begin    /* If inside a transaction */
  2725.         raiserror (15002,-1,-1,'sp_fkeys')
  2726.         return
  2727.     end
  2728.  
  2729.     create table #fkeys(
  2730.              pkdb_id        int NOT NULL,
  2731.              pktable_id     int NOT NULL,
  2732.              pkcolid        int NOT NULL,
  2733.              fkdb_id        int NOT NULL,
  2734.              fktable_id        int NOT NULL,
  2735.              fkcolid        int NOT NULL,
  2736.              KEY_SEQ        smallint NOT NULL,
  2737.              fk_id            int NOT NULL,
  2738.              pk_id            int NOT NULL)
  2739.  
  2740.     /*    SQL Server supports upto 16 PK/FK relationships between 2 tables */
  2741.     /*    Process syskeys for each relationship */
  2742.     /*    The inserts below adds a row to the temp table for each of the
  2743.         16 possible relationships */
  2744.     insert into #fkeys
  2745.         select
  2746.             r.rkeydbid,
  2747.             r.rkeyid,
  2748.             r.rkey1,
  2749.             r.fkeydbid,
  2750.             r.fkeyid,
  2751.             r.fkey1,
  2752.             1,
  2753.             r.constid,
  2754.             s.constid
  2755.         from
  2756.             sysreferences r, sysconstraints s
  2757.         where    r.rkeyid = s.id
  2758.             AND (s.status & 0xf) = 1
  2759.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2760.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2761.       union all
  2762.         select
  2763.             r.rkeydbid,
  2764.             r.rkeyid,
  2765.             r.rkey2,
  2766.             r.fkeydbid,
  2767.             r.fkeyid,
  2768.             r.fkey2,
  2769.             2,
  2770.             r.constid,
  2771.             s.constid
  2772.         from
  2773.             sysreferences r, sysconstraints s
  2774.         where    r.rkeyid = s.id
  2775.             AND (s.status & 0xf) = 1
  2776.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2777.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2778.       union all
  2779.         select
  2780.             r.rkeydbid,
  2781.             r.rkeyid,
  2782.             r.rkey3,
  2783.             r.fkeydbid,
  2784.             r.fkeyid,
  2785.             r.fkey3,
  2786.             3,
  2787.             r.constid,
  2788.             s.constid
  2789.         from
  2790.             sysreferences r, sysconstraints s
  2791.         where    r.rkeyid = s.id
  2792.             AND (s.status & 0xf) = 1
  2793.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2794.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2795.       union all
  2796.         select
  2797.             r.rkeydbid,
  2798.             r.rkeyid,
  2799.             r.rkey4,
  2800.             r.fkeydbid,
  2801.             r.fkeyid,
  2802.             r.fkey4,
  2803.             4,
  2804.             r.constid,
  2805.             s.constid
  2806.         from
  2807.             sysreferences r, sysconstraints s
  2808.         where    r.rkeyid = s.id
  2809.             AND (s.status & 0xf) = 1
  2810.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2811.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2812.       union all
  2813.         select
  2814.             r.rkeydbid,
  2815.             r.rkeyid,
  2816.             r.rkey5,
  2817.             r.fkeydbid,
  2818.             r.fkeyid,
  2819.             r.fkey5,
  2820.             5,
  2821.             r.constid,
  2822.             s.constid
  2823.         from
  2824.             sysreferences r, sysconstraints s
  2825.         where    r.rkeyid = s.id
  2826.             AND (s.status & 0xf) = 1
  2827.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2828.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2829.       union all
  2830.         select
  2831.             r.rkeydbid,
  2832.             r.rkeyid,
  2833.             r.rkey6,
  2834.             r.fkeydbid,
  2835.             r.fkeyid,
  2836.             r.fkey6,
  2837.             6,
  2838.             r.constid,
  2839.             s.constid
  2840.         from
  2841.             sysreferences r, sysconstraints s
  2842.         where    r.rkeyid = s.id
  2843.             AND (s.status & 0xf) = 1
  2844.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2845.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2846.       union all
  2847.         select
  2848.             r.rkeydbid,
  2849.             r.rkeyid,
  2850.             r.rkey7,
  2851.             r.fkeydbid,
  2852.             r.fkeyid,
  2853.             r.fkey7,
  2854.             7,
  2855.             r.constid,
  2856.             s.constid
  2857.         from
  2858.             sysreferences r, sysconstraints s
  2859.         where    r.rkeyid = s.id
  2860.             AND (s.status & 0xf) = 1
  2861.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2862.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2863.       union all
  2864.         select
  2865.             r.rkeydbid,
  2866.             r.rkeyid,
  2867.             r.rkey8,
  2868.             r.fkeydbid,
  2869.             r.fkeyid,
  2870.             r.fkey8,
  2871.             8,
  2872.             r.constid,
  2873.             s.constid
  2874.         from
  2875.             sysreferences r, sysconstraints s
  2876.         where    r.rkeyid = s.id
  2877.             AND (s.status & 0xf) = 1
  2878.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2879.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2880.       union all
  2881.         select
  2882.             r.rkeydbid,
  2883.             r.rkeyid,
  2884.             r.rkey9,
  2885.             r.fkeydbid,
  2886.             r.fkeyid,
  2887.             r.fkey9,
  2888.             9,
  2889.             r.constid,
  2890.             s.constid
  2891.         from
  2892.             sysreferences r, sysconstraints s
  2893.         where    r.rkeyid = s.id
  2894.             AND (s.status & 0xf) = 1
  2895.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2896.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2897.       union all
  2898.         select
  2899.             r.rkeydbid,
  2900.             r.rkeyid,
  2901.             r.rkey10,
  2902.             r.fkeydbid,
  2903.             r.fkeyid,
  2904.             r.fkey10,
  2905.             10,
  2906.             r.constid,
  2907.             s.constid
  2908.         from
  2909.             sysreferences r, sysconstraints s
  2910.         where    r.rkeyid = s.id
  2911.             AND (s.status & 0xf) = 1
  2912.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2913.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2914.       union all
  2915.         select
  2916.             r.rkeydbid,
  2917.             r.rkeyid,
  2918.             r.rkey11,
  2919.             r.fkeydbid,
  2920.             r.fkeyid,
  2921.             r.fkey11,
  2922.             11,
  2923.             r.constid,
  2924.             s.constid
  2925.         from
  2926.             sysreferences r, sysconstraints s
  2927.         where    r.rkeyid = s.id
  2928.             AND (s.status & 0xf) = 1
  2929.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2930.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2931.       union all
  2932.         select
  2933.             r.rkeydbid,
  2934.             r.rkeyid,
  2935.             r.rkey12,
  2936.             r.fkeydbid,
  2937.             r.fkeyid,
  2938.             r.fkey12,
  2939.             12,
  2940.             r.constid,
  2941.             s.constid
  2942.         from
  2943.             sysreferences r, sysconstraints s
  2944.         where    r.rkeyid = s.id
  2945.             AND (s.status & 0xf) = 1
  2946.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2947.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2948.       union all
  2949.         select
  2950.             r.rkeydbid,
  2951.             r.rkeyid,
  2952.             r.rkey13,
  2953.             r.fkeydbid,
  2954.             r.fkeyid,
  2955.             r.fkey13,
  2956.             13,
  2957.             r.constid,
  2958.             s.constid
  2959.         from
  2960.             sysreferences r, sysconstraints s
  2961.         where    r.rkeyid = s.id
  2962.             AND (s.status & 0xf) = 1
  2963.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2964.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2965.       union all
  2966.         select
  2967.             r.rkeydbid,
  2968.             r.rkeyid,
  2969.             r.rkey14,
  2970.             r.fkeydbid,
  2971.             r.fkeyid,
  2972.             r.fkey14,
  2973.             14,
  2974.             r.constid,
  2975.             s.constid
  2976.         from
  2977.             sysreferences r, sysconstraints s
  2978.         where    r.rkeyid = s.id
  2979.             AND (s.status & 0xf) = 1
  2980.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2981.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2982.       union all
  2983.         select
  2984.             r.rkeydbid,
  2985.             r.rkeyid,
  2986.             r.rkey15,
  2987.             r.fkeydbid,
  2988.             r.fkeyid,
  2989.             r.fkey15,
  2990.             15,
  2991.             r.constid,
  2992.             s.constid
  2993.         from
  2994.             sysreferences r, sysconstraints s
  2995.         where    r.rkeyid = s.id
  2996.             AND (s.status & 0xf) = 1
  2997.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  2998.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  2999.       union all
  3000.         select
  3001.             r.rkeydbid,
  3002.             r.rkeyid,
  3003.             r.rkey16,
  3004.             r.fkeydbid,
  3005.             r.fkeyid,
  3006.             r.fkey16,
  3007.             16,
  3008.             r.constid,
  3009.             s.constid
  3010.         from
  3011.             sysreferences r, sysconstraints s
  3012.         where    r.rkeyid = s.id
  3013.             AND (s.status & 0xf) = 1
  3014.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3015.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3016.  
  3017.     if @order_by_pk = 1 /*    If order by PK fields */
  3018.         select
  3019.             PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
  3020.             PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
  3021.             PKTABLE_NAME = convert(varchar(32),o1.name),
  3022.             PKCOLUMN_NAME = convert(varchar(32),c1.name),
  3023.             FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
  3024.             FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
  3025.             FKTABLE_NAME = convert(varchar(32),o2.name),
  3026.             FKCOLUMN_NAME = convert(varchar(32),c2.name),
  3027.             KEY_SEQ,
  3028.             UPDATE_RULE = convert(smallint,1),
  3029.             DELETE_RULE = convert(smallint,1),
  3030.             FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
  3031.             PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
  3032.             DEFERRABILITY = convert(smallint,7)
  3033.         from #fkeys f,
  3034.             sysobjects o1, sysobjects o2,
  3035.             syscolumns c1, syscolumns c2
  3036.         where    o1.id = f.pktable_id
  3037.             AND o2.id = f.fktable_id
  3038.             AND c1.id = f.pktable_id
  3039.             AND c2.id = f.fktable_id
  3040.             AND c1.colid = f.pkcolid
  3041.             AND c2.colid = f.fkcolid
  3042.         order by 1,2,3,9
  3043.     else        /*    Order by FK fields */
  3044.         select
  3045.             PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
  3046.             PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
  3047.             PKTABLE_NAME = convert(varchar(32),o1.name),
  3048.             PKCOLUMN_NAME = convert(varchar(32),c1.name),
  3049.             FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
  3050.             FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
  3051.             FKTABLE_NAME = convert(varchar(32),o2.name),
  3052.             FKCOLUMN_NAME = convert(varchar(32),c2.name),
  3053.             KEY_SEQ,
  3054.             UPDATE_RULE = convert(smallint,1),
  3055.             DELETE_RULE = convert(smallint,1),
  3056.             FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
  3057.             PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
  3058.             DEFERRABILITY = convert(smallint,7)
  3059.         from #fkeys f,
  3060.             sysobjects o1, sysobjects o2,
  3061.             syscolumns c1, syscolumns c2
  3062.         where    o1.id = f.pktable_id
  3063.             AND o2.id = f.fktable_id
  3064.             AND c1.id = f.pktable_id
  3065.             AND c2.id = f.fktable_id
  3066.             AND c1.colid = f.pkcolid
  3067.             AND c2.colid = f.fkcolid
  3068.         order by 5,6,7,9
  3069. go
  3070.  
  3071. if (charindex('7.00', @@version) = 0)
  3072. begin
  3073.     print ''
  3074.     print ''
  3075.     print 'Warning:'
  3076.     print 'you are installing the stored procedures '
  3077.     print 'on a pre 7.0 SQL Server.'
  3078.     print 'Ignore the following errors.'
  3079. end
  3080. else
  3081.     drop proc sp_fkeys
  3082. go
  3083.  
  3084. /*    Procedure for 7.0 and later servers */
  3085. CREATE PROCEDURE sp_fkeys(
  3086.                @pktable_name        sysname = null,
  3087.                @pktable_owner        sysname = null,
  3088.                @pktable_qualifier    sysname = null,
  3089.                @fktable_name        sysname = null,
  3090.                @fktable_owner        sysname = null,
  3091.                @fktable_qualifier    sysname = null )
  3092. as
  3093.     DECLARE @pktable_id            int
  3094.     DECLARE @pkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  3095.     DECLARE @fktable_id            int
  3096.     DECLARE @fkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  3097.     declare    @order_by_pk        int
  3098.  
  3099.     /* select 'XXX starting table creation' */
  3100.  
  3101.     create table #fkeysall(
  3102.             rkeyid int NOT NULL,
  3103.             rkey1 int NOT NULL,
  3104.                 rkey2 int NOT NULL,
  3105.                 rkey3 int NOT NULL,
  3106.                 rkey4 int NOT NULL,
  3107.                 rkey5 int NOT NULL,
  3108.                 rkey6 int NOT NULL,
  3109.                 rkey7 int NOT NULL,
  3110.                 rkey8 int NOT NULL,
  3111.                 rkey9 int NOT NULL,
  3112.                 rkey10 int NOT NULL,
  3113.                 rkey11 int NOT NULL,
  3114.                 rkey12 int NOT NULL,
  3115.                 rkey13 int NOT NULL,
  3116.                 rkey14 int NOT NULL,
  3117.                 rkey15 int NOT NULL,
  3118.                 rkey16 int NOT NULL,
  3119.             fkeyid int NOT NULL,
  3120.             fkey1 int NOT NULL,
  3121.                 fkey2 int NOT NULL,
  3122.                 fkey3 int NOT NULL,
  3123.                 fkey4 int NOT NULL,
  3124.                 fkey5 int NOT NULL,
  3125.                 fkey6 int NOT NULL,
  3126.                 fkey7 int NOT NULL,
  3127.                 fkey8 int NOT NULL,
  3128.                 fkey9 int NOT NULL,
  3129.                 fkey10 int NOT NULL,
  3130.                 fkey11 int NOT NULL,
  3131.                 fkey12 int NOT NULL,
  3132.                 fkey13 int NOT NULL,
  3133.                 fkey14 int NOT NULL,
  3134.                 fkey15 int NOT NULL,
  3135.                 fkey16 int NOT NULL,
  3136.             constid int NOT NULL,
  3137.             name sysname NOT NULL)
  3138.  
  3139.     create table #fkeys(
  3140.             pktable_id        int NOT NULL,
  3141.             pkcolid         int NOT NULL,
  3142.             fktable_id        int NOT NULL,
  3143.             fkcolid         int NOT NULL,
  3144.             KEY_SEQ         smallint NOT NULL,
  3145.             fk_id            int NOT NULL,
  3146.             PK_NAME            sysname NOT NULL)
  3147.  
  3148.     create table #fkeysout(
  3149.             PKTABLE_QUALIFIER sysname NULL,
  3150.             PKTABLE_OWNER sysname NULL,
  3151.             PKTABLE_NAME sysname NOT NULL,
  3152.             PKCOLUMN_NAME sysname NOT NULL,
  3153.             FKTABLE_QUALIFIER sysname NULL,
  3154.             FKTABLE_OWNER sysname NULL,
  3155.             FKTABLE_NAME sysname NOT NULL,
  3156.             FKCOLUMN_NAME sysname NOT NULL,
  3157.             KEY_SEQ smallint NOT NULL,
  3158.             UPDATE_RULE smallint NULL,
  3159.             DELETE_RULE smallint NULL,
  3160.             FK_NAME sysname NULL,
  3161.             PK_NAME sysname NULL,
  3162.             DEFERRABILITY smallint null)
  3163.  
  3164.     /* select 'XXX starting parameter analysis' */
  3165.  
  3166.     select  @order_by_pk = 0
  3167.  
  3168.     if (@pktable_name is null) and (@fktable_name is null)
  3169.     begin    /* If neither primary key nor foreign key table names given */
  3170.         raiserror (15252,-1,-1)
  3171.         return
  3172.     end
  3173.     if @fktable_qualifier is not null
  3174.     begin
  3175.         if db_name() <> @fktable_qualifier
  3176.         begin    /* If qualifier doesn't match current database */
  3177.             raiserror (15250, -1,-1)
  3178.             return
  3179.         end
  3180.     end
  3181.     if @pktable_qualifier is not null
  3182.     begin
  3183.         if db_name() <> @pktable_qualifier
  3184.         begin    /* If qualifier doesn't match current database */
  3185.             raiserror (15250, -1,-1)
  3186.             return
  3187.         end
  3188.     end
  3189.  
  3190.     if @pktable_owner is null
  3191.     begin    /* If unqualified primary key table name */
  3192.         SELECT @pkfull_table_name = quotename(@pktable_name)
  3193.     end
  3194.     else
  3195.     begin    /* Qualified primary key table name */
  3196.         if @pktable_owner = ''
  3197.         begin    /* If empty owner name */
  3198.             SELECT @pkfull_table_name = quotename(@pktable_owner)
  3199.         end
  3200.         else
  3201.         begin
  3202.             SELECT @pkfull_table_name = quotename(@pktable_owner) +
  3203.                 '.' + quotename(@pktable_name)
  3204.         end
  3205.     end
  3206.     /*    Get Object ID */
  3207.     SELECT @pktable_id = object_id(@pkfull_table_name)
  3208.  
  3209.     if @fktable_owner is null
  3210.     begin    /* If unqualified foreign key table name */
  3211.         SELECT @fkfull_table_name = quotename(@fktable_name)
  3212.     end
  3213.     else
  3214.     begin    /* Qualified foreign key table name */
  3215.         if @fktable_owner = ''
  3216.         begin    /* If empty owner name */
  3217.             SELECT @fkfull_table_name = quotename(@fktable_owner)
  3218.         end
  3219.         else
  3220.         begin
  3221.             SELECT @fkfull_table_name = quotename(@fktable_owner) +
  3222.                 '.' + quotename(@fktable_name)
  3223.         end
  3224.     end
  3225.     /*    Get Object ID */
  3226.     SELECT @fktable_id = object_id(@fkfull_table_name)
  3227.  
  3228.     if @fktable_name is not null
  3229.     begin
  3230.         if @fktable_id is null
  3231.             SELECT @fktable_id = 0    /* fk table not found, empty result */
  3232.     end
  3233.  
  3234.     if @pktable_name is null
  3235.     begin /*  If table name not supplied, match all */
  3236.         select @order_by_pk = 1
  3237.     end
  3238.     else
  3239.     begin
  3240.         if @pktable_id is null
  3241.         begin
  3242.             SELECT @pktable_id = 0    /* pk table not found, empty result */
  3243.         end
  3244.     end
  3245.  
  3246.     /*    SQL Server supports upto 16 PK/FK relationships between 2 tables */
  3247.     /*    Process syskeys for each relationship */
  3248.     /*  First, attempt to get all 16 keys for each rel'ship, then sort
  3249.         them out with a 16-way "insert select ... union select ..." */
  3250.  
  3251.     /* select 'XXX starting data analysis' */
  3252.  
  3253.     insert into #fkeysall
  3254.         select
  3255.             r.rkeyid,
  3256.             r.rkey1, r.rkey2, r.rkey3, r.rkey4,
  3257.                 r.rkey5, r.rkey6, r.rkey7, r.rkey8,
  3258.                 r.rkey9, r.rkey10, r.rkey11, r.rkey12,
  3259.                 r.rkey13, r.rkey14, r.rkey15, r.rkey16,
  3260.             r.fkeyid,
  3261.             r.fkey1, r.fkey2, r.fkey3, r.fkey4,
  3262.                 r.fkey5, r.fkey6, r.fkey7, r.fkey8,
  3263.                 r.fkey9, r.fkey10, r.fkey11, r.fkey12,
  3264.                 r.fkey13, r.fkey14, r.fkey15, r.fkey16,
  3265.             r.constid,
  3266.             i.name
  3267.         from
  3268.             sysreferences r, sysobjects o, sysindexes i
  3269.         where    r.constid = o.id
  3270.             AND o.xtype = 'F'
  3271.             AND r.rkeyindid = i.indid
  3272.             AND r.rkeyid = i.id
  3273.             AND r.rkeyid between isnull(@pktable_id, 0)
  3274.                             and isnull(@pktable_id, 0x7fffffff)
  3275.             AND r.fkeyid between isnull(@fktable_id, 0)
  3276.                             and isnull(@fktable_id, 0x7fffffff)
  3277.  
  3278.     /* select count (*) as 'XXX countall' from #fkeysall */
  3279.  
  3280.     insert into #fkeys
  3281.             select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name
  3282.             from #fkeysall
  3283.         union all
  3284.             select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name
  3285.             from #fkeysall
  3286.         union all
  3287.             select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name
  3288.             from #fkeysall
  3289.         union all
  3290.             select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name
  3291.             from #fkeysall
  3292.         union all
  3293.             select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name
  3294.             from #fkeysall
  3295.         union all
  3296.             select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name
  3297.             from #fkeysall
  3298.         union all
  3299.             select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name
  3300.             from #fkeysall
  3301.         union all
  3302.             select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name
  3303.             from #fkeysall
  3304.         union all
  3305.             select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name
  3306.             from #fkeysall
  3307.         union all
  3308.             select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name
  3309.             from #fkeysall
  3310.         union all
  3311.             select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name
  3312.             from #fkeysall
  3313.         union all
  3314.             select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name
  3315.             from #fkeysall
  3316.         union all
  3317.             select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name
  3318.             from #fkeysall
  3319.         union all
  3320.             select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name
  3321.             from #fkeysall
  3322.         union all
  3323.             select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name
  3324.             from #fkeysall
  3325.         union all
  3326.             select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name
  3327.             from #fkeysall
  3328.  
  3329.     /* select count (*) as 'XXX count' from #fkeys */
  3330.  
  3331.     insert into #fkeysout
  3332.         select
  3333.             PKTABLE_QUALIFIER = convert(sysname,db_name()),
  3334.             PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),
  3335.             PKTABLE_NAME = convert(sysname,o1.name),
  3336.             PKCOLUMN_NAME = convert(sysname,c1.name),
  3337.             FKTABLE_QUALIFIER = convert(sysname,db_name()),
  3338.             FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),
  3339.             FKTABLE_NAME = convert(sysname,o2.name),
  3340.             FKCOLUMN_NAME = convert(sysname,c2.name),
  3341.             KEY_SEQ,
  3342.             UPDATE_RULE = convert(smallint,1),
  3343.             DELETE_RULE = convert(smallint,1),
  3344.             FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),
  3345.             PK_NAME,
  3346.             DEFERRABILITY = 7    /* SQL_NOT_DEFERRABLE */
  3347.         from #fkeys f,
  3348.             sysobjects o1, sysobjects o2,
  3349.             syscolumns c1, syscolumns c2
  3350.         where    o1.id = f.pktable_id
  3351.             AND o2.id = f.fktable_id
  3352.             AND c1.id = f.pktable_id
  3353.             AND c2.id = f.fktable_id
  3354.             AND c1.colid = f.pkcolid
  3355.             AND c2.colid = f.fkcolid
  3356.  
  3357.     /* select count (*) as 'XXX countout' from #fkeysout */
  3358.  
  3359.     if @order_by_pk = 1 /*    If order by PK fields */
  3360.         select
  3361.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  3362.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  3363.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  3364.         from #fkeysout
  3365.         order by 1,2,3,9
  3366.     else        /*    Order by FK fields */
  3367.         select
  3368.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  3369.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  3370.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  3371.         from #fkeysout
  3372.         order by 5,6,7,9
  3373. go
  3374.  
  3375. grant execute on sp_fkeys to public
  3376. go
  3377.  
  3378. dump tran master with no_log
  3379. go
  3380.  
  3381. print 'creating sp_pkeys'
  3382. go
  3383.  
  3384. /*    Procedure for pre-6.0 server */
  3385. CREATE PROCEDURE sp_pkeys(
  3386.                @table_name        varchar(32),
  3387.                @table_owner     varchar(32) = null,
  3388.                @table_qualifier varchar(32) = null )
  3389. as
  3390.     if @table_qualifier is not null
  3391.     begin
  3392.         if db_name() <> @table_qualifier
  3393.         begin    /* If qualifier doesn't match current database */
  3394.             raiserror 20001 'Table qualifier must be name of current database'
  3395.             return
  3396.         end
  3397.     end
  3398.     if @table_owner is null /*    If owner not supplied, match all */
  3399.         select @table_owner = '%'
  3400.     if @@trancount <> 0
  3401.     begin    /* If inside a transaction */
  3402.         raiserror 20003 'The procedure ''sp_pkeys'' cannot be executed from within a transaction.'
  3403.         return
  3404.     end
  3405.  
  3406.     create table #pkeys(
  3407.              TABLE_QUALIFIER varchar(32) NULL,
  3408.              TABLE_OWNER     varchar(32) NULL,
  3409.              TABLE_NAME      varchar(32) NOT NULL,
  3410.              COLUMN_NAME     varchar(32) NOT NULL,
  3411.              KEY_SEQ         smallint NOT NULL)
  3412.  
  3413.     /*    SQL Server supports upto 8 PK/FK relationships between 2 tables */
  3414.     /*    Process syskeys for each relationship */
  3415.     /*    The inserts below adds a row to the temp table for each of the
  3416.         8 possible relationships */
  3417.     insert into #pkeys
  3418.         select
  3419.             db_name(),
  3420.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3421.             object_name(k.id),
  3422.             c.name,
  3423.             1
  3424.         from
  3425.             syskeys k, syscolumns c
  3426.         where
  3427.             c.id = k.id
  3428.             and k.type = 1    /* Primary type key */
  3429.             and c.colid = k.key1
  3430.     if (@@rowcount = 0)
  3431.         goto done
  3432.  
  3433.     insert into #pkeys
  3434.         select
  3435.             db_name(),
  3436.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3437.             object_name(k.id),
  3438.             c.name,
  3439.             2
  3440.         from
  3441.             syskeys k, syscolumns c
  3442.         where
  3443.             c.id = k.id
  3444.             and k.type = 1    /* Primary type key */
  3445.             and c.colid = key2
  3446.     if (@@rowcount = 0)
  3447.         goto done
  3448.  
  3449.     insert into #pkeys
  3450.         select
  3451.             db_name(),
  3452.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3453.             object_name(k.id),
  3454.             c.name,
  3455.             3
  3456.         from
  3457.             syskeys k, syscolumns c
  3458.         where
  3459.             c.id = k.id
  3460.             and k.type = 1    /* Primary type key */
  3461.             and c.colid = key3
  3462.     if (@@rowcount = 0)
  3463.         goto done
  3464.  
  3465.     insert into #pkeys
  3466.         select
  3467.             db_name(),
  3468.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3469.             object_name(k.id),
  3470.             c.name,
  3471.             4
  3472.         from
  3473.             syskeys k, syscolumns c
  3474.         where
  3475.             c.id = k.id
  3476.             and k.type = 1    /* Primary type key */
  3477.             and c.colid = key4
  3478.     if (@@rowcount = 0)
  3479.         goto done
  3480.  
  3481.     insert into #pkeys
  3482.         select
  3483.             db_name(),
  3484.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3485.             object_name(k.id),
  3486.             c.name,
  3487.             5
  3488.         from
  3489.             syskeys k, syscolumns c
  3490.         where
  3491.             c.id = k.id
  3492.             and k.type = 1    /* Primary type key */
  3493.             and c.colid = key5
  3494.     if (@@rowcount = 0)
  3495.         goto done
  3496.  
  3497.     insert into #pkeys
  3498.         select
  3499.             db_name(),
  3500.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3501.             object_name(k.id),
  3502.             c.name,
  3503.             6
  3504.         from
  3505.             syskeys k, syscolumns c
  3506.         where
  3507.             c.id = k.id
  3508.             and k.type = 1    /* Primary type key */
  3509.             and c.colid = key6
  3510.     if (@@rowcount = 0)
  3511.         goto done
  3512.  
  3513.     insert into #pkeys
  3514.         select
  3515.             db_name(),
  3516.             (select user_name(uid) from sysobjects o where o.id = k.id),
  3517.             object_name(k.id),
  3518.             c.name,
  3519.             7
  3520.         from
  3521.             syskeys k, syscolumns c
  3522.         where
  3523.             c.id = k.id
  3524.             and k.type = 1    /* Primary type key */
  3525.             and c.colid = key7
  3526.     if (@@rowcount = 0)
  3527.         goto done
  3528.  
  3529.     insert into #pkeys
  3530.          select
  3531.              db_name(),
  3532.              (select user_name(uid) from sysobjects o where o.id = k.id),
  3533.              object_name(k.id),
  3534.              c.name,
  3535.              8
  3536.          from
  3537.              syskeys k, syscolumns c
  3538.          where
  3539.              c.id = k.id
  3540.              and k.type = 1 /* Primary type key */
  3541.              and c.colid = key8
  3542.  
  3543.     done:
  3544.     select
  3545.         TABLE_QUALIFIER,
  3546.         TABLE_OWNER,
  3547.         TABLE_NAME,
  3548.         COLUMN_NAME,
  3549.         KEY_SEQ,
  3550.         PK_NAME = convert(varchar(32),null)
  3551.     from #pkeys
  3552.     where TABLE_NAME = @table_name
  3553.         and TABLE_OWNER like @table_owner
  3554.     order by 1, 2, 3, 5
  3555. go
  3556.  
  3557. if (charindex('6.00', @@version) = 0 and
  3558.     charindex('6.50', @@version) = 0 and
  3559.     charindex('7.00', @@version) = 0)
  3560. begin
  3561.     print ''
  3562.     print ''
  3563.     print 'Warning:'
  3564.     print 'you are installing the stored procedures '
  3565.     print 'on a pre 6.0 SQL Server.'
  3566.     print 'Ignore the following error.'
  3567. end
  3568. else
  3569.     drop proc sp_pkeys
  3570. go
  3571.  
  3572. /*    Procedure for 6.0 and 6.50 servers */
  3573. CREATE PROCEDURE sp_pkeys(
  3574.                @table_name        sysname,
  3575.                @table_owner     sysname = null,
  3576.                @table_qualifier sysname = null )
  3577. as
  3578.     DECLARE @table_id            int
  3579.     DECLARE @full_table_name    varchar(255) /* 2*128 + 1 */
  3580.  
  3581.     if @table_qualifier is not null
  3582.     begin
  3583.         if db_name() <> @table_qualifier
  3584.         begin    /* If qualifier doesn't match current database */
  3585.             raiserror (15250, -1,-1)
  3586.             return
  3587.         end
  3588.     end
  3589.     if @table_owner is null
  3590.     begin    /* If unqualified table name */
  3591.         SELECT @full_table_name = @table_name
  3592.     end
  3593.     else
  3594.     begin    /* Qualified table name */
  3595.         if @table_owner = ''
  3596.         begin    /* If empty owner name */
  3597.             SELECT @full_table_name = @table_owner
  3598.         end
  3599.         else
  3600.         begin
  3601.             SELECT @full_table_name = @table_owner + '.' + @table_name
  3602.         end
  3603.     end
  3604.     /*    Get Object ID */
  3605.     SELECT @table_id = object_id(@full_table_name)
  3606.  
  3607.     select
  3608.         TABLE_QUALIFIER = convert(sysname,db_name()),
  3609.         TABLE_OWNER = convert(sysname,user_name(o.uid)),
  3610.         TABLE_NAME = convert(sysname,o.name),
  3611.         COLUMN_NAME = convert(sysname,c.name),
  3612.         KEY_SEQ = convert(smallint,c1.colid),
  3613.         PK_NAME = convert(sysname,i.name)
  3614.     from
  3615.         sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  3616.     where
  3617.         o.id = @table_id
  3618.         and o.id = c.id
  3619.         and o.id = i.id
  3620.         and (i.status & 0x800) = 0x800
  3621.         and c.name = index_col (@full_table_name, i.indid, c1.colid)
  3622.         and c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  3623.         and c1.id = @table_id
  3624.     order by 1, 2, 3, 5
  3625. go
  3626.  
  3627. if (charindex('7.00', @@version) = 0)
  3628. begin
  3629.     print ''
  3630.     print ''
  3631.     print 'Warning:'
  3632.     print 'you are installing the stored procedures '
  3633.     print 'on a pre 7.0 SQL Server.'
  3634.     print 'Ignore the following errors.'
  3635. end
  3636. else
  3637.     drop proc sp_pkeys
  3638. go
  3639.  
  3640. /*    Procedure for 7.0 and later servers */
  3641. CREATE PROCEDURE sp_pkeys(
  3642.                @table_name        sysname,
  3643.                @table_owner     sysname = null,
  3644.                @table_qualifier sysname = null )
  3645. as
  3646.     DECLARE @table_id            int
  3647.     DECLARE @full_table_name    varchar(255) /* 2*128 + 1 */
  3648.  
  3649.     if @table_qualifier is not null
  3650.     begin
  3651.         if db_name() <> @table_qualifier
  3652.         begin    /* If qualifier doesn't match current database */
  3653.             raiserror (15250, -1,-1)
  3654.             return
  3655.         end
  3656.     end
  3657.     if @table_owner is null
  3658.     begin    /* If unqualified table name */
  3659.         SELECT @full_table_name = quotename(@table_name)
  3660.     end
  3661.     else
  3662.     begin    /* Qualified table name */
  3663.         if @table_owner = ''
  3664.         begin    /* If empty owner name */
  3665.             SELECT @full_table_name = quotename(@table_owner)
  3666.         end
  3667.         else
  3668.         begin
  3669.             SELECT @full_table_name = quotename(@table_owner) +
  3670.                 '.' + quotename(@table_name)
  3671.         end
  3672.     end
  3673.     /*    Get Object ID */
  3674.     SELECT @table_id = object_id(@full_table_name)
  3675.  
  3676.     select
  3677.         TABLE_QUALIFIER = convert(sysname,db_name()),
  3678.         TABLE_OWNER = convert(sysname,user_name(o.uid)),
  3679.         TABLE_NAME = convert(sysname,o.name),
  3680.         COLUMN_NAME = convert(sysname,c.name),
  3681.         KEY_SEQ = convert(smallint,c1.colid),
  3682.         PK_NAME = convert(sysname,i.name)
  3683.     from
  3684.         sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  3685.     where
  3686.         o.id = @table_id
  3687.         and o.id = c.id
  3688.         and o.id = i.id
  3689.         and (i.status & 0x800) = 0x800
  3690.         and c.name = index_col (@full_table_name, i.indid, c1.colid)
  3691.         and c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  3692.         and c1.id = @table_id
  3693.     order by 1, 2, 3, 5
  3694. go
  3695.  
  3696. grant execute on sp_pkeys to public
  3697. go
  3698.  
  3699. dump tran master with no_log
  3700. go
  3701.  
  3702. print 'creating sp_server_info'
  3703. go
  3704.  
  3705. create proc sp_server_info (
  3706.             @attribute_id  int = null)
  3707. as
  3708.     if @attribute_id is not null
  3709.         select *
  3710.         from master.dbo.spt_server_info
  3711.         where attribute_id = @attribute_id
  3712.     else
  3713.         select *
  3714.         from master.dbo.spt_server_info
  3715.         order by attribute_id
  3716. go
  3717.  
  3718. grant execute on sp_server_info to public
  3719. go
  3720.  
  3721. dump tran master with no_log
  3722. go
  3723.  
  3724. print 'creating sp_special_columns'
  3725. go
  3726.  
  3727. /*    Procedure for pre-6.0 server */
  3728. CREATE PROCEDURE sp_special_columns (
  3729.                  @table_name        varchar(32),
  3730.                  @table_owner        varchar(32) = null,
  3731.                  @table_qualifier    varchar(32) = null,
  3732.                  @col_type            char(1) = 'R',
  3733.                  @scope                char(1) = 'T',
  3734.                  @nullable            char(1) = 'U',
  3735.                  @ODBCVer            int = 2)
  3736. AS
  3737.     DECLARE @indid                int
  3738.     DECLARE @table_id            int
  3739.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  3740.     DECLARE @scopeout            smallint
  3741.  
  3742.     if @col_type not in ('R','V')
  3743.     begin
  3744.         raiserror 20002 'Illegal ''col_type'' specified -- must be ''R'' or ''V''.'
  3745.         return
  3746.     end
  3747.  
  3748.     if @scope = 'C'
  3749.         select @scopeout = 0
  3750.     else if @scope = 'T'
  3751.         select @scopeout = 1
  3752.     else
  3753.     begin
  3754.         raiserror 20002 'Illegal ''scope'' specified -- must be ''C'' or ''T''.'
  3755.         return
  3756.     end
  3757.  
  3758.     if @nullable not in ('U','O')
  3759.     begin
  3760.         raiserror 20002 'Illegal ''nullable'' specified -- must be ''U'' or ''O''.'
  3761.         return
  3762.     end
  3763.  
  3764.     if @table_qualifier is not null
  3765.     begin
  3766.         if db_name() <> @table_qualifier
  3767.         begin /* If qualifier doesn't match current database */
  3768.             raiserror 20001 'Table qualifier must be name of current database'
  3769.             return
  3770.         end
  3771.     end
  3772.     if @table_owner is null
  3773.     begin     /* If unqualified table name */
  3774.         SELECT @full_table_name = @table_name
  3775.     end
  3776.     else
  3777.     begin    /* Qualified table name */
  3778.         SELECT @full_table_name = @table_owner + '.' + @table_name
  3779.     end
  3780.     /*    Get Object ID */
  3781.     SELECT @table_id = object_id(@full_table_name)
  3782.  
  3783.     if @col_type = 'V'
  3784.     BEGIN /* if ROWVER, just run that query */
  3785.         SELECT
  3786.             SCOPE = convert(smallint,NULL),
  3787.             COLUMN_NAME = convert(varchar(32),c.name),
  3788.             DATA_TYPE = convert(smallint, -3),
  3789.             TYPE_NAME = t.name,
  3790.             "PRECISION" = convert(int,8),
  3791.             LENGTH = convert(int,8),
  3792.             SCALE = convert(smallint, NULL),
  3793.             PSEUDO_COLUMN = convert(smallint,1)
  3794.         FROM
  3795.             systypes t, syscolumns c
  3796.         WHERE
  3797.             c.id = @table_id
  3798.             AND c.usertype = 80 /*    TIMESTAMP */
  3799.             AND t.usertype = 80 /*    TIMESTAMP */
  3800.         RETURN
  3801.     END
  3802.  
  3803.     /* ROWID, now find the id of the 'best' index for this table */
  3804.  
  3805.     IF @nullable = 'O'    /* Don't include any indexes that contain
  3806.                            nullable columns. */
  3807.  
  3808.             SELECT @indid = MIN(indid)
  3809.                 FROM sysindexes i,syscolumns c,syscolumns c2
  3810.                 WHERE
  3811.                     i.status&2 = 2        /*    If Unique Index */
  3812.                      AND c.id = i.id
  3813.                      AND c2.id = c.id
  3814.                      AND c2.colid < i.keycnt + (i.status&16)/16
  3815.                     AND i.id = @table_id
  3816.                     AND indid > 0        /*    Eliminate Table Row */
  3817.                     AND c.name = index_col(@table_name,i.indid,c2.colid)
  3818.                     GROUP BY indid HAVING SUM(c.status&8) = 0
  3819.  
  3820.     ELSE    /* Include indexes that are partially nullable. */
  3821.  
  3822.         SELECT @indid = MIN(indid)
  3823.             FROM sysindexes i
  3824.             WHERE
  3825.                 status&2 = 2        /*    If Unique Index */
  3826.                 AND id = @table_id
  3827.                 AND indid > 0        /*    Eliminate Table Row */
  3828.  
  3829.     SELECT
  3830.         SCOPE = @scopeout,
  3831.         COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
  3832.         d.DATA_TYPE,
  3833.         TYPE_NAME = t.name,
  3834.         "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  3835.         LENGTH = isnull(d.length, convert(int,c.length)),
  3836.         SCALE = d.numeric_scale,
  3837.         PSEUDO_COLUMN = convert(smallint,1)
  3838.     FROM
  3839.         sysindexes x,
  3840.         syscolumns c,
  3841.         master.dbo.spt_datatype_info d,
  3842.         systypes t,
  3843.         syscolumns c2    /* Self-join to generate list of index columns and */
  3844.                         /* to extract datatype names */
  3845.     WHERE
  3846.         x.id = @table_id
  3847.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  3848.         AND c.id = x.id
  3849.         AND c2.id = x.id
  3850.         AND c2.colid < keycnt+(x.status&16)/16
  3851.         AND x.indid = @indid
  3852.         AND t.type = d.ss_dtype
  3853.         AND c.length = d.fixlen
  3854.         AND c.usertype = t.usertype
  3855.  
  3856. go
  3857.  
  3858. if (charindex('6.00', @@version) = 0 and
  3859.     charindex('6.50', @@version) = 0 and
  3860.     charindex('7.00', @@version) = 0)
  3861. begin
  3862.     print ''
  3863.     print ''
  3864.     print 'Warning:'
  3865.     print 'you are installing the stored procedures '
  3866.     print 'on a pre 6.0 SQL Server.'
  3867.     print 'Ignore the following errors.'
  3868. end
  3869. else
  3870.     drop proc sp_special_columns
  3871. go
  3872.  
  3873. /*    Procedure for 6.0 and 6.50 servers */
  3874. CREATE PROCEDURE sp_special_columns (
  3875.                  @table_name        varchar(32),
  3876.                  @table_owner        varchar(32) = null,
  3877.                  @table_qualifier    varchar(32) = null,
  3878.                  @col_type            char(1) = 'R',
  3879.                  @scope                char(1) = 'T',
  3880.                  @nullable            char(1) = 'U',
  3881.                  @ODBCVer            int = 2)
  3882. AS
  3883.     DECLARE @indid                int
  3884.     DECLARE @table_id            int
  3885.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  3886.     DECLARE @scopeout            smallint
  3887.  
  3888.     if @col_type not in ('R','V')
  3889.     begin
  3890.         raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
  3891.         return
  3892.     end
  3893.  
  3894.     if @scope = 'C'
  3895.         select @scopeout = 0
  3896.     else if @scope = 'T'
  3897.         select @scopeout = 1
  3898.     else
  3899.     begin
  3900.         raiserror (15251,-1,-1,'scope','''C'' or ''T''')
  3901.         return
  3902.     end
  3903.  
  3904.     if @nullable not in ('U','O')
  3905.     begin
  3906.         raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
  3907.         return
  3908.     end
  3909.  
  3910.     if @table_qualifier is not null
  3911.     begin
  3912.         if db_name() <> @table_qualifier
  3913.         begin /* If qualifier doesn't match current database */
  3914.             raiserror (15250, -1,-1)
  3915.             return
  3916.         end
  3917.     end
  3918.     if @table_owner is null
  3919.     begin     /* If unqualified table name */
  3920.         SELECT @full_table_name = @table_name
  3921.     end
  3922.     else
  3923.     begin     /* Qualified table name */
  3924.         SELECT @full_table_name = @table_owner + '.' + @table_name
  3925.     end
  3926.     /*    Get Object ID */
  3927.     SELECT @table_id = object_id(@full_table_name)
  3928.  
  3929.     if @col_type = 'V'
  3930.     BEGIN /* if ROWVER, just run that query */
  3931.         SELECT
  3932.             SCOPE = convert(smallint,NULL),
  3933.             COLUMN_NAME = convert(varchar(32),c.name),
  3934.             DATA_TYPE = convert(smallint, -2),
  3935.             TYPE_NAME = t.name,
  3936.             "PRECISION" = convert(int,8),
  3937.             LENGTH = convert(int,8),
  3938.             SCALE = convert(smallint, NULL),
  3939.             PSEUDO_COLUMN = convert(smallint,1)
  3940.         FROM
  3941.             systypes t, syscolumns c
  3942.         WHERE
  3943.             c.id = @table_id
  3944.             AND c.usertype = 80 /*    TIMESTAMP */
  3945.             AND t.usertype = 80 /*    TIMESTAMP */
  3946.         RETURN
  3947.     END
  3948.  
  3949.     /* ROWID, now find the id of the 'best' index for this table */
  3950.  
  3951.     IF @nullable = 'O'    /* Don't include any indexes that contain
  3952.                            nullable columns. */
  3953.  
  3954.         SELECT @indid = MIN(indid)
  3955.             FROM sysindexes i,syscolumns c,syscolumns c2
  3956.             WHERE
  3957.                 i.status&2 = 2        /*    If Unique Index */
  3958.                 AND c.id = i.id
  3959.                 AND c2.id = c.id
  3960.                 AND c2.colid < i.keycnt + (i.status&16)/16
  3961.                 AND i.id = @table_id
  3962.                 AND indid > 0        /*    Eliminate Table Row */
  3963.                 AND c.name = index_col(@table_name,i.indid,c2.colid)
  3964.                 GROUP BY indid HAVING SUM(c.status&8) = 0
  3965.  
  3966.     ELSE    /* Include indexes that are partially nullable. */
  3967.  
  3968.         SELECT @indid = MIN(indid)
  3969.             FROM sysindexes i
  3970.             WHERE
  3971.                 status&2 = 2        /*    If Unique Index */
  3972.                 AND id = @table_id
  3973.                 AND indid > 0        /*    Eliminate Table Row */
  3974.  
  3975.     SELECT
  3976.         SCOPE = @scopeout,
  3977.         COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
  3978.         d.DATA_TYPE,
  3979.         convert(varchar(32),case
  3980.             when (t.usertype > 100 or t.usertype in (18,80))
  3981.                 then t.name
  3982.             else d.TYPE_NAME
  3983.         end) TYPE_NAME,
  3984.         convert(int,case
  3985.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  3986.             else isnull(convert(int,c.prec), 2147483647)
  3987.         end) "PRECISION",
  3988.         convert(int,case
  3989.             when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  3990.                 convert(int,c.prec+2)
  3991.             else
  3992.                 isnull(d.length, c.length)
  3993.         end) LENGTH,
  3994.         SCALE = convert(smallint, c.scale),
  3995.         PSEUDO_COLUMN = convert(smallint,1)
  3996.     FROM
  3997.         sysindexes x,
  3998.         syscolumns c,
  3999.         master.dbo.spt_datatype_info d,
  4000.         systypes t,
  4001.         syscolumns c2    /* Self-join to generate list of index columns and */
  4002.                         /* to extract datatype names */
  4003.     WHERE
  4004.         x.id = @table_id
  4005.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  4006.         AND c.id = x.id
  4007.         AND c2.id = x.id
  4008.         AND c2.colid < x.keycnt+(x.status&16)/16
  4009.         AND x.indid = @indid
  4010.         AND t.type = d.ss_dtype
  4011.         AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4012.         AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  4013.         AND c.usertype = t.usertype
  4014. go
  4015.  
  4016. if (charindex('7.00', @@version) = 0)
  4017. begin
  4018.     print ''
  4019.     print ''
  4020.     print 'Warning:'
  4021.     print 'you are installing the stored procedures '
  4022.     print 'on a pre 7.0 SQL Server.'
  4023.     print 'Ignore the following errors.'
  4024. end
  4025. else
  4026.     drop proc sp_special_columns
  4027. go
  4028.  
  4029. /*    Procedure for 7.0 and later servers */
  4030. CREATE PROCEDURE sp_special_columns (
  4031.                  @table_name        sysname,
  4032.                  @table_owner        sysname = null,
  4033.                  @table_qualifier    sysname = null,
  4034.                  @col_type            char(1) = 'R',
  4035.                  @scope                char(1) = 'T',
  4036.                  @nullable            char(1) = 'U',
  4037.                  @ODBCVer            int = 2)
  4038. AS
  4039.     DECLARE @indid                int
  4040.     DECLARE @table_id            int
  4041.     DECLARE @full_table_name    nvarchar(257)
  4042.     DECLARE @scopeout            smallint
  4043.  
  4044.     if @col_type not in ('R','V')
  4045.     begin
  4046.         raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
  4047.         return
  4048.     end
  4049.  
  4050.     if @scope = 'C'
  4051.         select @scopeout = 0
  4052.     else if @scope = 'T'
  4053.         select @scopeout = 1
  4054.     else
  4055.     begin
  4056.         raiserror (15251,-1,-1,'scope','''C'' or ''T''')
  4057.         return
  4058.     end
  4059.  
  4060.     if @nullable not in ('U','O')
  4061.     begin
  4062.         raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
  4063.         return
  4064.     end
  4065.  
  4066.     if @table_qualifier is not null
  4067.     begin
  4068.         if db_name() <> @table_qualifier
  4069.         begin /* If qualifier doesn't match current database */
  4070.             raiserror (15250, -1,-1)
  4071.             return
  4072.         end
  4073.     end
  4074.     if @table_owner is null
  4075.     begin     /* If unqualified table name */
  4076.         SELECT @full_table_name = quotename(@table_name)
  4077.     end
  4078.     else
  4079.     begin    /* Qualified table name */
  4080.         if @table_owner = ''
  4081.         begin    /* If empty owner name */
  4082.             SELECT @full_table_name = quotename(@table_owner)
  4083.         end
  4084.         else
  4085.         begin
  4086.             SELECT @full_table_name = quotename(@table_owner) +
  4087.                 '.' + quotename(@table_name)
  4088.         end
  4089.     end
  4090.     /*    Get Object ID */
  4091.     SELECT @table_id = object_id(@full_table_name)
  4092.  
  4093.     if @col_type = 'V'
  4094.     BEGIN /* if ROWVER, just run that query */
  4095.         SELECT
  4096.             SCOPE = convert(smallint,NULL),
  4097.             COLUMN_NAME = convert(sysname,c.name),
  4098.             DATA_TYPE = convert(smallint, -2),
  4099.             TYPE_NAME = t.name,
  4100.             "PRECISION" = convert(int,8),
  4101.             LENGTH = convert(int,8),
  4102.             SCALE = convert(smallint, NULL),
  4103.             PSEUDO_COLUMN = convert(smallint,1)
  4104.         FROM
  4105.             systypes t, syscolumns c
  4106.         WHERE
  4107.             not (@table_id is null)
  4108.             AND c.id = @table_id
  4109.             AND t.name = 'timestamp'    /*    TIMESTAMP  */
  4110.             AND t.xtype = c.xtype        
  4111.             AND t.xusertype = c.xusertype    
  4112.         RETURN
  4113.     END
  4114.  
  4115.     /* ROWID, now find the id of the 'best' index for this table */
  4116.  
  4117.     IF @nullable = 'O'    /* Don't include any indexes that contain
  4118.                            nullable columns. */
  4119.  
  4120.         SELECT @indid = MIN(indid)
  4121.             FROM sysindexes x, syscolumns c, syscolumns c2
  4122.             WHERE
  4123.                 not (@table_id is null)
  4124.                 AND x.status&2 = 2        /*    If Unique Index */
  4125.                 AND c.id = x.id
  4126.                 AND c2.id = c.id
  4127.                 AND c2.colid < x.keycnt + (x.status&16)/16
  4128.                 AND x.id = @table_id
  4129.                 AND indid > 0        /*    Eliminate Table Row */
  4130.                 AND c.name = index_col(@table_name,x.indid,c2.colid)
  4131.                 GROUP BY indid HAVING SUM(c.status&8) = 0
  4132.  
  4133.     ELSE    /* Include indexes that are partially nullable. */
  4134.  
  4135.         SELECT @indid = MIN(indid)
  4136.             FROM sysindexes x
  4137.             WHERE
  4138.                 not (@table_id is null)
  4139.                 AND status&2 = 2        /*    If Unique Index */
  4140.                 AND id = @table_id
  4141.                 AND indid > 0        /*    Eliminate Table Row */
  4142.  
  4143.     SELECT
  4144.         SCOPE = @scopeout,
  4145.         COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),
  4146.         d.DATA_TYPE,
  4147.         convert(sysname,case
  4148.             when t.xusertype > 255 then t.name
  4149.             else d.TYPE_NAME
  4150.         end) TYPE_NAME,
  4151.         convert(int,case
  4152.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4153.             else OdbcPrec(c.xtype,c.length,c.xprec)
  4154.         end) "PRECISION",
  4155.         convert(int,case
  4156.             when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  4157.                 OdbcPrec(c.xtype,c.length,c.xprec)+2
  4158.             else isnull(d.length, c.length)
  4159.         end) LENGTH,
  4160.         SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  4161.         PSEUDO_COLUMN = convert(smallint,1)
  4162.     FROM
  4163.         sysindexes x,
  4164.         syscolumns c,
  4165.         master.dbo.spt_datatype_info d,
  4166.         systypes t,
  4167.         syscolumns c2    /* Self-join to generate list of index columns and */
  4168.                         /* to extract datatype names */
  4169.     WHERE
  4170.         not (@table_id is null)
  4171.         AND x.id = @table_id
  4172.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  4173.         AND c.id = x.id
  4174.         AND c2.id = x.id
  4175.         AND c2.colid < x.keycnt + (x.status&16)/16
  4176.         AND x.indid = @indid
  4177.         AND t.xtype = d.ss_dtype
  4178.         AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4179.         AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  4180.         AND c.xusertype = t.xusertype
  4181. go
  4182.  
  4183. grant execute on sp_special_columns to public
  4184. go
  4185.  
  4186. dump tran master with no_log
  4187. go
  4188.  
  4189. print 'creating sp_sproc_columns'
  4190. go
  4191.  
  4192. /*    Procedure for pre-6.0 server */
  4193. CREATE PROCEDURE sp_sproc_columns (
  4194.                  @procedure_name        varchar(102) = '%', /* 3*32+5+1 */
  4195.                  @procedure_owner        varchar(96) = null,
  4196.                  @procedure_qualifier    varchar(32) = null,
  4197.                  @column_name            varchar(96) = null,
  4198.                  @ODBCVer                int = 2)
  4199. AS
  4200.     DECLARE @group_num_lower smallint
  4201.     DECLARE @group_num_upper smallint
  4202.     DECLARE @semi_position int
  4203.     DECLARE @full_procedure_name    varchar(205)/* 2*102+1 */
  4204.     DECLARE @procedure_id int
  4205.  
  4206.     if @column_name is null /*    If column name not supplied, match all */
  4207.         select @column_name = '%'
  4208.     if @procedure_qualifier is not null
  4209.     begin
  4210.         if db_name() <> @procedure_qualifier
  4211.         begin
  4212.             if @procedure_qualifier = ''
  4213.             begin
  4214.                 /* in this case, we need to return an empty result set */
  4215.                 /* because the user has requested a database with an empty name */
  4216.                 select @procedure_name = ''
  4217.                 select @procedure_owner = ''
  4218.             end
  4219.             else
  4220.             begin    /* If qualifier doesn't match current database */
  4221.                 raiserror 20001 'Procedure qualifier must be name of current database'
  4222.                 return
  4223.             end
  4224.         end
  4225.     end
  4226.  
  4227.     if @procedure_name is null
  4228.     begin    /*    If procedure name not supplied, match all */
  4229.         select @procedure_name = '%'
  4230.     end
  4231.  
  4232.     /* first we need to extract the procedure group number, if one exists */
  4233.     select @semi_position = charindex(';',@procedure_name)
  4234.     if (@semi_position > 0)
  4235.     begin    /* If group number separator (;) found */
  4236.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  4237.         select @group_num_upper = @group_num_lower
  4238.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  4239.     end
  4240.     else
  4241.     begin    /* No group separator, so default to group number of 1 */
  4242.         select @group_num_lower = 1
  4243.         select @group_num_upper = 32767            
  4244.     end
  4245.  
  4246.     if @procedure_owner is null
  4247.     begin    /* If unqualified procedure name */
  4248.         SELECT @full_procedure_name = @procedure_name
  4249.     end
  4250.     else
  4251.     begin    /* Qualified procedure name */
  4252.         SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
  4253.     end
  4254.  
  4255.     /*    Get Object ID */
  4256.     SELECT @procedure_id = object_id(@full_procedure_name)
  4257.     if ((charindex('%',@full_procedure_name) = 0) and
  4258.         (charindex('_',@full_procedure_name) = 0)  and
  4259.         @procedure_id <> 0)
  4260.     begin
  4261.         /* this block is for the case where there is no pattern
  4262.             matching required for the procedure name */
  4263.         SELECT
  4264.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4265.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4266.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  4267.             COLUMN_NAME = convert(varchar(32),c.name),
  4268.             COLUMN_TYPE = convert(smallint, 0),
  4269.             d.DATA_TYPE,
  4270.             TYPE_NAME = t.name,
  4271.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  4272.             LENGTH = isnull(d.length, convert(int,c.length)),
  4273.             SCALE = d.numeric_scale,
  4274.             d.RADIX,
  4275.             d.NULLABLE,
  4276.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4277.             COLUMN_DEF = convert(varchar(255),null),
  4278.             d.SQL_DATA_TYPE,
  4279.             d.SQL_DATETIME_SUB,
  4280.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  4281.             ORDINAL_POSITION = convert(int,c.colid),
  4282.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4283.             SS_DATA_TYPE = c.type
  4284.         FROM
  4285.             syscolumns c,
  4286.             sysobjects o,
  4287.             master.dbo.spt_datatype_info d,
  4288.             systypes t
  4289.         WHERE
  4290.             o.id = @procedure_id
  4291.             AND c.id = o.id
  4292.             AND t.type = d.ss_dtype
  4293.             AND c.length = isnull(d.fixlen, c.length)
  4294.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4295.             AND c.usertype = t.usertype
  4296.             AND c.name like @column_name
  4297.             AND c.number between @group_num_lower and @group_num_upper
  4298.         UNION ALL
  4299.         SELECT           /* return value row*/
  4300.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4301.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4302.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  4303.             COLUMN_NAME = convert(varchar(32),'RETURN_VALUE'),
  4304.             COLUMN_TYPE = convert(smallint, 5),
  4305.             DATA_TYPE = convert(smallint, 4),
  4306.             TYPE_NAME = convert(varchar(32),'int'),
  4307.             "PRECISION" = convert(int,10),
  4308.             LENGTH = convert(int,4),
  4309.             SCALE = convert(smallint,0),
  4310.             RADIX = convert(smallint,10),
  4311.             NULLABLE = convert(smallint,0),
  4312.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4313.             COLUMN_DEF = convert(varchar(255),NULL),
  4314.             SQL_DATA_TYPE = convert(smallint, 4),
  4315.             SQL_DATETIME_SUB = convert(smallint,null),
  4316.             CHAR_OCTET_LENGTH = convert(int,null),
  4317.             ORDINAL_POSITION = convert(int,0),
  4318.             IS_NULLABLE = convert(varchar(254),'NO'),
  4319.             SS_DATA_TYPE = convert(tinyint,56)
  4320.         FROM
  4321.             syscomments c, sysobjects o
  4322.         WHERE
  4323.             o.id = @procedure_id
  4324.             AND c.id = o.id
  4325.             AND c.colid = 1
  4326.             AND o.type = 'P'                        /* Just Procedures */
  4327.             AND 'RETURN_VALUE' like @column_name
  4328.             AND c.number between @group_num_lower and @group_num_upper        
  4329.         ORDER BY 1, 2, 3, 18
  4330.     end
  4331.     else
  4332.     begin
  4333.         /* this block is for the case where there IS pattern
  4334.             matching done on the procedure name */
  4335.         if @procedure_owner is null
  4336.             select @procedure_owner = '%'
  4337.         SELECT
  4338.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4339.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4340.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  4341.             COLUMN_NAME = convert(varchar(32),c.name),
  4342.             COLUMN_TYPE = convert(smallint, 0),
  4343.             d.DATA_TYPE,
  4344.             TYPE_NAME = t.name,
  4345.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  4346.             LENGTH = isnull(d.length, convert(int,c.length)),
  4347.             SCALE = d.numeric_scale,
  4348.             d.RADIX,
  4349.             d.NULLABLE,
  4350.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4351.             COLUMN_DEF = convert(varchar(255),null),
  4352.             d.SQL_DATA_TYPE,
  4353.             d.SQL_DATETIME_SUB,
  4354.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  4355.             ORDINAL_POSITION = convert(int,c.colid),
  4356.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4357.             SS_DATA_TYPE = c.type
  4358.         FROM
  4359.             syscolumns c,
  4360.             sysobjects o,
  4361.             master.dbo.spt_datatype_info d,
  4362.             systypes t
  4363.         WHERE
  4364.             o.name like @procedure_name
  4365.             AND user_name(o.uid) like @procedure_owner
  4366.             AND o.id = c.id
  4367.             AND t.type = d.ss_dtype
  4368.             AND c.length = isnull(d.fixlen, c.length)
  4369.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4370.             AND c.usertype = t.usertype
  4371.             AND o.type = 'P'                            /* Just Procedures */
  4372.             AND c.name like @column_name
  4373.             AND c.number between @group_num_lower and @group_num_upper
  4374.         UNION ALL
  4375.         SELECT           /* return value row*/
  4376.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4377.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4378.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  4379.             COLUMN_NAME = convert(varchar(32),'RETURN_VALUE'),
  4380.             COLUMN_TYPE = convert(smallint, 5),
  4381.             DATA_TYPE = convert(smallint, 4),
  4382.             TYPE_NAME = convert(varchar(32),'int'),
  4383.             "PRECISION" = convert(int,10),
  4384.             LENGTH = convert(int,4),
  4385.             SCALE = convert(smallint,0),
  4386.             RADIX = convert(smallint,10),
  4387.             NULLABLE = convert(smallint,0),
  4388.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4389.             COLUMN_DEF = convert(varchar(255),NULL),
  4390.             SQL_DATA_TYPE = convert(smallint, 4),
  4391.             SQL_DATETIME_SUB = convert(smallint,null),
  4392.             CHAR_OCTET_LENGTH = convert(int,null),
  4393.             ORDINAL_POSITION = convert(int,0),
  4394.             IS_NULLABLE = convert(varchar(254),'NO'),
  4395.             SS_DATA_TYPE = convert(tinyint,56)
  4396.         FROM
  4397.             syscomments c, sysobjects o
  4398.         WHERE
  4399.             o.name like @procedure_name
  4400.             AND user_name(o.uid) like @procedure_owner
  4401.             AND c.id = o.id
  4402.             AND c.colid = 1
  4403.             AND o.type = 'P'                        /* Just Procedures */
  4404.             AND 'RETURN_VALUE' like @column_name
  4405.             AND c.number between @group_num_lower and @group_num_upper
  4406.         ORDER BY 1, 2, 3, 18
  4407.     end
  4408. go
  4409.  
  4410. if (charindex('6.00', @@version) = 0 and
  4411.     charindex('6.50', @@version) = 0 and
  4412.     charindex('7.00', @@version) = 0)
  4413. begin
  4414.     print ''
  4415.     print ''
  4416.     print 'Warning:'
  4417.     print 'you are installing the stored procedures '
  4418.     print 'on a pre 6.0 SQL Server.'
  4419.     print 'Ignore the following error.'
  4420. end
  4421. else
  4422.     drop proc sp_sproc_columns
  4423. go
  4424.  
  4425. /*    Procedure for 6.0 and 6.50 servers */
  4426. CREATE PROCEDURE sp_sproc_columns (
  4427.                  @procedure_name        varchar(102) = '%', /* 3*36+5+1 */
  4428.                  @procedure_owner        varchar(96) = null,
  4429.                  @procedure_qualifier    varchar(32) = null,
  4430.                  @column_name            varchar(96) = null,
  4431.                  @ODBCVer                int = 2)
  4432. AS
  4433.     DECLARE @group_num_lower smallint
  4434.     DECLARE @group_num_upper smallint
  4435.     DECLARE @semi_position int
  4436.     DECLARE @full_procedure_name    varchar(205)
  4437.     DECLARE @procedure_id int
  4438.  
  4439.     if @column_name is null /*    If column name not supplied, match all */
  4440.         select @column_name = '%'
  4441.     if @procedure_qualifier is not null
  4442.     begin
  4443.         if db_name() <> @procedure_qualifier
  4444.         begin
  4445.             if @procedure_qualifier = ''
  4446.             begin
  4447.                 /* in this case, we need to return an empty result set */
  4448.                 /* because the user has requested a database with an empty name */
  4449.                 select @procedure_name = ''
  4450.                 select @procedure_owner = ''
  4451.             end
  4452.             else
  4453.             begin    /* If qualifier doesn't match current database */
  4454.                 raiserror (15250, -1,-1)
  4455.                 return
  4456.             end
  4457.         end
  4458.     end
  4459.  
  4460.     if @procedure_name is null
  4461.     begin    /*    If procedure name not supplied, match all */
  4462.         select @procedure_name = '%'
  4463.     end
  4464.  
  4465.     /* first we need to extract the procedure group number, if one exists */
  4466.     select @semi_position = charindex(';',@procedure_name)
  4467.     if (@semi_position > 0)
  4468.     begin    /* If group number separator (;) found */
  4469.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  4470.         select @group_num_upper = @group_num_lower
  4471.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  4472.     end
  4473.     else
  4474.     begin    /* No group separator, so default to group number of 1 */
  4475.         select @group_num_lower = 1
  4476.         select @group_num_upper = 32767            
  4477.     end
  4478.  
  4479.     if @procedure_owner is null
  4480.     begin    /* If unqualified procedure name */
  4481.         SELECT @full_procedure_name = @procedure_name
  4482.     end
  4483.     else
  4484.     begin    /* Qualified procedure name */
  4485.         SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
  4486.     end
  4487.  
  4488.     /*    Get Object ID */
  4489.     SELECT @procedure_id = object_id(@full_procedure_name)
  4490.     if ((charindex('%',@full_procedure_name) = 0) and
  4491.         (charindex('_',@full_procedure_name) = 0)  and
  4492.         @procedure_id <> 0)
  4493.     begin
  4494.         /* this block is for the case where there is no pattern
  4495.             matching required for the procedure name */
  4496.         SELECT
  4497.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4498.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4499.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  4500.             COLUMN_NAME = convert(varchar(32),c.name),
  4501.             COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
  4502.             d.DATA_TYPE,
  4503.             TYPE_NAME = t.name,
  4504.             convert(int,case
  4505.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4506.                 else isnull(convert(int,c.prec), 2147483647)
  4507.             end) "PRECISION",
  4508.             convert(int,case
  4509.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  4510.                     c.prec+2
  4511.                 else
  4512.                     isnull(d.length, c.length)
  4513.             end) LENGTH,
  4514.             SCALE = convert(smallint, c.scale),
  4515.             d.RADIX,
  4516.             d.NULLABLE,
  4517.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4518.             COLUMN_DEF = convert(varchar(255),NULL),
  4519.             d.SQL_DATA_TYPE,
  4520.             d.SQL_DATETIME_SUB,
  4521.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  4522.             ORDINAL_POSITION = convert(int,c.colid),
  4523.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4524.             SS_DATA_TYPE = c.type
  4525.         FROM
  4526.             syscolumns c,
  4527.             sysobjects o,
  4528.             master.dbo.spt_datatype_info d,
  4529.             systypes t
  4530.         WHERE
  4531.             o.id = @procedure_id
  4532.             AND c.id = o.id
  4533.             AND c.type = d.ss_dtype
  4534.             AND c.length = isnull(d.fixlen, c.length)
  4535.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4536.             AND isnull(d.AUTO_INCREMENT,0) = 0
  4537.             AND c.usertype = t.usertype
  4538.             AND c.name like @column_name
  4539.             AND c.number between @group_num_lower and @group_num_upper
  4540.         UNION ALL
  4541.         SELECT           /* return value row*/
  4542.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4543.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4544.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  4545.             COLUMN_NAME = convert(varchar(32),'RETURN_VALUE'),
  4546.             COLUMN_TYPE = convert(smallint, 5),
  4547.             DATA_TYPE = convert(smallint, 4),
  4548.             TYPE_NAME = convert(varchar(32),'int'),
  4549.             "PRECISION" = convert(int,10),
  4550.             LENGTH = convert(int,4),
  4551.             SCALE = convert(smallint,0),
  4552.             RADIX = convert(smallint,10),
  4553.             NULLABLE = convert(smallint,0),
  4554.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4555.             COLUMN_DEF = convert(varchar(255),NULL),
  4556.             SQL_DATA_TYPE = convert(smallint, 4),
  4557.             SQL_DATETIME_SUB = convert(smallint,null),
  4558.             CHAR_OCTET_LENGTH = convert(int,null),
  4559.             ORDINAL_POSITION = convert(int,0),
  4560.             IS_NULLABLE = convert(varchar(254),'NO'),
  4561.             SS_DATA_TYPE = convert(tinyint,56)
  4562.         FROM
  4563.             syscomments c, sysobjects o
  4564.         WHERE
  4565.             o.id = @procedure_id
  4566.             AND c.id = o.id
  4567.             AND c.colid = 1
  4568.             AND o.type = 'P'                        /* Just Procedures */
  4569.             AND 'RETURN_VALUE' like @column_name
  4570.             AND c.number between @group_num_lower and @group_num_upper
  4571.         ORDER BY 1, 2, 3, 18
  4572.     end
  4573.     else
  4574.     begin
  4575.         /* this block is for the case where there IS pattern
  4576.             matching done on the procedure name */
  4577.         if @procedure_owner is null
  4578.             select @procedure_owner = '%'
  4579.         SELECT
  4580.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4581.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4582.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  4583.             COLUMN_NAME = convert(varchar(32),c.name),
  4584.             COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
  4585.             d.DATA_TYPE,
  4586.             TYPE_NAME = t.name,
  4587.             convert(int,case
  4588.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4589.                 else isnull(convert(int,c.prec), 2147483647)
  4590.             end) "PRECISION",
  4591.             convert(int,case
  4592.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  4593.                     c.prec+2
  4594.                 else
  4595.                     isnull(d.length, c.length)
  4596.             end) LENGTH,
  4597.             SCALE = convert(smallint, c.scale),
  4598.             d.RADIX,
  4599.             d.NULLABLE,
  4600.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4601.             COLUMN_DEF = convert(varchar(255),NULL),
  4602.             d.SQL_DATA_TYPE,
  4603.             d.SQL_DATETIME_SUB,
  4604.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  4605.             ORDINAL_POSITION = convert(int,c.colid),
  4606.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4607.             SS_DATA_TYPE = c.type
  4608.         FROM
  4609.             syscolumns c,
  4610.             sysobjects o,
  4611.             master.dbo.spt_datatype_info d,
  4612.             systypes t
  4613.         WHERE
  4614.             o.name like @procedure_name
  4615.             AND user_name(o.uid) like @procedure_owner
  4616.             AND o.id = c.id
  4617.             AND c.type = d.ss_dtype
  4618.             AND c.length = isnull(d.fixlen, c.length)
  4619.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4620.             AND isnull(d.AUTO_INCREMENT,0) = 0
  4621.             AND c.usertype = t.usertype
  4622.             AND o.type = 'P'                            /* Just Procedures */
  4623.             AND c.name like @column_name
  4624.             AND c.number between @group_num_lower and @group_num_upper
  4625.         UNION ALL
  4626.         SELECT           /* return value row*/
  4627.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  4628.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  4629.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  4630.             COLUMN_NAME = convert(varchar(32),'RETURN_VALUE'),
  4631.             COLUMN_TYPE = convert(smallint, 5),
  4632.             DATA_TYPE = convert(smallint, 4),
  4633.             TYPE_NAME = convert(varchar(32),'int'),
  4634.             "PRECISION" = convert(int,10),
  4635.             LENGTH = convert(int,4),
  4636.             SCALE = convert(smallint,0),
  4637.             RADIX = convert(smallint,10),
  4638.             NULLABLE = convert(smallint,0),
  4639.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4640.             COLUMN_DEF = convert(varchar(255),NULL),
  4641.             SQL_DATA_TYPE = convert(smallint, 4),
  4642.             SQL_DATETIME_SUB = convert(smallint,null),
  4643.             CHAR_OCTET_LENGTH = convert(int,null),
  4644.             ORDINAL_POSITION = convert(int,0),
  4645.             IS_NULLABLE = convert(varchar(254),'NO'),
  4646.             SS_DATA_TYPE = convert(tinyint,56)
  4647.         FROM
  4648.             syscomments c, sysobjects o
  4649.         WHERE
  4650.             o.name like @procedure_name
  4651.             AND user_name(o.uid) like @procedure_owner
  4652.             AND c.id = o.id
  4653.             AND c.colid = 1
  4654.             AND o.type = 'P'                        /* Just Procedures */
  4655.             AND 'RETURN_VALUE' like @column_name
  4656.             AND c.number between @group_num_lower and @group_num_upper
  4657.         ORDER BY 1, 2, 3, 18
  4658.     end
  4659. go
  4660.  
  4661. if (charindex('7.00', @@version) = 0)
  4662. begin
  4663.     print ''
  4664.     print ''
  4665.     print 'Warning:'
  4666.     print 'you are installing the stored procedures '
  4667.     print 'on a pre 7.0 SQL Server.'
  4668.     print 'Ignore the following errors.'
  4669. end
  4670. else
  4671.     drop proc sp_sproc_columns
  4672. go
  4673.  
  4674. /*    Procedure for 7.0 server */
  4675. CREATE PROCEDURE sp_sproc_columns (
  4676.                  @procedure_name        nvarchar(390) = '%',
  4677.                  @procedure_owner        nvarchar(384) = null,
  4678.                  @procedure_qualifier    sysname = null,
  4679.                  @column_name            nvarchar(384) = null,
  4680.                  @ODBCVer                int = 2)
  4681. AS
  4682.     DECLARE @group_num_lower smallint
  4683.     DECLARE @group_num_upper smallint
  4684.     DECLARE @semi_position int
  4685.     DECLARE @full_procedure_name    nvarchar(774)
  4686.     DECLARE @procedure_id int
  4687.  
  4688.     if @column_name is null /*    If column name not supplied, match all */
  4689.         select @column_name = '%'
  4690.     if @procedure_qualifier is not null
  4691.     begin
  4692.         if db_name() <> @procedure_qualifier
  4693.         begin
  4694.             if @procedure_qualifier = ''
  4695.             begin
  4696.                 /* in this case, we need to return an empty result set */
  4697.                 /* because the user has requested a database with an empty name */
  4698.                 select @procedure_name = ''
  4699.                 select @procedure_owner = ''
  4700.             end
  4701.             else
  4702.             begin    /* If qualifier doesn't match current database */
  4703.                 raiserror (15250, -1,-1)
  4704.                 return
  4705.             end
  4706.         end
  4707.     end
  4708.  
  4709.     if @procedure_name is null
  4710.     begin    /*    If procedure name not supplied, match all */
  4711.         select @procedure_name = '%'
  4712.     end
  4713.  
  4714.     /* first we need to extract the procedure group number, if one exists */
  4715.     select @semi_position = charindex(';',@procedure_name)
  4716.     if (@semi_position > 0)
  4717.     begin    /* If group number separator (;) found */
  4718.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  4719.         select @group_num_upper = @group_num_lower
  4720.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  4721.     end
  4722.     else
  4723.     begin    /* No group separator, so default to all groups */
  4724.         select @group_num_lower = 1
  4725.         select @group_num_upper = 32767            
  4726.     end
  4727.  
  4728.     if @procedure_owner is null
  4729.     begin    /* If unqualified procedure name */
  4730.         SELECT @full_procedure_name = quotename(@procedure_name)
  4731.     end
  4732.     else
  4733.     begin    /* Qualified procedure name */
  4734.         if @procedure_owner = ''
  4735.         begin    /* If empty owner name */
  4736.             SELECT @full_procedure_name = quotename(@procedure_owner)
  4737.         end
  4738.         else
  4739.         begin
  4740.             SELECT @full_procedure_name = quotename(@procedure_owner) +
  4741.                 '.' + quotename(@procedure_name)
  4742.         end
  4743.     end
  4744.  
  4745.     /*    Get Object ID */
  4746.     SELECT @procedure_id = object_id(@full_procedure_name)
  4747.     if ((charindex('%',@full_procedure_name) = 0) and
  4748.         (charindex('_',@full_procedure_name) = 0)  and
  4749.         not (@procedure_id is null))
  4750.     begin
  4751.         /* this block is for the case where there is no pattern
  4752.             matching required for the procedure name */
  4753.         SELECT
  4754.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  4755.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  4756.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  4757.             COLUMN_NAME = convert(sysname,c.name),
  4758.             COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
  4759.             d.DATA_TYPE,
  4760.             TYPE_NAME = t.name,
  4761.             convert(int,case
  4762.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4763.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  4764.             end) "PRECISION",
  4765.             convert(int,case
  4766.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  4767.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  4768.                 else
  4769.                     isnull(d.length, c.length)
  4770.             end) LENGTH,
  4771.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  4772.             d.RADIX,
  4773.             d.NULLABLE,
  4774.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4775.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  4776.             d.SQL_DATA_TYPE,
  4777.             d.SQL_DATETIME_SUB,
  4778.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  4779.             ORDINAL_POSITION = convert(int,c.colid),
  4780.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4781.             SS_DATA_TYPE = c.type
  4782.         FROM
  4783.             syscolumns c,
  4784.             sysobjects o,
  4785.             master.dbo.spt_datatype_info d,
  4786.             systypes t
  4787.         WHERE
  4788.             o.id = @procedure_id
  4789.             AND c.id = o.id
  4790.             AND c.xtype = d.ss_dtype
  4791.             AND c.length = isnull(d.fixlen, c.length)
  4792.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4793.             AND isnull(d.AUTO_INCREMENT,0) = 0
  4794.             AND c.xusertype = t.xusertype
  4795.             AND c.name like @column_name
  4796.             AND c.number between @group_num_lower and @group_num_upper
  4797.         UNION ALL
  4798.         SELECT           /* return value row*/
  4799.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  4800.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  4801.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  4802.             COLUMN_NAME = convert(sysname,'RETURN_VALUE'),
  4803.             COLUMN_TYPE = convert(smallint, 5),
  4804.             DATA_TYPE = convert(smallint, 4),
  4805.             TYPE_NAME = convert(sysname,'int'),
  4806.             "PRECISION" = convert(int,10),
  4807.             LENGTH = convert(int,4),
  4808.             SCALE = convert(smallint,0),
  4809.             RADIX = convert(smallint,10),
  4810.             NULLABLE = convert(smallint,0),
  4811.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4812.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  4813.             SQL_DATA_TYPE = convert(smallint, 4),
  4814.             SQL_DATETIME_SUB = convert(smallint,null),
  4815.             CHAR_OCTET_LENGTH = convert(int,null),
  4816.             ORDINAL_POSITION = convert(int,0),
  4817.             IS_NULLABLE = convert(varchar(254),'NO'),
  4818.             SS_DATA_TYPE = convert(tinyint,56)
  4819.         FROM
  4820.             syscomments c, sysobjects o
  4821.         WHERE
  4822.             o.id = @procedure_id
  4823.             AND c.id = o.id
  4824.             AND c.colid = 1
  4825.             AND o.type = 'P'                        /* Just Procedures */
  4826.             AND 'RETURN_VALUE' like @column_name
  4827.             AND c.number between @group_num_lower and @group_num_upper        
  4828.         ORDER BY 1, 2, 3, 18
  4829.     end
  4830.     else
  4831.     begin
  4832.         /* this block is for the case where there IS pattern
  4833.             matching done on the procedure name */
  4834.         if @procedure_owner is null
  4835.             select @procedure_owner = '%'
  4836.         SELECT
  4837.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  4838.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  4839.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  4840.             COLUMN_NAME = convert(sysname,c.name),
  4841.             COLUMN_TYPE = convert(smallint,    1+c.isoutparam),
  4842.             d.DATA_TYPE,
  4843.             TYPE_NAME = t.name,
  4844.             convert(int,case
  4845.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4846.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  4847.             end) "PRECISION",
  4848.             convert(int,case
  4849.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  4850.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  4851.                 else
  4852.                     isnull(d.length, c.length)
  4853.             end) LENGTH,
  4854.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  4855.             d.RADIX,
  4856.             d.NULLABLE,
  4857.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4858.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  4859.             d.SQL_DATA_TYPE,
  4860.             d.SQL_DATETIME_SUB,
  4861.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  4862.             ORDINAL_POSITION = convert(int,c.colid),
  4863.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  4864.             SS_DATA_TYPE = c.type
  4865.         FROM
  4866.             syscolumns c,
  4867.             sysobjects o,
  4868.             master.dbo.spt_datatype_info d,
  4869.             systypes t
  4870.         WHERE
  4871.             o.name like @procedure_name
  4872.             AND user_name(o.uid) like @procedure_owner
  4873.             AND o.id = c.id
  4874.             AND c.xtype = d.ss_dtype
  4875.             AND c.length = isnull(d.fixlen, c.length)
  4876.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  4877.             AND isnull(d.AUTO_INCREMENT,0) = 0
  4878.             AND c.xusertype = t.xusertype
  4879.             AND o.type = 'P'                            /* Just Procedures */
  4880.             AND c.name like @column_name
  4881.             AND c.number between @group_num_lower and @group_num_upper
  4882.         UNION ALL
  4883.         SELECT           /* return value row*/
  4884.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  4885.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  4886.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  4887.             COLUMN_NAME = convert(sysname,'RETURN_VALUE'),
  4888.             COLUMN_TYPE = convert(smallint, 5),
  4889.             DATA_TYPE = convert(smallint, 4),
  4890.             TYPE_NAME = convert(sysname,'int'),
  4891.             "PRECISION" = convert(int,10),
  4892.             LENGTH = convert(int,4),
  4893.             SCALE = convert(smallint,0),
  4894.             RADIX = convert(smallint,10),
  4895.             NULLABLE = convert(smallint,0),
  4896.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  4897.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  4898.             SQL_DATA_TYPE = convert(smallint, 4),
  4899.             SQL_DATETIME_SUB = convert(smallint,null),
  4900.             CHAR_OCTET_LENGTH = convert(int,null),
  4901.             ORDINAL_POSITION = convert(int,0),
  4902.             IS_NULLABLE = convert(varchar(254),'NO'),
  4903.             SS_DATA_TYPE = convert(tinyint,56)
  4904.         FROM
  4905.             syscomments c, sysobjects o
  4906.         WHERE
  4907.             o.name like @procedure_name
  4908.             AND c.id = o.id
  4909.             AND user_name(o.uid) like @procedure_owner
  4910.             AND c.colid = 1
  4911.             AND o.type = 'P'                        /* Just Procedures */
  4912.             AND 'RETURN_VALUE' like @column_name
  4913.             AND c.number between @group_num_lower and @group_num_upper
  4914.         ORDER BY 1, 2, 3, 18
  4915.     end
  4916. go
  4917.  
  4918. grant execute on sp_sproc_columns to public
  4919. go
  4920.  
  4921. dump tran master with no_log
  4922. go
  4923.  
  4924. print 'creating sp_statistics'
  4925. go
  4926.  
  4927. /*    Procedure for pre-7.0 server */
  4928. CREATE PROCEDURE sp_statistics (
  4929.                  @table_name        varchar(32),
  4930.                  @table_owner        varchar(32) = null,
  4931.                  @table_qualifier    varchar(32) = null,
  4932.                  @index_name        varchar(32) = '%',
  4933.                  @is_unique         char(1) = 'N',
  4934.                  @accuracy            char(1) = 'Q')
  4935. AS
  4936.     DECLARE @indid                int
  4937.     DECLARE @lastindid            int
  4938.     DECLARE @table_id            int
  4939.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  4940.  
  4941.     create table #TmpIndex(
  4942.         TABLE_QUALIFIER varchar(32) NULL,
  4943.         TABLE_OWNER     varchar(32) NULL,
  4944.         TABLE_NAME        varchar(32) NOT NULL,
  4945.         INDEX_QUALIFIER varchar(32) null,
  4946.         INDEX_NAME        varchar(32) null,
  4947.         NON_UNIQUE        smallint null,
  4948.         TYPE            smallint NOT NULL,
  4949.         SEQ_IN_INDEX    smallint null,
  4950.         COLUMN_NAME     varchar(32) null,
  4951.         COLLATION        char(1) null,
  4952.         index_id        int null,
  4953.         CARDINALITY     int null,
  4954.         PAGES            int null,
  4955.         status            smallint NOT NULL)
  4956.  
  4957.     if @table_qualifier is not null
  4958.     begin
  4959.         if db_name() <> @table_qualifier
  4960.         begin    /* If qualifier doesn't match current database */
  4961.             raiserror 20001 'Table qualifier must be name of current database'
  4962.             return
  4963.         end
  4964.     end
  4965.  
  4966.     if @accuracy not in ('Q','E')
  4967.         begin
  4968.             raiserror 20002 'Illegal ''accuracy'' specified -- must be ''Q'' or ''E''.'
  4969.             return
  4970.         end
  4971.  
  4972.     if (@@trancount <> 0 and
  4973.         charindex('6.50', @@version) = 0 and
  4974.         charindex('7.00', @@version) = 0)
  4975.     begin    /* If inside a transaction */
  4976.         raiserror 20003 'The procedure ''sp_statistics'' cannot be executed from within a transaction.'
  4977.         return
  4978.     end
  4979.  
  4980.     if @table_owner is null
  4981.     begin    /* If unqualified table name */
  4982.         SELECT @full_table_name = @table_name
  4983.     end
  4984.     else
  4985.     begin    /* Qualified table name */
  4986.         if @table_owner = ''
  4987.         begin    /* If empty owner name */
  4988.             SELECT @full_table_name = @table_owner
  4989.         end
  4990.         else
  4991.         begin
  4992.             SELECT @full_table_name = @table_owner + '.' + @table_name
  4993.         end
  4994.     end
  4995.     /*    Get Object ID */
  4996.     SELECT @table_id = object_id(@full_table_name)
  4997.  
  4998.     /*    Start at lowest index id */
  4999.     SELECT @indid = min(indid)
  5000.     FROM sysindexes
  5001.     WHERE id = @table_id
  5002.         AND indid > 0
  5003.         AND indid < 255
  5004.  
  5005.     WHILE @indid is not NULL
  5006.     BEGIN
  5007.         INSERT #TmpIndex    /* Add all columns that are in index */
  5008.             SELECT
  5009.                 DB_NAME(),                                /* TABLE_QUALIFIER */
  5010.                 USER_NAME(o.uid),                        /* TABLE_OWNER       */
  5011.                 o.name,                                 /* TABLE_NAME       */
  5012.                 o.name,                                 /* INDEX_QUALIFIER */
  5013.                 x.name,                                 /* INDEX_NAME       */
  5014.                 0,                                        /* NON_UNIQUE       */
  5015.                 1,                                        /* SQL_INDEX_CLUSTERED */
  5016.                 colid,                                    /* SEQ_IN_INDEX    */
  5017.                 INDEX_COL(@full_table_name,indid,colid),/* COLUMN_NAME       */
  5018.                 'A',                                    /* COLLATION       */
  5019.                 @indid,                                 /* index_id        */
  5020.                 x.rows,                                 /* CARDINALITY       */
  5021.                 x.dpages,                                /* PAGES           */
  5022.                 x.status                                /* status            */
  5023.             FROM sysindexes x, syscolumns c, sysobjects o
  5024.             WHERE
  5025.                 x.id = @table_id
  5026.                 AND x.id = o.id
  5027.                 AND x.id = c.id
  5028.                 AND c.colid < keycnt+(x.status&18)/18    /* all but Unique Clust indices have an extra key */
  5029.                 AND x.indid = @indid
  5030.         /*
  5031.         **      Now move @indid to the next index.
  5032.         */
  5033.         SELECT @lastindid = @indid
  5034.         SELECT @indid = NULL
  5035.  
  5036.         SELECT @indid = min(indid)
  5037.         FROM sysindexes
  5038.         WHERE id = @table_id
  5039.             AND indid > @lastindid
  5040.             AND indid < 255
  5041.     END
  5042.  
  5043.     UPDATE #TmpIndex
  5044.         SET NON_UNIQUE = 1
  5045.         WHERE status&2 <> 2 /* If non-unique index */
  5046.     UPDATE #TmpIndex
  5047.         SET
  5048.             TYPE = 3,            /* SQL_INDEX_OTHER */
  5049.             CARDINALITY = NULL,
  5050.             PAGES = NULL
  5051.         WHERE index_id > 1    /* If non-clustered index */
  5052.  
  5053.     /* now add row for table statistics */
  5054.     INSERT #TmpIndex
  5055.         SELECT
  5056.             DB_NAME(),                /* TABLE_QUALIFIER */
  5057.             USER_NAME(o.uid),        /* TABLE_OWNER       */
  5058.             o.name,                 /* TABLE_NAME       */
  5059.             null,                    /* INDEX_QUALIFIER */
  5060.             null,                    /* INDEX_NAME       */
  5061.             null,                    /* NON_UNIQUE       */
  5062.             0,                        /* SQL_TABLE_STAT  */
  5063.             null,                    /* SEQ_IN_INDEX    */
  5064.             null,                    /* COLUMN_NAME       */
  5065.             null,                    /* COLLATION       */
  5066.             0,                        /* index_id        */
  5067.             x.rows,                 /* CARDINALITY       */
  5068.             x.dpages,                /* PAGES           */
  5069.             0                        /* status           */
  5070.         FROM sysindexes x, sysobjects o
  5071.         WHERE o.id = @table_id
  5072.             AND x.id = o.id
  5073.             AND (x.indid = 0 or x.indid = 1)    /*    If there are no indexes */
  5074.                                                 /*    then table stats are in */
  5075.                                                 /*    a row with indid =0        */
  5076.  
  5077.     if @is_unique <> 'Y'    /* If all indexes desired */
  5078.         SELECT
  5079.             TABLE_QUALIFIER,
  5080.             TABLE_OWNER,
  5081.             TABLE_NAME,
  5082.             NON_UNIQUE,
  5083.             INDEX_QUALIFIER,
  5084.             INDEX_NAME,
  5085.             TYPE,
  5086.             SEQ_IN_INDEX,
  5087.             COLUMN_NAME,
  5088.             COLLATION,
  5089.             CARDINALITY,
  5090.             PAGES,
  5091.             FILTER_CONDITION = convert(varchar(128),null)
  5092.         FROM #TmpIndex
  5093.         WHERE
  5094.             INDEX_NAME like @index_name /* If matching name */
  5095.             or INDEX_NAME is null        /* If SQL_TABLE_STAT row */
  5096.         ORDER BY 4, 7, 6, 8
  5097.     else                    /* If only unique indexes desired */
  5098.         SELECT
  5099.             TABLE_QUALIFIER,
  5100.             TABLE_OWNER,
  5101.             TABLE_NAME,
  5102.             NON_UNIQUE,
  5103.             INDEX_QUALIFIER,
  5104.             INDEX_NAME,
  5105.             TYPE,
  5106.             SEQ_IN_INDEX,
  5107.             COLUMN_NAME,
  5108.             COLLATION,
  5109.             CARDINALITY,
  5110.             PAGES,
  5111.             FILTER_CONDITION = convert(varchar(128),null)
  5112.         FROM #TmpIndex
  5113.         WHERE
  5114.             (NON_UNIQUE = 0             /* If unique */
  5115.                 or NON_UNIQUE is NULL)    /* If SQL_TABLE_STAT row */
  5116.             and (INDEX_NAME like @index_name    /* If matching name */
  5117.                 or INDEX_NAME is null)    /* If SQL_TABLE_STAT row */
  5118.         ORDER BY 4, 7, 6, 8
  5119.  
  5120.     DROP TABLE #TmpIndex
  5121. go
  5122.  
  5123. if (charindex('7.00', @@version) = 0)
  5124. begin
  5125.     print ''
  5126.     print ''
  5127.     print 'Warning:'
  5128.     print 'you are installing the stored procedures '
  5129.     print 'on a pre 7.0 SQL Server.'
  5130.     print 'Ignore the following errors.'
  5131. end
  5132. else
  5133.     drop proc sp_statistics
  5134. go
  5135.  
  5136. /*    Procedure for 7.0 server */
  5137. CREATE PROCEDURE sp_statistics (
  5138.                  @table_name        sysname,
  5139.                  @table_owner        sysname = null,
  5140.                  @table_qualifier    sysname = null,
  5141.                  @index_name        sysname = '%',
  5142.                  @is_unique         char(1) = 'N',
  5143.                  @accuracy            char(1) = 'Q')
  5144. AS
  5145.     DECLARE @indid                int
  5146.     DECLARE @lastindid            int
  5147.     DECLARE @table_id            int
  5148.     DECLARE @full_table_name    nvarchar(257)
  5149.  
  5150.     create table #TmpIndex(
  5151.         TABLE_QUALIFIER sysname NULL,
  5152.         TABLE_OWNER     sysname NULL,
  5153.         TABLE_NAME        sysname NOT NULL,
  5154.         INDEX_QUALIFIER sysname null,
  5155.         INDEX_NAME        sysname null,
  5156.         NON_UNIQUE        smallint null,
  5157.         TYPE            smallint NOT NULL,
  5158.         SEQ_IN_INDEX    smallint null,
  5159.         COLUMN_NAME     sysname null,
  5160.         COLLATION        char(1) null,
  5161.         index_id        int null,
  5162.         CARDINALITY     int null,
  5163.         PAGES            int null,
  5164.         status            int NOT NULL)
  5165.  
  5166.     if @table_qualifier is not null
  5167.     begin
  5168.         if db_name() <> @table_qualifier
  5169.         begin    /* If qualifier doesn't match current database */
  5170.             raiserror (15250, -1,-1)
  5171.             return
  5172.         end
  5173.     end
  5174.  
  5175.     if @accuracy not in ('Q','E')
  5176.         begin
  5177.             raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')
  5178.             return
  5179.         end
  5180.  
  5181.     if @table_owner is null
  5182.     begin    /* If unqualified table name */
  5183.         SELECT @full_table_name = quotename(@table_name)
  5184.     end
  5185.     else
  5186.     begin    /* Qualified table name */
  5187.         if @table_owner = ''
  5188.         begin    /* If empty owner name */
  5189.             SELECT @full_table_name = quotename(@table_owner)
  5190.         end
  5191.         else
  5192.         begin
  5193.             SELECT @full_table_name = quotename(@table_owner) +
  5194.                 '.' + quotename(@table_name)
  5195.         end
  5196.     end
  5197.     /*    Get Object ID */
  5198.     SELECT @table_id = object_id(@full_table_name)
  5199.  
  5200.     /*    Start at lowest index id */
  5201.     SELECT @indid = min(indid)
  5202.     FROM sysindexes
  5203.     WHERE not (@table_id is null)
  5204.         AND id = @table_id
  5205.         AND indid > 0
  5206.         AND indid < 255
  5207.  
  5208.     WHILE @indid is not NULL
  5209.     BEGIN
  5210.         INSERT #TmpIndex    /* Add all columns that are in index */
  5211.             SELECT
  5212.                 DB_NAME(),                                /* TABLE_QUALIFIER */
  5213.                 USER_NAME(o.uid),                        /* TABLE_OWNER       */
  5214.                 o.name,                                 /* TABLE_NAME       */
  5215.                 o.name,                                 /* INDEX_QUALIFIER */
  5216.                 x.name,                                 /* INDEX_NAME       */
  5217.                 case                                    /* NON_UNIQUE       */
  5218.                     WHEN x.status&2 <> 2 then 1            /* Nonunique index */
  5219.                     else 0                                /* Unique index    */
  5220.                 end,
  5221.                 case                                    /* TYPE            */
  5222.                     when @indid > 1 then 3                /* Non-Clustered   */
  5223.                     else 1                                /* Clustered index */
  5224.                 end,
  5225.                 colid,                                    /* SEQ_IN_INDEX    */
  5226.                 INDEX_COL(@full_table_name,indid,colid),/* COLUMN_NAME       */
  5227.                 'A',                                    /* COLLATION       */
  5228.                 @indid,                                 /* index_id        */
  5229.                 case                                    /* CARDINALITY       */
  5230.                     when @indid > 1 then NULL            /* Non-Clustered   */
  5231.                     else x.rows                         /* Clustered index */
  5232.                 end,
  5233.                 case                                    /* PAGES           */
  5234.                     when @indid > 1 then NULL            /* Non-Clustered   */
  5235.                     else x.dpages                        /* Clustered index */
  5236.                 end,
  5237.                 x.status                                /* status            */
  5238.             FROM sysindexes x, syscolumns c, sysobjects o
  5239.             WHERE
  5240.                 not (@table_id is null)
  5241.                 AND x.id = @table_id
  5242.                 AND x.id = o.id
  5243.                 AND x.id = c.id
  5244.                 AND colid < keycnt+(x.status&18)/18    /* all but Unique Clust indices have an extra key */
  5245.                 AND INDEX_COL(@full_table_name,indid,colid) IS NOT NULL
  5246.                 AND indid = @indid
  5247.                 AND (x.status&2 = 2
  5248.                     OR @is_unique <> 'Y')
  5249.         /*
  5250.         **      Now move @indid to the next index.
  5251.         */
  5252.         SELECT @lastindid = @indid
  5253.         SELECT @indid = NULL
  5254.  
  5255.         SELECT @indid = min(indid)
  5256.         FROM sysindexes
  5257.         WHERE not (@table_id is null)
  5258.             AND id = @table_id
  5259.             AND indid > @lastindid
  5260.             AND indid < 255
  5261.     END
  5262.  
  5263.     /* now add row for table statistics */
  5264.     INSERT #TmpIndex
  5265.         SELECT
  5266.             DB_NAME(),                /* TABLE_QUALIFIER */
  5267.             USER_NAME(o.uid),        /* TABLE_OWNER       */
  5268.             o.name,                 /* TABLE_NAME       */
  5269.             null,                    /* INDEX_QUALIFIER */
  5270.             null,                    /* INDEX_NAME       */
  5271.             null,                    /* NON_UNIQUE       */
  5272.             0,                        /* SQL_TABLE_STAT  */
  5273.             null,                    /* SEQ_IN_INDEX    */
  5274.             null,                    /* COLUMN_NAME       */
  5275.             null,                    /* COLLATION       */
  5276.             0,                        /* index_id        */
  5277.             x.rows,                 /* CARDINALITY       */
  5278.             x.dpages,                /* PAGES           */
  5279.             0                        /* status           */
  5280.         FROM sysindexes x, sysobjects o
  5281.         WHERE not (@table_id is null)
  5282.             AND o.id = @table_id
  5283.             AND x.id = o.id
  5284.             AND (x.indid = 0 or x.indid = 1)    /*    If there are no indexes */
  5285.                                                 /*    then table stats are in */
  5286.                                                 /*    a row with indid =0        */
  5287.  
  5288.     SELECT
  5289.         TABLE_QUALIFIER,
  5290.         TABLE_OWNER,
  5291.         TABLE_NAME,
  5292.         NON_UNIQUE,
  5293.         INDEX_QUALIFIER,
  5294.         INDEX_NAME,
  5295.         TYPE,
  5296.         SEQ_IN_INDEX,
  5297.         COLUMN_NAME,
  5298.         COLLATION,
  5299.         CARDINALITY,
  5300.         PAGES,
  5301.         FILTER_CONDITION = convert(varchar(128),null)
  5302.     FROM #TmpIndex
  5303.     WHERE
  5304.         INDEX_NAME like @index_name /* If matching name */
  5305.         or INDEX_NAME is null        /* If SQL_TABLE_STAT row */
  5306.     ORDER BY 4, 7, 6, 8
  5307.  
  5308.     DROP TABLE #TmpIndex
  5309. go
  5310.  
  5311. grant execute on sp_statistics to public
  5312. go
  5313.  
  5314. dump tran master with no_log
  5315. go
  5316.  
  5317. print 'creating sp_stored_procedures'
  5318. go
  5319.  
  5320.  
  5321. /* pre 7.00 version */
  5322. create procedure sp_stored_procedures(
  5323.                         @sp_name        varchar(102) = null,
  5324.                         @sp_owner        varchar(96) = null,
  5325.                         @sp_qualifier    varchar(32) = null)
  5326. as
  5327.     declare @proc_type smallint
  5328.  
  5329.     if @sp_qualifier is not null
  5330.     begin
  5331.         if db_name() <> @sp_qualifier
  5332.         begin
  5333.             if @sp_qualifier = ''
  5334.             begin
  5335.                 /* in this case, we need to return an empty result set */
  5336.                 /* because the user has requested a database with an empty name */
  5337.                 select @sp_name = ''
  5338.                 select @sp_owner = ''
  5339.             end else
  5340.             begin    /* If qualifier doesn't match current database */
  5341.                 raiserror 20001 'Procedure qualifier must be name of current database'
  5342.                 return
  5343.             end
  5344.         end
  5345.     end
  5346.  
  5347.     if @sp_name is null
  5348.     begin  /*  If procedure name not supplied, match all */
  5349.         select @sp_name = '%'
  5350.     end
  5351.     else begin
  5352.         if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
  5353.         begin
  5354.             if exists (select * from sysobjects
  5355.                 where uid = user_id()
  5356.                     and name = @sp_name
  5357.                     and type = 'P') /* Object type of Procedure */
  5358.             begin
  5359.                 select @sp_owner = user_name()
  5360.             end
  5361.         end
  5362.     end
  5363.     if @sp_owner is null    /*    If procedure owner not supplied, match all */
  5364.         select @sp_owner = '%'
  5365.  
  5366.     select @proc_type=2        /* Return 2 for 4.2 and later servers. */
  5367.  
  5368.     select
  5369.         PROCEDURE_QUALIFIER = convert(varchar(32),db_name()),
  5370.         PROCEDURE_OWNER = convert(varchar(32),user_name(o.uid)),
  5371.         PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  5372.         NUM_INPUT_PARAMS = -1,    /* Constant since value unknown */
  5373.         NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
  5374.         NUM_RESULT_SETS = -1,    /* Constant since value unknown */
  5375.         REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5376.         PROCEDURE_TYPE = @proc_type
  5377.     from
  5378.         sysobjects o,syscomments c,sysusers u
  5379.     where
  5380.         o.name like @sp_name
  5381.         and c.colid = 1
  5382.         and user_name(o.uid) like @sp_owner
  5383.         and o.type = 'P'        /* Object type of Procedure */
  5384.         and c.id = o.id
  5385.         and u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  5386.         and (suser_id() = 1     /* User is the System Administrator */
  5387.             or o.uid = user_id()    /* User created the object */
  5388.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  5389.             or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  5390.              from sysprotects p
  5391.              /* outer join to correlate with all rows in sysobjects */
  5392.              where p.id =* o.id
  5393.                  /*  get rows for public,current user,user's group */
  5394.                  and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
  5395.                  /* check for SELECT,EXECUTE privilege */
  5396.                  and (action in (193,224)))&1    /* more magic...normalize GRANT */
  5397.             ) = 1     /* final magic...compare Grants    */
  5398.         )
  5399.     order by 1, 2, 3
  5400. go
  5401.  
  5402. grant execute on sp_stored_procedures to public
  5403. go
  5404.  
  5405.  
  5406. if (charindex('7.00', @@version) > 0)
  5407.     drop procedure sp_stored_procedures
  5408. else
  5409. begin
  5410.     print ''
  5411.     print ''
  5412.     print 'Warning:'
  5413.     print 'you are installing the stored procedures '
  5414.     print 'on a pre 7.0 SQL Server.'
  5415.     print 'Ignore the following errors.'
  5416. end
  5417. go
  5418.  
  5419.  
  5420. /* 7.00 version */
  5421. create procedure sp_stored_procedures(
  5422.                         @sp_name        nvarchar(390) = null,
  5423.                         @sp_owner        nvarchar(384) = null,
  5424.                         @sp_qualifier    sysname = null)
  5425. as
  5426.     declare @proc_type smallint
  5427.  
  5428.     if @sp_qualifier is not null
  5429.     begin
  5430.         if db_name() <> @sp_qualifier
  5431.         begin
  5432.             if @sp_qualifier = ''
  5433.             begin
  5434.                 /* in this case, we need to return an empty result set */
  5435.                 /* because the user has requested a database with an empty name */
  5436.                 select @sp_name = ''
  5437.                 select @sp_owner = ''
  5438.             end else
  5439.             begin    /* If qualifier doesn't match current database */
  5440.                 raiserror (15250, -1,-1)
  5441.                 return
  5442.             end
  5443.         end
  5444.     end
  5445.  
  5446.     if @sp_name is null
  5447.     begin  /*  If procedure name not supplied, match all */
  5448.         select @sp_name = '%'
  5449.     end
  5450.     else begin
  5451.         if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
  5452.         begin
  5453.             if exists (select * from sysobjects
  5454.                 where uid = user_id()
  5455.                     and name = @sp_name
  5456.                     and type = 'P') /* Object type of Procedure */
  5457.             begin
  5458.                 select @sp_owner = user_name()
  5459.             end
  5460.         end
  5461.     end
  5462.     if @sp_owner is null    /*    If procedure owner not supplied, match all */
  5463.         select @sp_owner = '%'
  5464.  
  5465.     select @proc_type=2        /* Return 2 for 4.2 and later servers. */
  5466.  
  5467.     select
  5468.         PROCEDURE_QUALIFIER = convert(sysname,db_name()),
  5469.         PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),
  5470.         PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  5471.         NUM_INPUT_PARAMS = -1,    /* Constant since value unknown */
  5472.         NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
  5473.         NUM_RESULT_SETS = -1,    /* Constant since value unknown */
  5474.         REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5475.         PROCEDURE_TYPE = @proc_type
  5476.     from
  5477.         sysobjects o,syscomments c
  5478.     where
  5479.         o.name like @sp_name
  5480.         and c.colid = 1
  5481.         and user_name(o.uid) like @sp_owner
  5482.         and o.type = 'P'        /* Object type of Procedure */
  5483.         and c.id = o.id
  5484.         and permissions (o.id)&32 <> 0
  5485.     order by 1, 2, 3
  5486. go
  5487.  
  5488. grant execute on sp_stored_procedures to public
  5489. go
  5490.  
  5491. dump tran master with no_log
  5492. go
  5493.  
  5494.  
  5495. print 'creating sp_table_privileges'
  5496. go
  5497.  
  5498. /*    Procedure for pre 6.50 server */
  5499. CREATE PROCEDURE sp_table_privileges (
  5500.             @table_name         varchar(96),        /* 3*32 */
  5501.             @table_owner        varchar(96) = null,
  5502.             @table_qualifier    varchar(32) = null)
  5503. as
  5504.  
  5505.     if @table_qualifier is not null
  5506.     begin
  5507.         if db_name() <> @table_qualifier
  5508.         begin    /* If qualifier doesn't match current database */
  5509.             raiserror 20001 'Table qualifier must be name of current database'
  5510.             return
  5511.         end
  5512.     end
  5513.     if (@@trancount <> 0)
  5514.     begin    /* If inside a transaction */
  5515.         raiserror 20003 'The procedure ''sp_table_privileges'' cannot be executed from within a transaction.'
  5516.         return
  5517.     end
  5518.     if @table_name is null
  5519.         select @table_name = '%'
  5520.     if @table_owner is null /* If no owner supplied, force wildcard */
  5521.         select @table_owner = '%'
  5522.  
  5523.     create table #table_priv1(
  5524.         id                        int NOT NULL,
  5525.         grantor                 smallint NOT NULL,
  5526.         grantee                 smallint NOT NULL,
  5527.         select_privilege        bit,
  5528.         insert_privilege        bit,
  5529.         update_privilege        bit,
  5530.         delete_privilege        bit,
  5531.         references_privilege    bit,
  5532.         select_privilege_grant    bit,
  5533.         insert_privilege_grant    bit,
  5534.         update_privilege_grant    bit,
  5535.         delete_privilege_grant    bit,
  5536.         references_privilege_grant    bit,
  5537.         uid                     smallint NOT NULL,
  5538.         gid                     smallint NOT NULL)
  5539.  
  5540.     insert into #table_priv1
  5541.         select distinct
  5542.             o.id,
  5543.             o.uid,
  5544.             u.uid,
  5545.             0,
  5546.             0,
  5547.             0,
  5548.             0,
  5549.             0,
  5550.             0,
  5551.             0,
  5552.             0,
  5553.             0,
  5554.             0,
  5555.             u.uid,
  5556.             u.gid
  5557.         from sysusers u, sysobjects o, sysprotects p
  5558.         where
  5559.             o.name like @table_name
  5560.             and user_name(o.uid) like @table_owner
  5561.             and u.uid <> u.gid
  5562.             and u.uid *= p.uid and o.id *= p.id
  5563.             and p.protecttype in (204, 205)
  5564.             and type in ('S ','U ','V ')    /* only valid for system tables,
  5565.                                             ** user tables, and views. */
  5566.  
  5567.     /*
  5568.     ** now add/update row for table owner
  5569.     */
  5570.     if exists (
  5571.         select *
  5572.             from #table_priv1
  5573.             where grantor = grantee)
  5574.     begin
  5575.         update #table_priv1
  5576.         set
  5577.             select_privilege_grant = 1,
  5578.             update_privilege_grant = 1,
  5579.             insert_privilege_grant = 1,
  5580.             delete_privilege_grant = 1,
  5581.             references_privilege_grant = 1,
  5582.             grantor = (select uid from sysusers where suid = 1)
  5583.         where grantor = grantee
  5584.     end
  5585.     else
  5586.     begin
  5587.         insert into #table_priv1
  5588.             select
  5589.                 o.id,
  5590.                 u1.uid,
  5591.                 o.uid,
  5592.                 0,
  5593.                 0,
  5594.                 0,
  5595.                 0,
  5596.                 0,
  5597.                 1,
  5598.                 1,
  5599.                 1,
  5600.                 1,
  5601.                 1,
  5602.                 o.uid,
  5603.                 u.gid
  5604.             from sysobjects o, sysusers u, sysusers u1
  5605.             where o.name like @table_name
  5606.             and user_name(o.uid) like @table_owner
  5607.             and u.uid = o.uid
  5608.             and type in ('S ','U ','V ')    /* only valid for system tables,
  5609.                                            ** user tables, and views. */
  5610.             and u1.suid = 1        /* grantor is dbo of database */
  5611.  
  5612.     end
  5613.  
  5614.     update #table_priv1
  5615.     set select_privilege = 1
  5616.         from sysprotects p
  5617.     where
  5618.         #table_priv1.id = p.id
  5619.         and (#table_priv1.uid = p.uid
  5620.             or #table_priv1.gid = p.uid
  5621.             or p.uid = 0)
  5622.         and protecttype = 205
  5623.         and action = 193
  5624.         and not exists (
  5625.             select * from sysprotects
  5626.             where
  5627.                 #table_priv1.id = sysprotects.id
  5628.                 and (#table_priv1.uid = uid
  5629.                     or #table_priv1.gid = uid
  5630.                     or uid = 0)
  5631.                 and protecttype = 206
  5632.                 and action = 193)
  5633.  
  5634.     update #table_priv1
  5635.     set insert_privilege = 1
  5636.         from sysprotects p
  5637.     where
  5638.         #table_priv1.id = p.id
  5639.         and (#table_priv1.uid = p.uid
  5640.             or #table_priv1.gid = p.uid
  5641.             or p.uid = 0)
  5642.         and protecttype = 205
  5643.         and action = 195
  5644.         and not exists (
  5645.             select * from sysprotects
  5646.             where
  5647.                 #table_priv1.id = sysprotects.id
  5648.                 and (#table_priv1.uid = uid
  5649.                     or #table_priv1.gid = uid
  5650.                     or uid = 0)
  5651.                 and protecttype = 206
  5652.                 and action = 195)
  5653.  
  5654.     update #table_priv1
  5655.     set delete_privilege = 1
  5656.         from sysprotects p
  5657.     where
  5658.         exists (
  5659.             select * from sysprotects
  5660.             where
  5661.                 #table_priv1.id = sysprotects.id
  5662.                 and (#table_priv1.uid = uid
  5663.                     or #table_priv1.gid = uid
  5664.                     or uid = 0)
  5665.                 and protecttype = 205
  5666.                 and action = 196)
  5667.         and not exists (select * from sysprotects
  5668.             where
  5669.                 #table_priv1.id = sysprotects.id
  5670.                 and (#table_priv1.uid = uid
  5671.                     or #table_priv1.gid = uid
  5672.                     or uid = 0)
  5673.                 and protecttype = 206
  5674.                 and action = 196)
  5675.  
  5676.     update #table_priv1
  5677.     set update_privilege = 1
  5678.         from sysprotects p
  5679.     where
  5680.         #table_priv1.id = p.id
  5681.         and (#table_priv1.uid = p.uid
  5682.             or #table_priv1.gid = p.uid
  5683.             or p.uid = 0)
  5684.         and protecttype = 205
  5685.         and action = 197
  5686.         and not exists (
  5687.             select * from sysprotects
  5688.             where
  5689.                 #table_priv1.id = sysprotects.id
  5690.                 and (#table_priv1.uid = uid
  5691.                     or #table_priv1.gid = uid
  5692.                     or uid = 0)
  5693.                 and protecttype = 206
  5694.                 and action = 197)
  5695.  
  5696.     update #table_priv1
  5697.     set references_privilege = 1
  5698.         from sysprotects p
  5699.     where
  5700.         #table_priv1.id = p.id
  5701.         and (#table_priv1.uid = p.uid
  5702.             or #table_priv1.gid = p.uid
  5703.             or p.uid = 0)
  5704.         and protecttype = 205
  5705.         and action = 26
  5706.         and not exists (
  5707.             select * from sysprotects
  5708.             where
  5709.                 #table_priv1.id = sysprotects.id
  5710.                 and (#table_priv1.uid = uid
  5711.                     or #table_priv1.gid = uid
  5712.                     or uid = 0)
  5713.                 and protecttype = 206
  5714.                 and action = 26)
  5715.  
  5716.     create table #table_priv2(
  5717.         id                int NOT NULL,
  5718.         grantor         smallint NOT NULL,
  5719.         grantee         smallint NOT NULL,
  5720.         PRIVILEGE        varchar(32) NOT NULL,
  5721.         IS_GRANTABLE    varchar(3) NULL)
  5722.  
  5723.     insert into #table_priv2
  5724.         select
  5725.             id,
  5726.             grantor,
  5727.             grantee,
  5728.             'SELECT',
  5729.             'NO'
  5730.         from #table_priv1
  5731.         where select_privilege = 1 and select_privilege_grant = 0
  5732.  
  5733.     insert into #table_priv2
  5734.         select
  5735.             id,
  5736.             grantor,
  5737.             grantee,
  5738.             'INSERT',
  5739.             'NO'
  5740.         from #table_priv1
  5741.         where insert_privilege = 1 and insert_privilege_grant = 0
  5742.  
  5743.     insert into #table_priv2
  5744.         select
  5745.             id,
  5746.             grantor,
  5747.             grantee,
  5748.             'DELETE',
  5749.             'NO'
  5750.         from #table_priv1
  5751.         where delete_privilege = 1 and delete_privilege_grant = 0
  5752.  
  5753.     insert into #table_priv2
  5754.         select
  5755.             id,
  5756.             grantor,
  5757.             grantee,
  5758.             'UPDATE',
  5759.             'NO'
  5760.         from #table_priv1
  5761.         where update_privilege = 1 and update_privilege_grant = 0
  5762.  
  5763.     insert into #table_priv2
  5764.         select
  5765.             id,
  5766.             grantor,
  5767.             grantee,
  5768.             'REFERENCES',
  5769.             'NO'
  5770.         from #table_priv1
  5771.         where references_privilege = 1 and references_privilege_grant = 0
  5772.  
  5773.     insert into #table_priv2
  5774.         select
  5775.             id,
  5776.             grantor,
  5777.             grantee,
  5778.             'SELECT',
  5779.             'YES'
  5780.         from #table_priv1
  5781.         where select_privilege_grant = 1
  5782.  
  5783.     insert into #table_priv2
  5784.         select
  5785.             id,
  5786.             grantor,
  5787.             grantee,
  5788.             'INSERT',
  5789.             'YES'
  5790.         from #table_priv1
  5791.         where insert_privilege_grant = 1
  5792.  
  5793.     insert into #table_priv2
  5794.         select
  5795.             id,
  5796.             grantor,
  5797.             grantee,
  5798.             'DELETE',
  5799.             'YES'
  5800.         from #table_priv1
  5801.         where delete_privilege_grant = 1
  5802.  
  5803.     insert into #table_priv2
  5804.         select
  5805.             id,
  5806.             grantor,
  5807.             grantee,
  5808.             'UPDATE',
  5809.             'YES'
  5810.         from #table_priv1
  5811.         where update_privilege_grant = 1
  5812.  
  5813.     insert into #table_priv2
  5814.         select
  5815.             id,
  5816.             grantor,
  5817.             grantee,
  5818.             'REFERENCES',
  5819.             'YES'
  5820.         from #table_priv1
  5821.         where references_privilege_grant = 1
  5822.  
  5823.  
  5824.     select
  5825.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  5826.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  5827.         convert(varchar(32),o.name) TABLE_NAME,
  5828.         convert(varchar(32),user_name(grantor)) GRANTOR,
  5829.         convert(varchar(32),user_name(grantee)) GRANTEE,
  5830.         PRIVILEGE,
  5831.         IS_GRANTABLE
  5832.     from #table_priv2 t, sysobjects o where o.id = t.id
  5833.     order by 2,3,6,5
  5834. go
  5835.  
  5836. if (charindex('6.50', @@version) = 0 and
  5837.     charindex('7.00', @@version) = 0)
  5838. begin
  5839.     print ''
  5840.     print ''
  5841.     print 'Warning:'
  5842.     print 'you are installing the stored procedures '
  5843.     print 'on a pre 6.50 SQL Server.'
  5844.     print 'Ignore the following errors.'
  5845. end
  5846. else
  5847.     drop proc sp_table_privileges
  5848. go
  5849.  
  5850.  
  5851. /*    Procedure for 6.50 server */
  5852. CREATE PROCEDURE sp_table_privileges (
  5853.             @table_name         varchar(96),
  5854.             @table_owner        varchar(96) = null,
  5855.             @table_qualifier    varchar(32) = null)
  5856. as
  5857.  
  5858.     if @table_qualifier is not null
  5859.     begin
  5860.         if db_name() <> @table_qualifier
  5861.         begin    /* If qualifier doesn't match current database */
  5862.             raiserror (15250, -1,-1)
  5863.             return
  5864.         end
  5865.     end
  5866.     if @table_name is null
  5867.         select @table_name = '%'
  5868.     if @table_owner is null /* If no owner supplied, force wildcard */
  5869.         select @table_owner = '%'
  5870.  
  5871.     select
  5872.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  5873.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  5874.         convert(varchar(32),object_name(o.id)) TABLE_NAME,
  5875.         convert(varchar(32),user_name(p.grantor)) GRANTOR,
  5876.         convert(varchar(32),user_name(u.uid)) GRANTEE,
  5877.         convert(varchar(32),case p.action
  5878.              when 193 then 'SELECT'
  5879.              when 195 then 'INSERT'
  5880.              when 196 then 'DELETE'
  5881.              when 197 then 'UPDATE'
  5882.              else 'REFERENCES'
  5883.         end) PRIVILEGE,
  5884.         convert(varchar(3),case when p.protecttype = 205 then 'NO'
  5885.             else 'YES'
  5886.         end) IS_GRANTABLE
  5887.     from sysprotects p, sysobjects o, sysusers u
  5888.     where
  5889.         p.id = o.id
  5890.         and o.type in ('U','V','S')
  5891.         and object_name(o.id) like @table_name
  5892.         and user_name(o.uid) like @table_owner
  5893.             /* expand groups */
  5894.         and ((p.uid = u.uid and u.uid <> u.gid) or
  5895.              (p.uid = u.gid and u.uid <> u.gid))
  5896.         and p.protecttype <> 206    /* only grant rows */
  5897.         and p.action in (26,193,195,196,197)
  5898.         and o.uid <> u.uid            /* no rows for owner */
  5899.         and not exists (            /* exclude revoke'd privileges */
  5900.             select *
  5901.             from sysprotects p1
  5902.             where
  5903.                 p1.protecttype = 206
  5904.                 and p1.action = p.action
  5905.                 and p1.id = p.id
  5906.                 and p1.uid = u.uid)
  5907.     union all
  5908.     select    /*    Add rows for table owner */
  5909.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  5910.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  5911.         convert(varchar(32),object_name(o.id)) TABLE_NAME,
  5912.         convert(varchar(32),user_name(u.uid)) GRANTOR,
  5913.         convert(varchar(32),user_name(o.uid)) GRANTEE,
  5914.         convert(varchar(32),case v.number
  5915.             when 193 then 'SELECT'
  5916.             when 195 then 'INSERT'
  5917.             when 196 then 'DELETE'
  5918.             when 197 then 'UPDATE'
  5919.             else 'REFERENCES'
  5920.         end) PRIVILEGE,
  5921.         convert(varchar(3),'YES') IS_GRANTABLE
  5922.     from sysobjects o, master.dbo.spt_values v, sysusers u
  5923.     where
  5924.         object_name(o.id) like @table_name
  5925.         and o.type in ('U','V','S')
  5926.         and user_name(o.uid) like @table_owner
  5927.         and u.suid = 1        /* grantor is dbo of database */
  5928.         and v.type = 'P'    /* cross product to get all exposed privileges */
  5929.         and v.number in (26,193,195,196,197)
  5930.         and not exists (    /* exclude revoke'd privileges */
  5931.             select *
  5932.             from sysprotects p1
  5933.             where
  5934.                 p1.protecttype = 206
  5935.                 and p1.action = v.number
  5936.                 and p1.id = o.id
  5937.                 and p1.uid = o.uid)
  5938.     order by 2,3,6,5
  5939. go
  5940.  
  5941.  
  5942. if (charindex('7.00', @@version) > 0)
  5943.     drop proc sp_table_privileges
  5944. else
  5945. begin
  5946.     print ''
  5947.     print ''
  5948.     print 'Warning:'
  5949.     print 'you are installing the stored procedures '
  5950.     print 'on a pre 7.0 SQL Server.'
  5951.     print 'Ignore the following errors.'
  5952. end
  5953. go
  5954.  
  5955. /*    Procedure for 7.00 server */
  5956. CREATE PROCEDURE sp_table_privileges (
  5957.             @table_name         nvarchar(384),
  5958.             @table_owner        nvarchar(384) = null,
  5959.             @table_qualifier    sysname = null)
  5960. as
  5961.  
  5962.     if @table_qualifier is not null
  5963.     begin
  5964.         if db_name() <> @table_qualifier
  5965.         begin    /* If qualifier doesn't match current database */
  5966.             raiserror (15250, -1,-1)
  5967.             return
  5968.         end
  5969.     end
  5970.     if @table_name is null
  5971.         select @table_name = '%'
  5972.     if @table_owner is null /* If no owner supplied, force wildcard */
  5973.         select @table_owner = '%'
  5974.  
  5975.     select
  5976.         convert(sysname,db_name()) TABLE_QUALIFIER,
  5977.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  5978.         convert(sysname,object_name(o.id)) TABLE_NAME,
  5979.         convert(sysname,user_name(p.grantor)) GRANTOR,
  5980.         convert(sysname,user_name(u.uid)) GRANTEE,
  5981.         convert(varchar(32),case p.action
  5982.              when 193 then 'SELECT'
  5983.              when 195 then 'INSERT'
  5984.              when 196 then 'DELETE'
  5985.              when 197 then 'UPDATE'
  5986.              else 'REFERENCES'
  5987.         end) PRIVILEGE,
  5988.         convert(varchar(3),case when p.protecttype = 205 then 'NO'
  5989.             else 'YES'
  5990.         end) IS_GRANTABLE
  5991.     from sysprotects p, sysobjects o, sysusers u, sysmembers m
  5992.     where
  5993.         p.id = o.id
  5994.         and o.type in ('U','V','S')
  5995.         and object_name(o.id) like @table_name
  5996.         and user_name(o.uid) like @table_owner
  5997.             /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  5998.         and (u.uid > 0 and u.uid < 16384)
  5999.         and ((p.uid = u.uid) or
  6000.              (p.uid = m.groupuid and u.uid = m.memberuid))
  6001.         and p.protecttype <> 206    /* only grant rows */
  6002.         and p.action in (26,193,195,196,197)
  6003.         and o.uid <> u.uid            /* no rows for owner */
  6004.         and not exists (            /* exclude revoke'd privileges */
  6005.             select *
  6006.             from sysprotects p1
  6007.             where
  6008.                 p1.protecttype = 206
  6009.                 and p1.action = p.action
  6010.                 and p1.id = p.id
  6011.                 and p1.uid = u.uid)
  6012.     union all
  6013.     select    /*    Add rows for table owner */
  6014.         convert(sysname,db_name()) TABLE_QUALIFIER,
  6015.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  6016.         convert(sysname,object_name(o.id)) TABLE_NAME,
  6017.         convert(sysname,user_name(u.uid)) GRANTOR,
  6018.         convert(sysname,user_name(o.uid)) GRANTEE,
  6019.         convert(varchar(32),case v.number
  6020.             when 193 then 'SELECT'
  6021.             when 195 then 'INSERT'
  6022.             when 196 then 'DELETE'
  6023.             when 197 then 'UPDATE'
  6024.             else 'REFERENCES'
  6025.         end) PRIVILEGE,
  6026.         convert(varchar(3),'YES') IS_GRANTABLE
  6027.     from sysobjects o, master.dbo.spt_values v, sysusers u
  6028.     where
  6029.         object_name(o.id) like @table_name
  6030.         and o.type in ('U','V','S')
  6031.         and user_name(o.uid) like @table_owner
  6032.         and u.uid = 1        /* grantor is 'dbo' of database */
  6033.         and v.type = 'P'    /* cross product to get all exposed privileges */
  6034.         and v.number in (26,193,195,196,197)
  6035.         and not exists (    /* exclude revoke'd privileges */
  6036.             select *
  6037.             from sysprotects p1
  6038.             where
  6039.                 p1.protecttype = 206
  6040.                 and p1.action = v.number
  6041.                 and p1.id = o.id
  6042.                 and p1.uid = o.uid)
  6043.     order by 2,3,6,5
  6044. go
  6045.  
  6046. grant execute on sp_table_privileges to public
  6047. go
  6048.  
  6049. dump tran master with no_log
  6050. go
  6051.  
  6052. print 'creating sp_tables'
  6053. go
  6054.  
  6055. /*    Procedure for 6.50 and earlier servers */
  6056. create procedure sp_tables(
  6057.                @table_name        varchar(96)    = null,
  6058.                @table_owner     varchar(96)    = null,
  6059.                @table_qualifier varchar(32)    = null,
  6060.                @table_type        varchar(100) = null)
  6061. as
  6062.     declare @type1 varchar(3)
  6063.     declare @tableindex int
  6064.  
  6065.  
  6066.     /* Special feature #1:    enumerate databases when owner and name
  6067.          are blank but qualifier is explicitly '%'.  */
  6068.     if @table_qualifier = '%' and
  6069.         @table_owner = '' and
  6070.         @table_name = ''
  6071.     begin    /* If enumerating databases */
  6072.         select
  6073.             TABLE_QUALIFIER = convert(varchar(32),d.name),
  6074.             TABLE_OWNER = convert(varchar(32),null),
  6075.             TABLE_NAME = convert(varchar(32),null),
  6076.             TABLE_TYPE = convert(varchar(32),null),
  6077.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6078.         from master.dbo.sysdatabases d
  6079.         where d.name <> 'model'    /* eliminate MODEL database */
  6080.         order by 1
  6081.     end
  6082.  
  6083.     /* Special feature #2:    enumerate owners when qualifier and name
  6084.          are blank but owner is explicitly '%'.  */
  6085.     else if @table_qualifier = '' and
  6086.         @table_owner = '%' and
  6087.         @table_name = ''
  6088.     begin    /* If enumerating owners */
  6089.         select distinct
  6090.             TABLE_QUALIFIER = convert(varchar(32),null),
  6091.             TABLE_OWNER = convert(varchar(32),user_name(uid)),
  6092.             TABLE_NAME = convert(varchar(32),null),
  6093.             TABLE_TYPE = convert(varchar(32),null),
  6094.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6095.         from sysobjects
  6096.         order by 2
  6097.     end
  6098.  
  6099.     /* Special feature #3:    enumerate table types when qualifier, owner and
  6100.          name are blank but table type is explicitly '%'.    */
  6101.     else if @table_qualifier = '' and
  6102.         @table_owner = '' and
  6103.         @table_name = '' and
  6104.         @table_type = '%'
  6105.     begin    /* If enumerating table types */
  6106.         select
  6107.             TABLE_QUALIFIER = convert(varchar(32),null),
  6108.             TABLE_OWNER = convert(varchar(32),null),
  6109.             TABLE_NAME = convert(varchar(32),null),
  6110.             TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE       VIEW',(colid-1)*12+1,12))),
  6111.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6112.         from sysobjects o, syscolumns c
  6113.         where o.id=c.id and o.name='sysusers' and colid<=3
  6114.     end
  6115.  
  6116.     else
  6117.     begin /* end of special features - do normal processing */
  6118.         if @table_qualifier is not null
  6119.         begin
  6120.             if db_name() <> @table_qualifier
  6121.             begin
  6122.                 if @table_qualifier = ''
  6123.                 begin  /* If empty qualifier supplied */
  6124.                     /* Force an empty result set */
  6125.                     select @table_name = ''
  6126.                     select @table_owner = ''
  6127.                 end
  6128.                 else
  6129.                 begin    /* If qualifier doesn't match current database */
  6130.                     raiserror 20001 'Table qualifier must be name of current database'
  6131.                     return
  6132.                 end
  6133.             end
  6134.         end
  6135.         if @table_type is null
  6136.         begin    /* Select all ODBC supported table types */
  6137.             select @type1 = 'SUV'
  6138.         end
  6139.         else
  6140.         begin
  6141.             /*    TableType is case sensitive if CS server */
  6142.             select @type1 = null
  6143.             if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
  6144.                 select @type1 = @type1 + 'S'    /* Add System Tables */
  6145.             if (charindex('''TABLE''',@table_type) <> 0)
  6146.                 select @type1 = @type1 + 'U'    /* Add User Tables */
  6147.             if (charindex('''VIEW''',@table_type) <> 0)
  6148.                 select @type1 = @type1 + 'V'    /* Add Views */
  6149.         end
  6150.         if @table_name is null
  6151.         begin    /*    If table name not supplied, match all */
  6152.             select @table_name = '%'
  6153.         end
  6154.         else
  6155.         begin
  6156.             if (@table_owner is null) and (charindex('%', @table_name) = 0)
  6157.             begin    /* If owner not specified and table is specified */
  6158.                 if exists (select * from sysobjects
  6159.                     where uid = user_id()
  6160.                     and name = @table_name
  6161.                     and (type = 'U' or type = 'V' or type = 'S'))
  6162.                 begin    /* Override supplied owner w/owner of table */
  6163.                     select @table_owner = user_name()
  6164.                 end
  6165.             end
  6166.         end
  6167.         if @table_owner is null /* If no owner supplied, force wildcard */
  6168.             select @table_owner = '%'
  6169.         select
  6170.             TABLE_QUALIFIER = convert(varchar(32),db_name()),
  6171.             TABLE_OWNER = convert(varchar(32),user_name(o.uid)),
  6172.             TABLE_NAME = convert(varchar(32),o.name),    /* make nullable */
  6173.             TABLE_TYPE = convert(varchar(32),rtrim(
  6174.                 substring('SYSTEM TABLE            TABLE       VIEW       ',
  6175.                     (ascii(o.type)-83)*12+1,12))),    /* 'S'=0,'U'=2,'V'=3 */
  6176.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6177.         from sysusers u, sysobjects o
  6178.         where
  6179.             o.name like @table_name
  6180.             and user_name(o.uid) like @table_owner
  6181.             and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
  6182.             and u.uid = user_id() /* constrain sysusers uid for use in subquery */
  6183.             and (
  6184.                 suser_id() = 1     /* User is the System Administrator */
  6185.                 or o.uid = user_id()     /* User created the object */
  6186.                 /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  6187.                 or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  6188.                     from sysprotects p
  6189.                     /* outer join to correlate with all rows in sysobjects */
  6190.                     where p.id =* o.id
  6191.                         /* get rows for public,current user,user's group */
  6192.                         and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
  6193.                         /* check for SELECT,EXECUTE privilege */
  6194.                         and (action in (193,224)))&1     /* more magic...normalize GRANT */
  6195.                     ) = 1    /* final magic...compare Grants      */
  6196.             )
  6197.         order by 4, 1, 2, 3
  6198.     end
  6199. go
  6200.  
  6201. if (charindex('7.00', @@version) > 0)
  6202.     drop procedure sp_tables
  6203. else
  6204. begin
  6205.     print ''
  6206.     print ''
  6207.     print 'Warning:'
  6208.     print 'you are installing the stored procedures '
  6209.     print 'on a pre 7.0 SQL Server.'
  6210.     print 'Ignore the following errors.'
  6211. end
  6212. go
  6213.  
  6214. /*    Procedure for 7.00 server */
  6215. create procedure sp_tables(
  6216.                @table_name        nvarchar(384)    = null,
  6217.                @table_owner     nvarchar(384)    = null,
  6218.                @table_qualifier sysname    = null,
  6219.                @table_type        varchar(100) = null)
  6220. as
  6221.     declare @type1 varchar(3)
  6222.     declare @tableindex int
  6223.  
  6224.  
  6225.     /* Special feature #1:    enumerate databases when owner and name
  6226.          are blank but qualifier is explicitly '%'.  */
  6227.     if @table_qualifier = '%' and
  6228.         @table_owner = '' and
  6229.         @table_name = ''
  6230.     begin    /* If enumerating databases */
  6231.         select
  6232.             TABLE_QUALIFIER = convert(sysname,d.name),
  6233.             TABLE_OWNER = convert(sysname,null),
  6234.             TABLE_NAME = convert(sysname,null),
  6235.             TABLE_TYPE = convert(sysname,null),
  6236.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6237.         from master.dbo.sysdatabases d
  6238.         where d.name <> 'model'    /* eliminate MODEL database */
  6239.         order by 1
  6240.     end
  6241.  
  6242.     /* Special feature #2:    enumerate owners when qualifier and name
  6243.          are blank but owner is explicitly '%'.  */
  6244.     else if @table_qualifier = '' and
  6245.         @table_owner = '%' and
  6246.         @table_name = ''
  6247.     begin    /* If enumerating owners */
  6248.         select distinct
  6249.             TABLE_QUALIFIER = convert(sysname,null),
  6250.             TABLE_OWNER = convert(sysname,user_name(uid)),
  6251.             TABLE_NAME = convert(sysname,null),
  6252.             TABLE_TYPE = convert(sysname,null),
  6253.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6254.         from sysobjects
  6255.         order by 2
  6256.     end
  6257.  
  6258.     /* Special feature #3:    enumerate table types when qualifier, owner and
  6259.          name are blank but table type is explicitly '%'.    */
  6260.     else if @table_qualifier = '' and
  6261.         @table_owner = '' and
  6262.         @table_name = '' and
  6263.         @table_type = '%'
  6264.     begin    /* If enumerating table types */
  6265.         select
  6266.             TABLE_QUALIFIER = convert(sysname,null),
  6267.             TABLE_OWNER = convert(sysname,null),
  6268.             TABLE_NAME = convert(sysname,null),
  6269.             TABLE_TYPE = convert(sysname,rtrim(substring('SYSTEM TABLETABLE       VIEW',(colid-1)*12+1,12))),
  6270.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6271.         from sysobjects o, syscolumns c
  6272.         where o.id=c.id and o.name='sysusers' and colid<=3
  6273.     end
  6274.  
  6275.     else
  6276.     begin /* end of special features - do normal processing */
  6277.         if @table_qualifier is not null
  6278.         begin
  6279.             if db_name() <> @table_qualifier
  6280.             begin
  6281.                 if @table_qualifier = ''
  6282.                 begin  /* If empty qualifier supplied */
  6283.                     /* Force an empty result set */
  6284.                     select @table_name = ''
  6285.                     select @table_owner = ''
  6286.                 end
  6287.                 else
  6288.                 begin    /* If qualifier doesn't match current database */
  6289.                     raiserror (15250, -1,-1)
  6290.                     return
  6291.                 end
  6292.             end
  6293.         end
  6294.         if @table_type is null
  6295.         begin    /* Select all ODBC supported table types */
  6296.             select @type1 = 'SUV'
  6297.         end
  6298.         else
  6299.         begin
  6300.             /*    TableType is case sensitive if CS server */
  6301.             select @type1 = ''
  6302.             if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
  6303.                 select @type1 = @type1 + 'S'    /* Add System Tables */
  6304.             if (charindex('''TABLE''',@table_type) <> 0)
  6305.                 select @type1 = @type1 + 'U'    /* Add User Tables */
  6306.             if (charindex('''VIEW''',@table_type) <> 0)
  6307.                 select @type1 = @type1 + 'V'    /* Add Views */
  6308.         end
  6309.         if @table_name is null
  6310.         begin    /*    If table name not supplied, match all */
  6311.             select @table_name = '%'
  6312.         end
  6313.         else
  6314.         begin
  6315.             if (@table_owner is null) and (charindex('%', @table_name) = 0)
  6316.             begin    /* If owner not specified and table is specified */
  6317.                 if exists (select * from sysobjects
  6318.                     where uid = user_id()
  6319.                     and name = @table_name
  6320.                     and (type = 'U' or type = 'V' or type = 'S'))
  6321.                 begin    /* Override supplied owner w/owner of table */
  6322.                     select @table_owner = user_name()
  6323.                 end
  6324.             end
  6325.         end
  6326.         if @table_owner is null /* If no owner supplied, force wildcard */
  6327.             select @table_owner = '%'
  6328.         select
  6329.             TABLE_QUALIFIER = convert(sysname,db_name()),
  6330.             TABLE_OWNER = convert(sysname,user_name(o.uid)),
  6331.             TABLE_NAME = convert(sysname,o.name),    /* make nullable */
  6332.             TABLE_TYPE = convert(sysname,rtrim(
  6333.                 substring('SYSTEM TABLE            TABLE       VIEW       ',
  6334.                     (ascii(o.type)-83)*12+1,12))),    /* 'S'=0,'U'=2,'V'=3 */
  6335.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  6336.         from sysobjects o
  6337.         where
  6338.             o.name like @table_name
  6339.             and user_name(o.uid) like @table_owner
  6340.             and (o.type in ('U','S') or
  6341.              (o.type = 'V' and ObjectProperty (o.id, 'IsMSShipped') = 0))
  6342.             and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
  6343.             and permissions (o.id)&4096 <> 0
  6344.         order by 4, 1, 2, 3
  6345.     end
  6346. go
  6347.  
  6348.  
  6349. grant execute on sp_tables to public
  6350. go
  6351.  
  6352. dump tran master with no_log
  6353. go
  6354.  
  6355. if (charindex('6.50', @@version) = 0 and
  6356.     charindex('7.00', @@version) = 0)
  6357. begin
  6358.     print ''
  6359.     print ''
  6360.     print 'Warning:'
  6361.     print 'you are installing the stored procedures '
  6362.     print 'on a pre 6.50 SQL Server.'
  6363.     print 'Ignore the following errors.'
  6364. end
  6365.  
  6366. print 'creating sp_ddopen'
  6367. go
  6368.  
  6369. /*    Procedure for pre-7.00 server */
  6370. create procedure sp_ddopen(
  6371.                @handle            int output,
  6372.                @procname        sysname,
  6373.                @scrollopt        int output,
  6374.                @ccopt            int output,
  6375.                @rows            int output,
  6376.                @p1                varchar(255) = null,
  6377.                @p2                varchar(255) = null,
  6378.                @p3                varchar(255) = null,
  6379.                @p4                varchar(255) = null,
  6380.                @p5                varchar(255) = null,
  6381.                @p6                varchar(255) = null,
  6382.                @p7                int = null,
  6383.                @ODBCVer         int = 2)
  6384. as
  6385.     declare @ret int
  6386.  
  6387.     if @procname = 'sp_column_privileges'
  6388.     begin
  6389.         create table #spcolpriv (
  6390.             TABLE_QUALIFIER varchar(32) null,
  6391.             TABLE_OWNER varchar(32) null,
  6392.             TABLE_NAME varchar(32)    not null,
  6393.             COLUMN_NAME varchar(32) not null,
  6394.             GRANTOR varchar(32) null,
  6395.             GRANTEE varchar(32) not null,
  6396.             PRIVILEGE varchar(32) not null,
  6397.             IS_GRANTABLE varchar(3) null
  6398.             )
  6399.         insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
  6400.         exec @ret = sp_cursoropen @handle output,
  6401.             'select * from #spcolpriv',
  6402.             @scrollopt output, @ccopt output, @rows output
  6403.         drop table #spcolpriv
  6404.     end
  6405.     else if @procname = 'sp_columns'
  6406.     begin
  6407.         create table #spcolumns (
  6408.             TABLE_QUALIFIER varchar(32) null,
  6409.             TABLE_OWNER varchar(32) null,
  6410.             TABLE_NAME varchar(32)    not null,
  6411.             COLUMN_NAME varchar(32) not null,
  6412.             DATA_TYPE smallint not null,
  6413.             TYPE_NAME varchar(32) not null,
  6414.             "PRECISION" int null,
  6415.             LENGTH int null,
  6416.             SCALE smallint null,
  6417.             RADIX smallint null,
  6418.             NULLABLE smallint not null,
  6419.             REMARKS varchar(254) null,
  6420.             COLUMN_DEF varchar(255) null,
  6421.             SQL_DATA_TYPE smallint not null,
  6422.             SQL_DATETIME_SUB smallint null,
  6423.             CHAR_OCTET_LENGTH int null,
  6424.             ORDINAL_POSITION int not null,
  6425.             IS_NULLABLE varchar(254) null,
  6426.             SS_DATA_TYPE tinyint null
  6427.             )
  6428.         insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
  6429.         exec @ret = sp_cursoropen @handle output,
  6430.             'select * from #spcolumns',
  6431.             @scrollopt output, @ccopt output, @rows output
  6432.         drop table #spcolumns
  6433.     end
  6434.     else if @procname = 'sp_datatype_info'
  6435.     begin
  6436.         create table #spdatatypeinfo (
  6437.             TYPE_NAME            varchar(32)  not null,
  6438.             DATA_TYPE            smallint not null,
  6439.             "PRECISION"            int null,
  6440.             LITERAL_PREFIX        varchar(32)    null,
  6441.             LITERAL_SUFFIX        varchar(32)    null,
  6442.             CREATE_PARAMS        varchar(32)    null,
  6443.             NULLABLE            smallint   not null,
  6444.             CASE_SENSITIVE        smallint   not null,
  6445.             SEARCHABLE            smallint   not null,
  6446.             UNSIGNED_ATTRIBUTE    smallint   null,
  6447.             MONEY    smallint    not null,
  6448.             AUTO_INCREMENT        smallint    null,
  6449.             LOCAL_TYPE_NAME     varchar(32) null,
  6450.             MINIMUM_SCALE        smallint     null,
  6451.             MAXIMUM_SCALE        smallint   null,
  6452.             SQL_DATA_TYPE        smallint      not null,
  6453.             SQL_DATETIME_SUB    smallint   null,
  6454.             NUM_PREC_RADIX        int     null,
  6455.             INTERVAL_PRECISION    smallint    NULL,
  6456.             USERTYPE            smallint not null)
  6457.         insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
  6458.         exec @ret = sp_cursoropen @handle output,
  6459.             'select * from #spdatatypeinfo',
  6460.             @scrollopt output, @ccopt output, @rows output
  6461.         drop table #spdatatypeinfo
  6462.     end
  6463.     else if @procname = 'sp_fkeys'
  6464.     begin
  6465.         create table #spfkeys (
  6466.             PKTABLE_QUALIFIER varchar(32)     null,
  6467.             PKTABLE_OWNER varchar(32)    null,
  6468.             PKTABLE_NAME varchar(32)  not null,
  6469.             PKCOLUMN_NAME varchar(32)    not null,
  6470.             FKTABLE_QUALIFIER varchar(32)    null,
  6471.             FKTABLE_OWNER varchar(32)    null,
  6472.             FKTABLE_NAME varchar(32)  not null,
  6473.             FKCOLUMN_NAME varchar(32)    not null,
  6474.             KEY_SEQ smallint not null,
  6475.             UPDATE_RULE smallint null,
  6476.             DELETE_RULE smallint null,
  6477.             FK_NAME varchar(32) null,
  6478.             PK_NAME varchar(32) null,
  6479.             DEFERRABILITY smallint null
  6480.             )
  6481.         insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
  6482.         exec @ret = sp_cursoropen @handle output,
  6483.             'select * from #spfkeys',
  6484.             @scrollopt output, @ccopt output, @rows output
  6485.         drop table #spfkeys
  6486.     end
  6487.     else if @procname = 'sp_pkeys'
  6488.     begin
  6489.         create table #sppkeys (
  6490.             TABLE_QUALIFIER varchar(32)   null,
  6491.             TABLE_OWNER varchar(32)   null,
  6492.             TABLE_NAME varchar(32)    not null,
  6493.             COLUMN_NAME varchar(32)  not null,
  6494.             KEY_SEQ smallint not null,
  6495.             PK_NAME varchar(32) null
  6496.             )
  6497.         insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
  6498.         exec @ret = sp_cursoropen @handle output,
  6499.             'select * from #sppkeys',
  6500.             @scrollopt output, @ccopt output, @rows output
  6501.         drop table #sppkeys
  6502.     end
  6503.     else if @procname = 'sp_special_columns'
  6504.     begin
  6505.         create table #spspeccol (
  6506.             SCOPE smallint null,
  6507.             COLUMN_NAME varchar(32) not null,
  6508.             DATA_TYPE smallint not null,
  6509.             TYPE_NAME varchar(32) not null,
  6510.             "PRECISION" int null,
  6511.             LENGTH int null,
  6512.             SCALE smallint null,
  6513.             PSEUDO_COLUMN smallint null
  6514.             )
  6515.         insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
  6516.         exec @ret = sp_cursoropen @handle output,
  6517.             'select * from #spspeccol',
  6518.             @scrollopt output, @ccopt output, @rows output
  6519.         drop table #spspeccol
  6520.     end
  6521.     else if @procname = 'sp_sproc_columns'
  6522.     begin
  6523.         create table #spproccol (
  6524.             PROCEDURE_QUALIFIER varchar(32)  null,
  6525.             PROCEDURE_OWNER varchar(32)  null,
  6526.             PROCEDURE_NAME varchar(32)    not null,
  6527.             COLUMN_NAME varchar(32) not null,
  6528.             COLUMN_TYPE smallint not null,
  6529.             DATA_TYPE smallint not null,
  6530.             TYPE_NAME varchar(32) not null,
  6531.             "PRECISION" int null,
  6532.             LENGTH int null,
  6533.             SCALE smallint null,
  6534.             RADIX smallint null,
  6535.             NULLABLE smallint not null,
  6536.             REMARKS varchar(254) null,
  6537.             COLUMN_DEF varchar(255) null,
  6538.             SQL_DATA_TYPE smallint not null,
  6539.             SQL_DATETIME_SUB smallint null,
  6540.             CHAR_OCTET_LENGTH int null,
  6541.             ORDINAL_POSITION int not null,
  6542.             IS_NULLABLE varchar(254) null,
  6543.             SS_DATA_TYPE tinyint null
  6544.             )
  6545.         insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
  6546.         exec @ret = sp_cursoropen @handle output,
  6547.             'select * from #spproccol',
  6548.             @scrollopt output, @ccopt output, @rows output
  6549.         drop table #spproccol
  6550.     end
  6551.     else if @procname = 'sp_statistics'
  6552.     begin
  6553.         create table #spstatistics (
  6554.             TABLE_QUALIFIER varchar(32)   null,
  6555.             TABLE_OWNER varchar(32)   null,
  6556.             TABLE_NAME varchar(32)    not null,
  6557.             NON_UNIQUE smallint null,
  6558.             INDEX_QUALIFIER varchar(32) null,
  6559.             INDEX_NAME varchar(32)    null,
  6560.             TYPE smallint not null,
  6561.             SEQ_IN_INDEX smallint null,
  6562.             COLUMN_NAME varchar(32) null,
  6563.             COLLATION char(1) null,
  6564.             CARDINALITY int null,
  6565.             PAGES int null,
  6566.             FILTER_CONDITION varchar(128) null
  6567.             )
  6568.         insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
  6569.         exec @ret = sp_cursoropen @handle output,
  6570.             'select * from #spstatistics',
  6571.             @scrollopt output, @ccopt output, @rows output
  6572.         drop table #spstatistics
  6573.     end
  6574.     else if @procname = 'sp_stored_procedures'
  6575.     begin
  6576.         create table #spprocedures (
  6577.             PROCEDURE_QUALIFIER varchar(32)  null,
  6578.             PROCEDURE_OWNER varchar(32)  null,
  6579.             PROCEDURE_NAME varchar(32)    not null,
  6580.             NUM_INPUT_PARAMS int null,
  6581.             NUM_OUTPUT_PARAMS int null,
  6582.             NUM_RESULT_SETS int null,
  6583.             REMARKS varchar(254) null,
  6584.             PROCEDURE_TYPE smallint null
  6585.             )
  6586.         insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
  6587.         exec @ret = sp_cursoropen @handle output,
  6588.             'select * from #spprocedures',
  6589.             @scrollopt output, @ccopt output, @rows output
  6590.         drop table #spprocedures
  6591.     end
  6592.     else if @procname = 'sp_table_privileges'
  6593.     begin
  6594.         create table #sptabpriv (
  6595.             TABLE_QUALIFIER varchar(32) null,
  6596.             TABLE_OWNER varchar(32) null,
  6597.             TABLE_NAME varchar(32)    not null,
  6598.             GRANTOR varchar(32) null,
  6599.             GRANTEE varchar(32) not null,
  6600.             PRIVILEGE varchar(32) not null,
  6601.             IS_GRANTABLE varchar(3) null
  6602.             )
  6603.         insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
  6604.         exec @ret = sp_cursoropen @handle output,
  6605.             'select * from #sptabpriv',
  6606.             @scrollopt output, @ccopt output, @rows output
  6607.         drop table #sptabpriv
  6608.     end
  6609.     else if @procname = 'sp_tables'
  6610.     begin
  6611.         create table #sptables (
  6612.             TABLE_QUALIFIER varchar(32) null,
  6613.             TABLE_OWNER varchar(32) null,
  6614.             TABLE_NAME varchar(32)    null,
  6615.             TABLE_TYPE     varchar(32) null,
  6616.             REMARKS varchar(254) null)
  6617.         insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
  6618.         exec @ret = sp_cursoropen @handle output,
  6619.             'select * from #sptables',
  6620.             @scrollopt output, @ccopt output, @rows output
  6621.         drop table #sptables
  6622.     end
  6623.     select @ret = isnull(@ret,0)
  6624.     return isnull(@ret,0)
  6625. go
  6626.  
  6627. if (charindex('7.00', @@version) > 0)
  6628.     drop procedure sp_ddopen
  6629. else
  6630. begin
  6631.     print ''
  6632.     print ''
  6633.     print 'Warning:'
  6634.     print 'you are installing the stored procedures '
  6635.     print 'on a pre 7.0 SQL Server.'
  6636.     print 'Ignore the following errors.'
  6637. end
  6638. go
  6639.  
  6640. /*    Procedure for 7.00 server */
  6641. create procedure sp_ddopen(
  6642.                @handle            int output,
  6643.                @procname        sysname,
  6644.                @scrollopt        int output,
  6645.                @ccopt            int output,
  6646.                @rows            int output,
  6647.                @p1                nvarchar(774) = null,
  6648.                @p2                nvarchar(774) = null,
  6649.                @p3                nvarchar(774) = null,
  6650.                @p4                nvarchar(774) = null,
  6651.                @p5                nvarchar(774) = null,
  6652.                @p6                nvarchar(774) = null,
  6653.                @p7                int = null,
  6654.                @ODBCVer         int = 2)
  6655. as
  6656.     declare @ret int
  6657.  
  6658.     if @procname = 'sp_column_privileges'
  6659.     begin
  6660.         create table #spcolpriv (
  6661.             TABLE_QUALIFIER sysname null,
  6662.             TABLE_OWNER sysname null,
  6663.             TABLE_NAME sysname not null,
  6664.             COLUMN_NAME sysname not null,
  6665.             GRANTOR sysname null,
  6666.             GRANTEE sysname not null,
  6667.             PRIVILEGE varchar(32) not null,
  6668.             IS_GRANTABLE varchar(3) null
  6669.             )
  6670.         insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
  6671.         exec @ret = sp_cursoropen @handle output,
  6672.             'select * from #spcolpriv',
  6673.             @scrollopt output, @ccopt output, @rows output
  6674.         drop table #spcolpriv
  6675.     end
  6676.     else if @procname = 'sp_columns'
  6677.     begin
  6678.         create table #spcolumns (
  6679.             TABLE_QUALIFIER sysname null,
  6680.             TABLE_OWNER sysname null,
  6681.             TABLE_NAME sysname not null,
  6682.             COLUMN_NAME sysname not null,
  6683.             DATA_TYPE smallint not null,
  6684.             TYPE_NAME sysname not null,
  6685.             "PRECISION" int null,
  6686.             LENGTH int null,
  6687.             SCALE smallint null,
  6688.             RADIX smallint null,
  6689.             NULLABLE smallint not null,
  6690.             REMARKS varchar(254) null,
  6691.             COLUMN_DEF nvarchar(3000) null,
  6692.             SQL_DATA_TYPE smallint not null,
  6693.             SQL_DATETIME_SUB smallint null,
  6694.             CHAR_OCTET_LENGTH int null,
  6695.             ORDINAL_POSITION int not null,
  6696.             IS_NULLABLE varchar(254) null,
  6697.             SS_DATA_TYPE tinyint null
  6698.             )
  6699.         insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
  6700.         exec @ret = sp_cursoropen @handle output,
  6701.             'select * from #spcolumns',
  6702.             @scrollopt output, @ccopt output, @rows output
  6703.         drop table #spcolumns
  6704.     end
  6705.     else if @procname = 'sp_datatype_info'
  6706.     begin
  6707.         create table #spdatatypeinfo (
  6708.             TYPE_NAME            sysname  not null,
  6709.             DATA_TYPE            smallint not null,
  6710.             "PRECISION"            int null,
  6711.             LITERAL_PREFIX        varchar(32)    null,
  6712.             LITERAL_SUFFIX        varchar(32)    null,
  6713.             CREATE_PARAMS        varchar(32)    null,
  6714.             NULLABLE            smallint   not null,
  6715.             CASE_SENSITIVE        smallint   not null,
  6716.             SEARCHABLE            smallint   not null,
  6717.             UNSIGNED_ATTRIBUTE    smallint   null,
  6718.             MONEY    smallint    not null,
  6719.             AUTO_INCREMENT        smallint    null,
  6720.             LOCAL_TYPE_NAME     sysname null,
  6721.             MINIMUM_SCALE        smallint     null,
  6722.             MAXIMUM_SCALE        smallint   null,
  6723.             SQL_DATA_TYPE        smallint      not null,
  6724.             SQL_DATETIME_SUB    smallint   null,
  6725.             NUM_PREC_RADIX        int     null,
  6726.             INTERVAL_PRECISION    smallint    NULL,
  6727.             USERTYPE            smallint not null)
  6728.         insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
  6729.         exec @ret = sp_cursoropen @handle output,
  6730.             'select * from #spdatatypeinfo',
  6731.             @scrollopt output, @ccopt output, @rows output
  6732.         drop table #spdatatypeinfo
  6733.     end
  6734.     else if @procname = 'sp_fkeys'
  6735.     begin
  6736.         create table #spfkeys (
  6737.             PKTABLE_QUALIFIER sysname     null,
  6738.             PKTABLE_OWNER sysname    null,
  6739.             PKTABLE_NAME sysname  not null,
  6740.             PKCOLUMN_NAME sysname  not null,
  6741.             FKTABLE_QUALIFIER sysname    null,
  6742.             FKTABLE_OWNER sysname    null,
  6743.             FKTABLE_NAME sysname  not null,
  6744.             FKCOLUMN_NAME sysname  not null,
  6745.             KEY_SEQ smallint not null,
  6746.             UPDATE_RULE smallint null,
  6747.             DELETE_RULE smallint null,
  6748.             FK_NAME sysname null,
  6749.             PK_NAME sysname null,
  6750.             DEFERRABILITY smallint null
  6751.             )
  6752.         insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
  6753.         exec @ret = sp_cursoropen @handle output,
  6754.             'select * from #spfkeys',
  6755.             @scrollopt output, @ccopt output, @rows output
  6756.         drop table #spfkeys
  6757.     end
  6758.     else if @procname = 'sp_pkeys'
  6759.     begin
  6760.         create table #sppkeys (
  6761.             TABLE_QUALIFIER sysname   null,
  6762.             TABLE_OWNER sysname   null,
  6763.             TABLE_NAME sysname    not null,
  6764.             COLUMN_NAME sysname  not null,
  6765.             KEY_SEQ smallint not null,
  6766.             PK_NAME sysname null
  6767.             )
  6768.         insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
  6769.         exec @ret = sp_cursoropen @handle output,
  6770.             'select * from #sppkeys',
  6771.             @scrollopt output, @ccopt output, @rows output
  6772.         drop table #sppkeys
  6773.     end
  6774.     else if @procname = 'sp_special_columns'
  6775.     begin
  6776.         create table #spspeccol (
  6777.             SCOPE smallint null,
  6778.             COLUMN_NAME sysname not null,
  6779.             DATA_TYPE smallint not null,
  6780.             TYPE_NAME sysname not null,
  6781.             "PRECISION" int null,
  6782.             LENGTH int null,
  6783.             SCALE smallint null,
  6784.             PSEUDO_COLUMN smallint null
  6785.             )
  6786.         insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
  6787.         exec @ret = sp_cursoropen @handle output,
  6788.             'select * from #spspeccol',
  6789.             @scrollopt output, @ccopt output, @rows output
  6790.         drop table #spspeccol
  6791.     end
  6792.     else if @procname = 'sp_sproc_columns'
  6793.     begin
  6794.         create table #spproccol (
  6795.             PROCEDURE_QUALIFIER sysname  null,
  6796.             PROCEDURE_OWNER sysname  null,
  6797.             PROCEDURE_NAME sysname not null,
  6798.             COLUMN_NAME sysname not null,
  6799.             COLUMN_TYPE smallint not null,
  6800.             DATA_TYPE smallint not null,
  6801.             TYPE_NAME sysname not null,
  6802.             "PRECISION" int null,
  6803.             LENGTH int null,
  6804.             SCALE smallint null,
  6805.             RADIX smallint null,
  6806.             NULLABLE smallint not null,
  6807.             REMARKS varchar(254) null,
  6808.             COLUMN_DEF nvarchar(3000) null,
  6809.             SQL_DATA_TYPE smallint not null,
  6810.             SQL_DATETIME_SUB smallint null,
  6811.             CHAR_OCTET_LENGTH int null,
  6812.             ORDINAL_POSITION int not null,
  6813.             IS_NULLABLE varchar(254) null,
  6814.             SS_DATA_TYPE tinyint null
  6815.             )
  6816.         insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
  6817.         exec @ret = sp_cursoropen @handle output,
  6818.             'select * from #spproccol',
  6819.             @scrollopt output, @ccopt output, @rows output
  6820.         drop table #spproccol
  6821.     end
  6822.     else if @procname = 'sp_statistics'
  6823.     begin
  6824.         create table #spstatistics (
  6825.             TABLE_QUALIFIER sysname   null,
  6826.             TABLE_OWNER sysname   null,
  6827.             TABLE_NAME sysname    not null,
  6828.             NON_UNIQUE smallint null,
  6829.             INDEX_QUALIFIER sysname null,
  6830.             INDEX_NAME sysname null,
  6831.             TYPE smallint not null,
  6832.             SEQ_IN_INDEX smallint null,
  6833.             COLUMN_NAME sysname null,
  6834.             COLLATION char(1) null,
  6835.             CARDINALITY int null,
  6836.             PAGES int null,
  6837.             FILTER_CONDITION varchar(128) null
  6838.             )
  6839.         insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
  6840.         exec @ret = sp_cursoropen @handle output,
  6841.             'select * from #spstatistics',
  6842.             @scrollopt output, @ccopt output, @rows output
  6843.         drop table #spstatistics
  6844.     end
  6845.     else if @procname = 'sp_stored_procedures'
  6846.     begin
  6847.         create table #spprocedures (
  6848.             PROCEDURE_QUALIFIER sysname  null,
  6849.             PROCEDURE_OWNER sysname  null,
  6850.             PROCEDURE_NAME sysname not null,
  6851.             NUM_INPUT_PARAMS int null,
  6852.             NUM_OUTPUT_PARAMS int null,
  6853.             NUM_RESULT_SETS int null,
  6854.             REMARKS varchar(254) null,
  6855.             PROCEDURE_TYPE smallint null
  6856.             )
  6857.         insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
  6858.         exec @ret = sp_cursoropen @handle output,
  6859.             'select * from #spprocedures',
  6860.             @scrollopt output, @ccopt output, @rows output
  6861.         drop table #spprocedures
  6862.     end
  6863.     else if @procname = 'sp_table_privileges'
  6864.     begin
  6865.         create table #sptabpriv (
  6866.             TABLE_QUALIFIER sysname null,
  6867.             TABLE_OWNER sysname null,
  6868.             TABLE_NAME sysname not null,
  6869.             GRANTOR sysname null,
  6870.             GRANTEE sysname not null,
  6871.             PRIVILEGE varchar(32) not null,
  6872.             IS_GRANTABLE varchar(3) null
  6873.             )
  6874.         insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
  6875.         exec @ret = sp_cursoropen @handle output,
  6876.             'select * from #sptabpriv',
  6877.             @scrollopt output, @ccopt output, @rows output
  6878.         drop table #sptabpriv
  6879.     end
  6880.     else if @procname = 'sp_tables'
  6881.     begin
  6882.         create table #sptables (
  6883.             TABLE_QUALIFIER sysname null,
  6884.             TABLE_OWNER sysname null,
  6885.             TABLE_NAME sysname null,
  6886.             TABLE_TYPE    sysname null,
  6887.             REMARKS varchar(254) null)
  6888.         insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
  6889.         exec @ret = sp_cursoropen @handle output,
  6890.             'select * from #sptables',
  6891.             @scrollopt output, @ccopt output, @rows output
  6892.         drop table #sptables
  6893.     end
  6894.     select @ret = isnull(@ret,0)
  6895.     return isnull(@ret,0)
  6896. go
  6897.  
  6898. grant execute on sp_ddopen to public
  6899. go
  6900.  
  6901. dump tran master with no_log
  6902. go
  6903.  
  6904. print ''
  6905. print 'creating spt_provider_types'
  6906. go
  6907. if (charindex('7.00', @@version) = 0)
  6908. begin /* Pre 7.00 Server */
  6909. create table spt_provider_types
  6910.     (
  6911.     ss_dtype        tinyint     not null,
  6912.     fixlen            int         null,        /* datatype len for variable, else null */
  6913.     type_name        sysname        not null,
  6914.     oledb_data_type        smallint    not null,
  6915.     best_match        bit        not null,
  6916.     is_nullable        tinyint        null,
  6917.     case_sensitive        bit        not null,
  6918.     fixed_prec_scale    bit        not null,
  6919.     is_long            bit        not null,
  6920.     auto_unique_value    tinyint        not null,
  6921.     data_precision        int         null,
  6922.     numeric_scale        smallint    null,        /* min scale if 6.0 */
  6923.     column_size        int         null,
  6924.     literal_prefix        varchar(32)    null,
  6925.     literal_suffix        varchar(32)     null,
  6926.     searchable        int        not null,
  6927.     unsigned_attribute    tinyint        null,
  6928.     local_type_name     sysname        null
  6929.     )
  6930. print ''
  6931. print ''
  6932. print 'Warning:'
  6933. print 'you are installing the stored procedures '
  6934. print 'on a pre 7.0 SQL Server.'
  6935. print 'Ignore the following errors.'
  6936. end
  6937. go
  6938. if (charindex('7.00', @@version) > 0)
  6939. begin /* 7.00 server*/
  6940. create table spt_provider_types
  6941.     (
  6942.     ss_dtype        tinyint     not null,
  6943.     fixlen            int         null,        /* datatype len for variable, else null */
  6944.     type_name        sysname        not null,
  6945.     oledb_data_type        smallint    not null,
  6946.     best_match        bit        not null,
  6947.     is_nullable        bit        null,
  6948.     case_sensitive        bit        not null,
  6949.     fixed_prec_scale    bit        not null,
  6950.     is_long            bit        not null,
  6951.     auto_unique_value    tinyint        not null,
  6952.     data_precision        int         null,
  6953.     numeric_scale        smallint    null,        /* min scale if 6.0 */
  6954.     column_size        int         null,
  6955.     literal_prefix        nvarchar(32)    null,
  6956.     literal_suffix        nvarchar(32)     null,
  6957.     searchable        int        not null,
  6958.     unsigned_attribute    tinyint        null,
  6959.     local_type_name     sysname        null
  6960.     )
  6961. end
  6962. go
  6963.  
  6964. grant select on spt_provider_types to public
  6965. go
  6966.  
  6967. /*
  6968. ** Insert the spt_provider_types rows for DBTYTPE_STR data types
  6969. */
  6970. begin tran
  6971.  
  6972. /* Get case sensitivity */
  6973. declare @case_sensitive bit
  6974. select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
  6975. /* Local Char */
  6976. insert into spt_provider_types values
  6977.     (
  6978.     47 /*SQLCHARACTER*/,        /* ss_dtype */
  6979.     0,                /* fixlen */
  6980.     'char',                /* type_name */
  6981.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  6982.     0,                /* best_match */
  6983.     null,                /* is_nullable */
  6984.     @case_sensitive,        /* case_sensitive */
  6985.     0,                /* fixed_prec_scale */
  6986.     0,                /* is_long */
  6987.     0,                /* auto_unique_value */
  6988.     null,                /* data_precision */
  6989.     null,                /* numeric_scale */
  6990.     null,                /* column_size */
  6991.     '''',                /* literal_prefix */
  6992.     '''',                /* literal_suffix */
  6993.     4 /*DB_SEARCHABLE*/,        /* searchable */
  6994.     null,                /* unsigned_attribute */
  6995.     'char'                /* local_type_name */
  6996.     )
  6997.  
  6998. /* Local Varchar */
  6999. insert into spt_provider_types values
  7000.     (
  7001.     39 /*SQLVARCHAR*/,        /* ss_dtype */
  7002.     null,                /* fixlen */
  7003.     'varchar',            /* type_name */
  7004.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  7005.     1,                /* best_match */
  7006.     null,                /* is_nullable */
  7007.     @case_sensitive,        /* case_sensitive */
  7008.     0,                /* fixed_prec_scale */
  7009.     0,                /* is_long */
  7010.     0,                /* auto_unique_value */
  7011.     null,                /* data_precision */
  7012.     null,                /* numeric_scale */
  7013.     null,                /* column_size */
  7014.     '''',                /* literal_prefix */
  7015.     '''',                /* literal_suffix */
  7016.     4 /*DB_SEARCHABLE*/,        /* searchable */
  7017.     null,                /* unsigned_attribute */
  7018.     'varchar'            /* local_type_name */
  7019.     )
  7020.  
  7021. /* Local Text */
  7022. insert into spt_provider_types values
  7023.     (
  7024.     35  /*SQLTEXT*/,        /* ss_dtype */
  7025.     null,                /* fixlen */
  7026.     'text',                /* type_name */
  7027.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  7028.     0,                /* best_match */
  7029.     null,                /* is_nullable */
  7030.     @case_sensitive,        /* case_sensitive */
  7031.     0,                /* fixed_prec_scale */
  7032.     1,                /* is_long */
  7033.     0,                /* auto_unique_value */
  7034.     null,                /* data_precision */
  7035.     null,                /* numeric_scale */
  7036.     2147483647,            /* column_size */
  7037.     '''',                /* literal_prefix */
  7038.     '''',                /* literal_suffix */
  7039.     2 /*DB_LIKE_ONLY*/,        /* searchable */
  7040.     null,                /* unsigned_attribute */
  7041.     'text'                /* local_type_name */
  7042.     )
  7043. commit tran
  7044. go
  7045.  
  7046. /*
  7047. ** Insert the spt_provider_types rows for DBTYTPE_BYTES data types
  7048. */
  7049. begin tran
  7050. /* Local Binary */
  7051. insert into spt_provider_types values
  7052.     (
  7053.     45 /*SQLBINARY*/,        /* ss_dtype */
  7054.     0,                /* fixlen */
  7055.     'binary',            /* type_name */
  7056.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  7057.     0,                /* best_match */
  7058.     null,                /* is_nullable */
  7059.     0,                /* case_sensitive */
  7060.     0,                /* fixed_prec_scale */
  7061.     0,                /* is_long */
  7062.     0,                /* auto_unique_value */
  7063.     null,                /* data_precision */
  7064.     null,                /* numeric_scale */
  7065.     null,                /* column_size */
  7066.     '0x',                /* literal_prefix */
  7067.     null,                /* literal_suffix */
  7068.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7069.     null,                /* unsigned_attribute */
  7070.     'binary'            /* local_type_name */
  7071.     )
  7072.  
  7073. /* Local Varbinary */
  7074. insert into spt_provider_types values
  7075.     (
  7076.     37 /*SQLVARBINARY*/,        /* ss_dtype */
  7077.     null,                /* fixlen */
  7078.     'varbinary',            /* type_name */
  7079.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  7080.     1,                /* best_match */
  7081.     null,                /* is_nullable */
  7082.     0,                /* case_sensitive */
  7083.     0,                /* fixed_prec_scale */
  7084.     0,                /* is_long */
  7085.     0,                /* auto_unique_value */
  7086.     null,                /* data_precision */
  7087.     null,                /* numeric_scale */
  7088.     null,                /* column_size */
  7089.     '0x',                /* literal_prefix */
  7090.     null,                /* literal_suffix */
  7091.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7092.     null,                /* unsigned_attribute */
  7093.     'varbinary'            /* local_type_name */
  7094.     )
  7095.  
  7096. /* Local Image */
  7097. insert into spt_provider_types values
  7098.     (
  7099.     34 /*SQLIMAGE*/,        /* ss_dtype */
  7100.     null,                /* fixlen */
  7101.     'image',            /* type_name */
  7102.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  7103.     0,                /* best_match */
  7104.     null,                /* is_nullable */
  7105.     0,                /* case_sensitive */
  7106.     0,                /* fixed_prec_scale */
  7107.     1,                /* is_long */
  7108.     0,                /* auto_unique_value */
  7109.     null,                /* data_precision */
  7110.     null,                /* numeric_scale */
  7111.     2147483647,            /* column_size */
  7112.     '0x',                /* literal_prefix */
  7113.     null,                /* literal_suffix */
  7114.     1 /*DB_UNSEARCHABLE*/,        /* searchable */
  7115.     null,                /* unsigned_attribute */
  7116.     'image'                /* local_type_name */
  7117.     )
  7118.  
  7119. commit tran
  7120. go
  7121.  
  7122. /*
  7123. ** Insert the spt_provider_types rows for DBTYPE_DBTIMESTAMP data types
  7124. */
  7125. begin tran
  7126.  
  7127. /* Local Datetime */
  7128. insert into spt_provider_types values
  7129.     (
  7130.     61 /*SQLDATETIME*/,        /* ss_dtype */
  7131.     8,                /* fixlen */
  7132.     'datetime',            /* type_name */
  7133.     135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  7134.     1,                /* best_match */
  7135.     null,                /* is_nullable */
  7136.     0,                /* case_sensitive */
  7137.     0,                /* fixed_prec_scale */
  7138.     0,                /* is_long */
  7139.     0,                /* auto_unique_value */
  7140.     23,                /* data_precision */
  7141.     null,                /* numeric_scale */
  7142.     null,                /* column_size */
  7143.     '''',                /* literal_prefix */
  7144.     '''',                /* literal_suffix */
  7145.     4 /*DB_SEARCHABLE*/,        /* searchable */
  7146.     null,                /* unsigned_attribute */
  7147.     'datetime'            /* local_type_name */
  7148.     )
  7149.  
  7150. /* Local Smalldatetime */
  7151. insert into spt_provider_types values
  7152.     (
  7153.     58 /*SQLDATETIM4*/,        /* ss_dtype */
  7154.     4,                /* fixlen */
  7155.     'smalldatetime',        /* type_name */
  7156.     135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  7157.     0,                /* best_match */
  7158.     null,                /* is_nullable */
  7159.     0,                /* case_sensitive */
  7160.     0,                /* fixed_prec_scale */
  7161.     0,                /* is_long */
  7162.     0,                /* auto_unique_value */
  7163.     16,                /* data_precision */
  7164.     null,                /* numeric_scale */
  7165.     null,                /* column_size */
  7166.     '''',                /* literal_prefix */
  7167.     '''',                /* literal_suffix */
  7168.     4 /*DB_SEARCHABLE*/,        /* searchable */
  7169.     null,                /* unsigned_attribute */
  7170.     'smalldatetime'            /* local_type_name */
  7171.     )
  7172.  
  7173. if (charindex('7.00', @@version) = 0)
  7174.     begin    /*    Add nullable type for non-Sphinx server */
  7175.     
  7176.     /* Local Datetimn */
  7177.     insert into spt_provider_types values
  7178.         (
  7179.         111 /*SQLDATETIMN*/,        /* ss_dtype */
  7180.         4,                /* fixlen */
  7181.         'smalldatetime',        /* type_name */
  7182.         135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  7183.         0,                /* best_match */
  7184.         null,                /* is_nullable */
  7185.         0,                /* case_sensitive */
  7186.         0,                /* fixed_prec_scale */
  7187.         0,                /* is_long */
  7188.         0,                /* auto_unique_value */
  7189.         16,                /* data_precision */
  7190.         null,                /* numeric_scale */
  7191.         null,                /* column_size */
  7192.         '''',                /* literal_prefix */
  7193.         '''',                /* literal_suffix */
  7194.         4 /*DB_SEARCHABLE*/,        /* searchable */
  7195.         null,                /* unsigned_attribute */
  7196.         'smalldatetime'            /* local_type_name */
  7197.         )    
  7198.     insert into spt_provider_types values
  7199.         (
  7200.         111 /*SQLDATETIMN*/,        /* ss_dtype */
  7201.         8,                /* fixlen */
  7202.         'datetime',            /* type_name */
  7203.         135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  7204.         0,                /* best_match */
  7205.         null,                /* is_nullable */
  7206.         0,                /* case_sensitive */
  7207.         0,                /* fixed_prec_scale */
  7208.         0,                /* is_long */
  7209.         0,                /* auto_unique_value */
  7210.         23,                /* data_precision */
  7211.         null,                /* numeric_scale */
  7212.         null,                /* column_size */
  7213.         '''',                /* literal_prefix */
  7214.         '''',                /* literal_suffix */
  7215.         4 /*DB_SEARCHABLE*/,        /* searchable */
  7216.         null,                /* unsigned_attribute */
  7217.         'datetime'            /* local_type_name */
  7218.         )
  7219.     end
  7220.  
  7221. commit tran
  7222. go
  7223.  
  7224. /*
  7225. ** Insert the spt_provider_types rows for DBTYPE_CY data types
  7226. */
  7227. begin tran
  7228.  
  7229. /* Local Smallmoney */
  7230. insert into spt_provider_types values
  7231.     (
  7232.     122 /*SQLMONEY4*/,        /* ss_dtype */
  7233.     4,                /* fixlen */
  7234.     'smallmoney',            /* type_name */
  7235.     6 /*DBTYPE_CY*/,        /* oledb_data_type */
  7236.     0,                /* best_match */
  7237.     null,                /* is_nullable */
  7238.     0,                /* case_sensitive */
  7239.     1,                /* fixed_prec_scale */
  7240.     0,                /* is_long */
  7241.     0,                /* auto_unique_value */
  7242.     10,                /* data_precision */
  7243.     null,                /* numeric_scale */
  7244.     null,                /* column_size */
  7245.     '$',                /* literal_prefix */
  7246.     null,                /* literal_suffix */
  7247.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7248.     0,                /* unsigned_attribute */
  7249.     'smallmoney'            /* local_type_name */
  7250.     )    
  7251.     
  7252. /* Local Money */
  7253. insert into spt_provider_types values
  7254.     (
  7255.     60 /*SQLMONEY*/,        /* ss_dtype */
  7256.     8,                /* fixlen */
  7257.     'money',            /* type_name */
  7258.     6 /*DBTYPE_CY*/,        /* oledb_data_type */
  7259.     1,                /* best_match */
  7260.     null,                /* is_nullable */
  7261.     0,                /* case_sensitive */
  7262.     1,                /* fixed_prec_scale */
  7263.     0,                /* is_long */
  7264.     0,                /* auto_unique_value */
  7265.     19,                /* data_precision */
  7266.     null,                /* numeric_scale */
  7267.     null,                /* column_size */
  7268.     '$',                /* literal_prefix */
  7269.     null,                /* literal_suffix */
  7270.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7271.     0,                /* unsigned_attribute */
  7272.     'money'                /* local_type_name */
  7273.     )    
  7274.  
  7275. if (charindex('7.00', @@version) = 0)
  7276.     begin    /*    Add nullable type for non-Sphinx server */
  7277.  
  7278.     /* Local Moneyn */
  7279.     insert into spt_provider_types values
  7280.         (
  7281.         110 /*SQLMONEYN*/,    /* ss_dtype */
  7282.         4,            /* fixlen */
  7283.         'smallmoney',        /* type_name */
  7284.         6 /*DBTYPE_CY*/,    /* oledb_data_type */
  7285.         0,            /* best_match */
  7286.         null,            /* is_nullable */
  7287.         0,            /* case_sensitive */
  7288.         1,            /* fixed_prec_scale */
  7289.         0,            /* is_long */
  7290.         0,            /* auto_unique_value */
  7291.         10,            /* data_precision */
  7292.         null,            /* numeric_scale */
  7293.         null,            /* column_size */
  7294.         '$',            /* literal_prefix */
  7295.         null,            /* literal_suffix */
  7296.         3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
  7297.         0,            /* unsigned_attribute */
  7298.         'smallmoney'        /* local_type_name */
  7299.         )    
  7300.     insert into spt_provider_types values
  7301.         (
  7302.         110 /*SQLMONEYN*/,    /* ss_dtype */
  7303.         8,            /* fixlen */
  7304.         'money',        /* type_name */
  7305.         6 /*DBTYPE_CY*/,    /* oledb_data_type */
  7306.         0,            /* best_match */
  7307.         null,            /* is_nullable */
  7308.         0,            /* case_sensitive */
  7309.         1,            /* fixed_prec_scale */
  7310.         0,            /* is_long */
  7311.         0,            /* auto_unique_value */
  7312.         19,            /* data_precision */
  7313.         null,            /* numeric_scale */
  7314.         null,            /* column_size */
  7315.         '$',            /* literal_prefix */
  7316.         null,            /* literal_suffix */
  7317.         3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
  7318.         null,            /* unsigned_attribute */
  7319.         'money'            /* local_type_name */
  7320.         )    
  7321.     end
  7322.  
  7323. commit tran
  7324. go
  7325.  
  7326. /*
  7327. ** Insert the spt_provider_types rows for the numeric data types
  7328. */
  7329. begin tran
  7330.  
  7331. /* Local Float */
  7332. insert into spt_provider_types values
  7333.     (
  7334.     62 /*SQLFLT8*/,            /* ss_dtype */
  7335.     8,                /* fixlen */
  7336.     'float',            /* type_name */
  7337.     5 /*DBTYPE_R8*/,        /* oledb_data_type */
  7338.     1,                /* best_match */
  7339.     null,                /* is_nullable */
  7340.     0,                /* case_sensitive */
  7341.     0,                /* fixed_prec_scale */
  7342.     0,                /* is_long */
  7343.     0,                /* auto_unique_value */
  7344.     15,                /* data_precision */
  7345.     null,                /* numeric_scale */
  7346.     null,                /* column_size */
  7347.     null,                /* literal_prefix */
  7348.     null,                /* literal_suffix */
  7349.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7350.     0,                /* unsigned_attribute */
  7351.     'float'                /* local_type_name */
  7352.     )    
  7353.  
  7354. /* Local Real */
  7355. insert into spt_provider_types values
  7356.     (
  7357.     59 /*SQLFLT4*/,            /* ss_dtype */
  7358.     4,                /* fixlen */
  7359.     'real',                /* type_name */
  7360.     4 /*DBTYPE_R4*/,        /* oledb_data_type */
  7361.     1,                /* best_match */
  7362.     null,                /* is_nullable */
  7363.     0,                /* case_sensitive */
  7364.     0,                /* fixed_prec_scale */
  7365.     0,                /* is_long */
  7366.     0,                /* auto_unique_value */
  7367.     7,                /* data_precision */
  7368.     null,                /* numeric_scale */
  7369.     null,                /* column_size */
  7370.     null,                /* literal_prefix */
  7371.     null,                /* literal_suffix */
  7372.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7373.     0,                /* unsigned_attribute */
  7374.     'real'                /* local_type_name */
  7375.     )    
  7376.  
  7377. /* Local Int */
  7378. insert into spt_provider_types values
  7379.     (
  7380.     56 /*SQLINT4*/,            /* ss_dtype */
  7381.     4,                /* fixlen */
  7382.     'int',                /* type_name */
  7383.     3 /*DBTYPE_I4*/,        /* oledb_data_type */
  7384.     1,                /* best_match */
  7385.     null,                /* is_nullable */
  7386.     0,                /* case_sensitive */
  7387.     1,                /* fixed_prec_scale */
  7388.     0,                /* is_long */
  7389.     1,                /* auto_unique_value */
  7390.     10,                /* data_precision */
  7391.     null,                /* numeric_scale */
  7392.     null,                /* column_size */
  7393.     null,                /* literal_prefix */
  7394.     null,                /* literal_suffix */
  7395.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7396.     0,                /* unsigned_attribute */
  7397.     'int'                /* local_type_name */
  7398.     )    
  7399.  
  7400. /* Local Smallint */
  7401. insert into spt_provider_types values
  7402.     (
  7403.     52 /*SQLINT2*/,            /* ss_dtype */
  7404.     2,                /* fixlen */
  7405.     'smallint',            /* type_name */
  7406.     2 /*DBTYPE_I2*/,        /* oledb_data_type */
  7407.     1,                /* best_match */
  7408.     null,                /* is_nullable */
  7409.     0,                /* case_sensitive */
  7410.     1,                /* fixed_prec_scale */
  7411.     0,                /* is_long */
  7412.     1,                /* auto_unique_value */
  7413.     5,                /* data_precision */
  7414.     null,                /* numeric_scale */
  7415.     null,                /* column_size */
  7416.     null,                /* literal_prefix */
  7417.     null,                /* literal_suffix */
  7418.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7419.     0,                /* unsigned_attribute */
  7420.     'smallint'            /* local_type_name */
  7421.     )    
  7422.  
  7423. /* Local Tinyint */
  7424. insert into spt_provider_types values
  7425.     (
  7426.     48 /*SQLINT1*/,            /* ss_dtype */
  7427.     1,                /* fixlen */
  7428.     'tinyint',            /* type_name */
  7429.     17 /*DBTYPE_UI1*/,        /* oledb_data_type */
  7430.     1,                /* best_match */
  7431.     null,                /* is_nullable */
  7432.     0,                /* case_sensitive */
  7433.     1,                /* fixed_prec_scale */
  7434.     0,                /* is_long */
  7435.     1,                /* auto_unique_value */
  7436.     3,                /* data_precision */
  7437.     null,                /* numeric_scale */
  7438.     null,                /* column_size */
  7439.     null,                /* literal_prefix */
  7440.     null,                /* literal_suffix */
  7441.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7442.     1,                /* unsigned_attribute */
  7443.     'tinyint'            /* local_type_name */
  7444.     )    
  7445. commit tran
  7446. go
  7447. begin tran    
  7448. if (charindex('6.00', @@version) > 0 or
  7449.     charindex('6.50', @@version) > 0 or
  7450.     charindex('7.00', @@version) > 0)
  7451.     begin    /*    Add 6.0 data types */
  7452.     
  7453.     /* Local Decimal */
  7454.     insert into spt_provider_types values
  7455.         (
  7456.         55 /*SQLDECIMAL*/,        /* ss_dtype */
  7457.         0,                /* fixlen */
  7458.         'decimal',            /* type_name */
  7459.         131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  7460.         0,                /* best_match */
  7461.         null,                /* is_nullable */
  7462.         0,                /* case_sensitive */
  7463.         1,                /* fixed_prec_scale */
  7464.         0,                /* is_long */
  7465.         1,                /* auto_unique_value */
  7466.         28,                /* data_precision */
  7467.         null,                /* numeric_scale */
  7468.         null,                /* column_size */
  7469.         null,                /* literal_prefix */
  7470.         null,                /* literal_suffix */
  7471.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7472.         0,                /* unsigned_attribute */
  7473.         'decimal'            /* local_type_name */
  7474.         )    
  7475.  
  7476.     /* Local Numeric */
  7477.     insert into spt_provider_types values
  7478.         (
  7479.         63 /*SQLNUMERIC*/,        /* ss_dtype */
  7480.         0,                /* fixlen */
  7481.         'numeric',            /* type_name */
  7482.         131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  7483.         1,                /* best_match */
  7484.         null,                /* is_nullable */
  7485.         0,                /* case_sensitive */
  7486.         1,                /* fixed_prec_scale */
  7487.         0,                /* is_long */
  7488.         1,                /* auto_unique_value */
  7489.         28,                /* data_precision */
  7490.         null,                /* numeric_scale */
  7491.         null,                /* column_size */
  7492.         null,                /* literal_prefix */
  7493.         null,                /* literal_suffix */
  7494.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7495.         0,                /* unsigned_attribute */
  7496.         'numeric'            /* local_type_name */
  7497.         )    
  7498.     end
  7499. commit tran
  7500. go
  7501. begin tran
  7502. if (charindex('7.00', @@version) = 0)
  7503.     begin    /*    Add nullable type for non-Sphinx server */
  7504.     
  7505.     /* Local Floatn */
  7506.     insert into spt_provider_types values
  7507.         (
  7508.         109 /*SQLFLTN*/,        /* ss_dtype */
  7509.         8,                /* fixlen */
  7510.         'float',            /* type_name */
  7511.         5 /*DBTYPE_R8*/,        /* oledb_data_type */
  7512.         0,                /* best_match */
  7513.         null,                /* is_nullable */
  7514.         0,                /* case_sensitive */
  7515.         0,                /* fixed_prec_scale */
  7516.         0,                /* is_long */
  7517.         0,                /* auto_unique_value */
  7518.         15,                /* data_precision */
  7519.         null,                /* numeric_scale */
  7520.         null,                /* column_size */
  7521.         null,                /* literal_prefix */
  7522.         null,                /* literal_suffix */
  7523.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7524.         null,                /* unsigned_attribute */
  7525.         'float'                /* local_type_name */
  7526.         )    
  7527.     insert into spt_provider_types values
  7528.         (
  7529.         109 /*SQLFLT4*/,        /* ss_dtype */
  7530.         4,                /* fixlen */
  7531.         'real',                /* type_name */
  7532.         4 /*DBTYPE_R4*/,        /* oledb_data_type */
  7533.         0,                /* best_match */
  7534.         null,                /* is_nullable */
  7535.         0,                /* case_sensitive */
  7536.         0,                /* fixed_prec_scale */
  7537.         0,                /* is_long */
  7538.         0,                /* auto_unique_value */
  7539.         7,                /* data_precision */
  7540.         null,                /* numeric_scale */
  7541.         null,                /* column_size */
  7542.         null,                /* literal_prefix */
  7543.         null,                /* literal_suffix */
  7544.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7545.         null,                /* unsigned_attribute */
  7546.         'real'                /* local_type_name */
  7547.         )    
  7548.  
  7549.     /* Local Intn */
  7550.     insert into spt_provider_types values
  7551.         (
  7552.         38 /*SQLINTN*/,            /* ss_dtype */
  7553.         4,                /* fixlen */
  7554.         'int',                /* type_name */
  7555.         3 /*DBTYPE_I4*/,        /* oledb_data_type */
  7556.         1,                /* best_match */
  7557.         null,                /* is_nullable */
  7558.         0,                /* case_sensitive */
  7559.         1,                /* fixed_prec_scale */
  7560.         0,                /* is_long */
  7561.         1,                /* auto_unique_value */
  7562.         10,                /* data_precision */
  7563.         null,                /* numeric_scale */
  7564.         null,                /* column_size */
  7565.         null,                /* literal_prefix */
  7566.         null,                /* literal_suffix */
  7567.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7568.         0,                /* unsigned_attribute */
  7569.         'int'                /* local_type_name */
  7570.         )    
  7571.     insert into spt_provider_types values
  7572.         (
  7573.         38 /*SQLINTN*/,            /* ss_dtype */
  7574.         2,                /* fixlen */
  7575.         'smallint',            /* type_name */
  7576.         2 /*DBTYPE_I2*/,        /* oledb_data_type */
  7577.         0,                /* best_match */
  7578.         null,                /* is_nullable */
  7579.         0,                /* case_sensitive */
  7580.         1,                /* fixed_prec_scale */
  7581.         0,                /* is_long */
  7582.         1,                /* auto_unique_value */
  7583.         5,                /* data_precision */
  7584.         null,                /* numeric_scale */
  7585.         null,                /* column_size */
  7586.         null,                /* literal_prefix */
  7587.         null,                /* literal_suffix */
  7588.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7589.         0,                /* unsigned_attribute */
  7590.         'smallint'            /* local_type_name */
  7591.         )    
  7592.     insert into spt_provider_types values
  7593.         (
  7594.         38 /*SQLINTN*/,            /* ss_dtype */
  7595.         1,                /* fixlen */
  7596.         'tinyint',            /* type_name */
  7597.         17 /*DBTYPE_UI1*/,        /* oledb_data_type */
  7598.         0,                /* best_match */
  7599.         null,                /* is_nullable */
  7600.         0,                /* case_sensitive */
  7601.         1,                /* fixed_prec_scale */
  7602.         0,                /* is_long */
  7603.         1,                /* auto_unique_value */
  7604.         3,                /* data_precision */
  7605.         null,                /* numeric_scale */
  7606.         null,                /* column_size */
  7607.         null,                /* literal_prefix */
  7608.         null,                /* literal_suffix */
  7609.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7610.         1,                /* unsigned_attribute */
  7611.         'tinyint'            /* local_type_name */
  7612.         )    
  7613.  
  7614.     if (charindex('6.00', @@version) > 0 or    charindex('6.50', @@version) > 0)
  7615.         begin    /*    Add 6.0 data types */
  7616.         
  7617.         /* Local Decimaln */
  7618.         insert into spt_provider_types values
  7619.             (
  7620.             106 /*SQLDECIMALN*/,        /* ss_dtype */
  7621.             0,                /* fixlen */
  7622.             'decimal',            /* type_name */
  7623.             131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  7624.             0,                /* best_match */
  7625.             null,                /* is_nullable */
  7626.             0,                /* case_sensitive */
  7627.             1,                /* fixed_prec_scale */
  7628.             0,                /* is_long */
  7629.             1,                /* auto_unique_value */
  7630.             28,                /* data_precision */
  7631.             null,                /* numeric_scale */
  7632.             null,                /* column_size */
  7633.             null,                /* literal_prefix */
  7634.             null,                /* literal_suffix */
  7635.             3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7636.             0,                /* unsigned_attribute */
  7637.             'decimal'            /* local_type_name */
  7638.             )    
  7639.  
  7640.         /* Local Numericn */
  7641.         insert into spt_provider_types values
  7642.             (
  7643.             108 /*SQLNUMERICN*/,        /* ss_dtype */
  7644.             0,                /* fixlen */
  7645.             'numeric',            /* type_name */
  7646.             131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  7647.             0,                /* best_match */
  7648.             null,                /* is_nullable */
  7649.             0,                /* case_sensitive */
  7650.             1,                /* fixed_prec_scale */
  7651.             0,                /* is_long */
  7652.             1,                /* auto_unique_value */
  7653.             28,                /* data_precision */
  7654.             null,                /* numeric_scale */
  7655.             null,                /* column_size */
  7656.             null,                /* literal_prefix */
  7657.             null,                /* literal_suffix */
  7658.             3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7659.             0,                /* unsigned_attribute */
  7660.             'numeric'            /* local_type_name */
  7661.             )    
  7662.         end
  7663.     end
  7664. commit tran
  7665. go
  7666.  
  7667. /*
  7668. **    Remaining data types
  7669. */
  7670. if (charindex('7.00', @@version) = 0)
  7671. begin
  7672.     print ''
  7673.     print ''
  7674.     print 'Warning:'
  7675.     print 'you are installing the stored procedures '
  7676.     print 'on a pre 7.0 SQL Server.'
  7677.     print 'Ignore the following errors.'
  7678. end
  7679. go
  7680. begin tran
  7681.  
  7682. if (charindex('7.00', @@version) > 0)
  7683.     begin
  7684.     /* Local Bit */
  7685.     insert into spt_provider_types values
  7686.         (
  7687.         50 /*SQLBIT*/,            /* ss_dtype */
  7688.         0,                /* fixlen */
  7689.         'bit',                /* type_name */
  7690.         11 /*DBTYPE_BOOL*/,        /* oledb_data_type */
  7691.         1,                /* best_match */
  7692.         null,                /* is_nullable */
  7693.         0,                /* case_sensitive */
  7694.         0,                /* fixed_prec_scale */
  7695.         0,                /* is_long */
  7696.         0,                /* auto_unique_value */
  7697.         1,                /* data_precision */
  7698.         null,                /* numeric_scale */
  7699.         null,                /* column_size */
  7700.         null,                /* literal_prefix */
  7701.         null,                /* literal_suffix */
  7702.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7703.         null,                /* unsigned_attribute */
  7704.         'bit'                /* local_type_name */
  7705.         )        
  7706.     
  7707.     /* Local Timestamp */
  7708.     insert into spt_provider_types values
  7709.         (
  7710.         0,                /* ss_dtype */
  7711.         8,                /* fixlen */
  7712.         'timestamp',            /* type_name */
  7713.         128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  7714.         0,                /* best_match */
  7715.         null,                /* is_nullable */
  7716.         0,                /* case_sensitive */
  7717.         0,                /* fixed_prec_scale */
  7718.         0,                /* is_long */
  7719.         0,                /* auto_unique_value */
  7720.         null,                /* data_precision */
  7721.         null,                /* numeric_scale */
  7722.         null,                /* column_size */
  7723.         '0x',                /* literal_prefix */
  7724.         null,                /* literal_suffix */
  7725.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7726.         null,                /* unsigned_attribute */
  7727.         'timestamp'            /* local_type_name */
  7728.         )    
  7729.     /* Local GUID */
  7730.     insert into spt_provider_types values
  7731.         (
  7732.         0,                /* ss_dtype */
  7733.         16,                /* fixlen */
  7734.         'uniqueidentifier',        /* type_name */
  7735.         72 /*DBTYPE_GUID*/,        /* oledb_data_type */
  7736.         1,                /* best_match */
  7737.         null,                /* is_nullable */
  7738.         0,                /* case_sensitive */
  7739.         0,                /* fixed_prec_scale */
  7740.         0,                /* is_long */
  7741.         0,                /* auto_unique_value */
  7742.         null,                /* data_precision */
  7743.         null,                /* numeric_scale */
  7744.         null,                /* column_size */
  7745.         '''',                /* literal_prefix */
  7746.         '''',                /* literal_suffix */
  7747.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7748.         null,                /* unsigned_attribute */
  7749.         'uniqueidentifier'        /* local_type_name */
  7750.         )    
  7751.     
  7752.     /* Get case sensitivity */
  7753.     declare @case_sensitive bit
  7754.     select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
  7755.  
  7756.     /* Local NChar */
  7757.     insert into spt_provider_types values
  7758.         (
  7759.         0,                /* ss_dtype */
  7760.         0,                /* fixlen */
  7761.         'nchar',            /* type_name */
  7762.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  7763.         0,                /* best_match */
  7764.         null,                /* is_nullable */
  7765.         @case_sensitive,        /* case_sensitive */
  7766.         0,                /* fixed_prec_scale */
  7767.         0,                /* is_long */
  7768.         0,                /* auto_unique_value */
  7769.         null,                /* data_precision */
  7770.         null,                /* numeric_scale */
  7771.         null,                /* column_size */
  7772.         '''',                /* literal_prefix */
  7773.         '''',                /* literal_suffix */
  7774.         4 /*DB_SEARCHABLE*/,        /* searchable */
  7775.         null,                /* unsigned_attribute */
  7776.         'nchar'                /* local_type_name */
  7777.         )    
  7778.  
  7779.     /* Local NVarChar */
  7780.     insert into spt_provider_types values
  7781.         (
  7782.         0,                /* ss_dtype */
  7783.         null,                /* fixlen */
  7784.         'nvarchar',            /* type_name */
  7785.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  7786.         1,                /* best_match */
  7787.         null,                /* is_nullable */
  7788.         @case_sensitive,        /* case_sensitive */
  7789.         0,                /* fixed_prec_scale */
  7790.         0,                /* is_long */
  7791.         0,                /* auto_unique_value */
  7792.         null,                /* data_precision */
  7793.         null,                /* numeric_scale */
  7794.         null,                /* column_size */
  7795.         '''',                /* literal_prefix */
  7796.         '''',                /* literal_suffix */
  7797.         4 /*DB_SEARCHABLE*/,        /* searchable */
  7798.         null,                /* unsigned_attribute */
  7799.         'nvarchar'            /* local_type_name */
  7800.         )    
  7801.  
  7802.     /* Local NText */
  7803.     insert into spt_provider_types values
  7804.         (
  7805.         0,                /* ss_dtype */
  7806.         null,                /* fixlen */
  7807.         'ntext',            /* type_name */
  7808.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  7809.         0,                /* best_match */
  7810.         null,                /* is_nullable */
  7811.         @case_sensitive,        /* case_sensitive */
  7812.         0,                /* fixed_prec_scale */
  7813.         1,                /* is_long */
  7814.         0,                /* auto_unique_value */
  7815.         null,                /* data_precision */
  7816.         null,                /* numeric_scale */
  7817.         1073741823,            /* column_size */
  7818.         '''',                /* literal_prefix */
  7819.         '''',                /* literal_suffix */
  7820.         2 /*DB_LIKE_ONLY*/,        /* searchable */
  7821.         null,                /* unsigned_attribute */
  7822.         'ntext'                /* local_type_name */
  7823.         )    
  7824.  
  7825.     /* data types changed in Sphinx: DO AFTER ALL TYPES INSERTED! */    
  7826.     update spt_provider_types set ss_dtype = (select xtype from systypes    where type_name like name+'%')
  7827.  
  7828.     end
  7829. commit tran
  7830. go
  7831. begin tran
  7832. if (charindex('7.00', @@version) = 0)
  7833.     begin
  7834.     /* Local Bit */
  7835.     insert into spt_provider_types values
  7836.         (
  7837.         50 /*SQLBIT*/,            /* ss_dtype */
  7838.         0,                /* fixlen */
  7839.         'bit',                /* type_name */
  7840.         11 /*DBTYPE_BOOL*/,        /* oledb_data_type */
  7841.         1,                /* best_match */
  7842.         0,                /* is_nullable */
  7843.         0,                /* case_sensitive */
  7844.         0,                /* fixed_prec_scale */
  7845.         0,                /* is_long */
  7846.         0,                /* auto_unique_value */
  7847.         1,                /* data_precision */
  7848.         null,                /* numeric_scale */
  7849.         null,                /* column_size */
  7850.         null,                /* literal_prefix */
  7851.         null,                /* literal_suffix */
  7852.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7853.         null,                /* unsigned_attribute */
  7854.         'bit'                /* local_type_name */
  7855.         )    
  7856.  
  7857.     /* Local Timestamp */
  7858.     insert into spt_provider_types values
  7859.         (
  7860.         45 /*SQLBINARY*/,        /* ss_dtype */
  7861.         8,                /* fixlen */
  7862.         'timestamp',            /* type_name */
  7863.         128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  7864.         0,                /* best_match */
  7865.         null,                /* is_nullable */
  7866.         0,                /* case_sensitive */
  7867.         0,                /* fixed_prec_scale */
  7868.         0,                /* is_long */
  7869.         0,                /* auto_unique_value */
  7870.         null,                /* data_precision */
  7871.         null,                /* numeric_scale */
  7872.         null,                /* column_size */
  7873.         '0x',                /* literal_prefix */
  7874.         null,                /* literal_suffix */
  7875.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  7876.         null,                /* unsigned_attribute */
  7877.         'timestamp'            /* local_type_name */
  7878.         )        
  7879. end
  7880.  
  7881. commit tran
  7882. go
  7883.  
  7884. create unique clustered index datatypeinfoclust on spt_provider_types(ss_dtype,fixlen)
  7885. go
  7886.  
  7887. dump tran master with no_log
  7888. go
  7889.  
  7890. print ''
  7891. print 'creating sp_catalogs_rowset'
  7892. go
  7893.  
  7894. create procedure sp_catalogs_rowset
  7895.     (
  7896.     @catalog_name        varchar(255)
  7897.     )        
  7898. as
  7899.     select
  7900.         CATALOG_NAME    = name,
  7901.         DESCRIPTION    = convert(varchar(1),null)
  7902.     from     master.dbo.sysdatabases
  7903.     where    name = @catalog_name
  7904. go
  7905. create procedure sp_catalogs_rowset;2
  7906.     (
  7907.     @dummy        int /* remove when Hydra bug 17032 is fixed */
  7908.     )
  7909. as
  7910.     select
  7911.         CATALOG_NAME    = name,
  7912.         DESCRIPTION    = convert(varchar(1),null)
  7913.     from     master.dbo.sysdatabases
  7914.     order by 1
  7915. go
  7916.  
  7917. if (charindex('7.00', @@version) = 0)
  7918. begin
  7919.     print ''
  7920.     print ''
  7921.     print 'Warning:'
  7922.     print 'you are installing the stored procedures '
  7923.     print 'on a pre 7.0 SQL Server.'
  7924.     print 'Ignore the following errors.'
  7925. end
  7926. else
  7927.     drop proc sp_catalogs_rowset
  7928. go
  7929.  
  7930. /*    Procedure for 7.0 server */
  7931. create procedure sp_catalogs_rowset
  7932.     (
  7933.     @catalog_name        sysname
  7934.     )        
  7935. as
  7936.     select
  7937.         CATALOG_NAME    = name,
  7938.         DESCRIPTION    = convert(nvarchar(1),null)
  7939.     from     master.dbo.sysdatabases
  7940.     where    name = @catalog_name
  7941. go
  7942. create procedure sp_catalogs_rowset;2
  7943.     (
  7944.     @dummy        int /* remove when Hydra bug 17032 is fixed */
  7945.     )
  7946. as
  7947.     select
  7948.         CATALOG_NAME    = name,
  7949.         DESCRIPTION    = convert(nvarchar(1),null)
  7950.     from     master.dbo.sysdatabases
  7951.     order by 1
  7952. go
  7953. create procedure sp_catalogs_rowset;5
  7954.     (
  7955.     @server_name    sysname,
  7956.     @catalog_name    sysname = NULL
  7957.     )
  7958. as
  7959.     select    CATALOG_NAME,
  7960.         DESCRIPTION
  7961.     from master.dbo.SYSREMOTE_CATALOGS < @server_name, @catalog_name >
  7962.     order by 1
  7963. go
  7964.  
  7965. grant execute on sp_catalogs_rowset to public
  7966. go
  7967.  
  7968. dump tran master with no_log
  7969. go
  7970.  
  7971.  
  7972. print ''
  7973. print 'creating sp_column_privileges_rowset'
  7974. go
  7975.  
  7976. /*    Procedure for 6.0 and 6.5 server */
  7977. CREATE PROCEDURE sp_column_privileges_rowset
  7978.     (
  7979.     @table_name     varchar(255) = null,
  7980.     @table_schema    varchar(255) = null,
  7981.     @column_name    varchar(255) = null,
  7982.     @grantor    varchar(255) = null,
  7983.     @grantee    varchar(255) = null
  7984.     )
  7985. as
  7986. IF @table_name is not null
  7987.     BEGIN
  7988.     select
  7989.         GRANTOR        = user_name(p.grantor),
  7990.         GRANTEE        = user_name(u.uid),
  7991.         TABLE_CATALOG    = db_name(),
  7992.         TABLE_SCHEMA    = user_name(o.uid),
  7993.         TABLE_NAME    = o.name,
  7994.         COLUMN_NAME    = c.name,
  7995.         COLUMN_GUID    = convert(binary(16),null),
  7996.         COLUMN_PROPID    = convert(int,null),
  7997.         PRIVILEGE_TYPE    = convert(varchar(30),
  7998.                     case p.action
  7999.                     when 193 then 'SELECT'
  8000.                     when 195 then 'INSERT'
  8001.                     when 197 then 'UPDATE'
  8002.                     else 'REFERENCES'
  8003.                     end),
  8004.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8005.     from 
  8006.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  8007.     where
  8008.         o.name = @table_name
  8009.     and     o.type in ('U','V','S')
  8010.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8011.     and    c.id = o.id
  8012.     and     (@column_name is null or @column_name = c.name)
  8013.     and     c.id = p.id
  8014.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8015.     and     case 
  8016.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8017.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8018.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8019.             end & v.high <> 0            /* permission applies to this column */
  8020.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8021.     and     v.type = 'P'
  8022.     and     v.number = c.colid
  8023.     and    (@grantee is null or @grantee = user_name(u.uid))
  8024.             /* expand groups */
  8025.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  8026.     and     p.protecttype <> 206    /* only grant rows */
  8027.     and     p.action in (26,193,195,197)
  8028.     and     o.uid <> u.uid            /* no rows for owner */
  8029.     and     not exists (            /* exclude revoke'd privileges */
  8030.             select *
  8031.             from sysprotects p1
  8032.             where
  8033.                 p1.protecttype = 206
  8034.             and     p1.action = p.action
  8035.             and     p1.id = p.id
  8036.             and     p1.uid = u.uid
  8037.             and     case 
  8038.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8039.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8040.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8041.                 end & v.high <> 0)            /* permission applies to this column */
  8042.     union all
  8043.     select    /*    Add rows for table owner */
  8044.         GRANTOR        = user_name(u.uid),
  8045.         GRANTEE        = user_name(o.uid),
  8046.         TABLE_CATALOG    = db_name(),
  8047.         TABLE_SCHEMA    = user_name(o.uid),
  8048.         TABLE_NAME    = o.name,
  8049.         COLUMN_NAME    = c.name,
  8050.         COLUMN_GUID    = convert(binary(16),null),
  8051.         COLUMN_PROPID    = convert(int,null),
  8052.         PRIVILEGE_TYPE    = convert(varchar(30),
  8053.                     case v.number
  8054.                     when 193 then 'SELECT'
  8055.                     when 195 then 'INSERT'
  8056.                     when 197 then 'UPDATE'
  8057.                     else 'REFERENCES'
  8058.                     end),
  8059.         IS_GRANTABLE    = convert(bit,1)    
  8060.     from 
  8061.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8062.     where
  8063.         o.name = @table_name
  8064.     and     o.type in ('U','V','S')
  8065.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8066.     and    (@grantee is null or @grantee = user_name(o.uid))
  8067.     and    c.id = o.id
  8068.     and     (@column_name is null or @column_name = c.name)
  8069.     and     u.suid = 1        /* grantor is dbo of database */
  8070.     and    (@grantor is null or @grantor = user_name(u.uid))
  8071.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8072.     and     v.number in (26,193,195,197)
  8073.     and     not exists (        /* exclude revoke'd privileges */
  8074.             select *
  8075.             from     sysprotects p1
  8076.             where    p1.protecttype = 206
  8077.             and     p1.action = v.number
  8078.             and     p1.id = o.id
  8079.             and     p1.uid = o.uid)
  8080.     order by 4, 5, 6, 9, 1, 2
  8081.     END
  8082. ELSE
  8083.     BEGIN
  8084.     select
  8085.         GRANTOR        = user_name(p.grantor),
  8086.         GRANTEE        = user_name(u.uid),
  8087.         TABLE_CATALOG    = db_name(),
  8088.         TABLE_SCHEMA    = user_name(o.uid),
  8089.         TABLE_NAME    = o.name,
  8090.         COLUMN_NAME    = c.name,
  8091.         COLUMN_GUID    = convert(binary(16),null),
  8092.         COLUMN_PROPID    = convert(int,null),
  8093.         PRIVILEGE_TYPE    = convert(varchar(30),
  8094.                     case p.action
  8095.                     when 193 then 'SELECT'
  8096.                     when 195 then 'INSERT'
  8097.                     when 197 then 'UPDATE'
  8098.                     else 'REFERENCES'
  8099.                     end),
  8100.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8101.     from 
  8102.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  8103.     where
  8104.         o.type in ('U','V','S')
  8105.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8106.     and    c.id = o.id
  8107.     and     (@column_name is null or @column_name = c.name)
  8108.     and     c.id = p.id
  8109.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8110.     and     case 
  8111.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8112.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8113.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8114.             end & v.high <> 0            /* permission applies to this column */
  8115.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8116.     and     v.type = 'P'
  8117.     and     v.number = c.colid
  8118.     and    (@grantee is null or @grantee = user_name(u.uid))
  8119.             /* expand groups */
  8120.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  8121.     and     p.protecttype <> 206    /* only grant rows */
  8122.     and     p.action in (26,193,195,197)
  8123.     and     o.uid <> u.uid            /* no rows for owner */
  8124.     and     not exists (            /* exclude revoke'd privileges */
  8125.             select *
  8126.             from sysprotects p1
  8127.             where
  8128.                 p1.protecttype = 206
  8129.             and     p1.action = p.action
  8130.             and     p1.id = p.id
  8131.             and     p1.uid = u.uid
  8132.             and     case 
  8133.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8134.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8135.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8136.                 end & v.high <> 0)            /* permission applies to this column */
  8137.     union all
  8138.     select    /*    Add rows for table owner */
  8139.         GRANTOR        = user_name(u.uid),
  8140.         GRANTEE        = user_name(o.uid),
  8141.         TABLE_CATALOG    = db_name(),
  8142.         TABLE_SCHEMA    = user_name(o.uid),
  8143.         TABLE_NAME    = o.name,
  8144.         COLUMN_NAME    = c.name,
  8145.         COLUMN_GUID    = convert(binary(16),null),
  8146.         COLUMN_PROPID    = convert(int,null),
  8147.         PRIVILEGE_TYPE    = convert(varchar(30),
  8148.                     case v.number
  8149.                     when 193 then 'SELECT'
  8150.                     when 195 then 'INSERT'
  8151.                     when 197 then 'UPDATE'
  8152.                     else 'REFERENCES'
  8153.                     end),
  8154.         IS_GRANTABLE    = convert(bit,1)    
  8155.     from 
  8156.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8157.     where
  8158.          o.type in ('U','V','S')
  8159.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8160.     and    (@grantee is null or @grantee = user_name(o.uid))
  8161.     and    c.id = o.id
  8162.     and     (@column_name is null or @column_name = c.name)
  8163.     and     u.suid = 1        /* grantor is dbo of database */
  8164.     and    (@grantor is null or @grantor = user_name(u.uid))
  8165.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8166.     and     v.number in (26,193,195,197)
  8167.     and     not exists (        /* exclude revoke'd privileges */
  8168.             select *
  8169.             from     sysprotects p1
  8170.             where    p1.protecttype = 206
  8171.             and     p1.action = v.number
  8172.             and     p1.id = o.id
  8173.             and     p1.uid = o.uid)
  8174.     order by 4, 5, 6, 9, 1, 2
  8175.     END
  8176. go
  8177. CREATE PROCEDURE sp_column_privileges_rowset;2
  8178.     (
  8179.        @handle        int output,
  8180.        @scrollopt    int output,
  8181.     @ccopt        int output,
  8182.     @rows        int output,
  8183.     @table_name     varchar(255) = null,
  8184.     @table_schema    varchar(255) = null,
  8185.     @column_name    varchar(255) = null,
  8186.     @grantor    varchar(255) = null,
  8187.     @grantee    varchar(255) = null
  8188.     )
  8189. as
  8190.  
  8191. declare @ret int
  8192.     
  8193. create table #spcprivsrowset1
  8194.     (
  8195.     GRANTOR        sysname not null,
  8196.     GRANTEE        sysname not null,
  8197.     TABLE_CATALOG    sysname not null,
  8198.     TABLE_SCHEMA    sysname not null,
  8199.     TABLE_NAME    sysname not null,
  8200.     COLUMN_NAME    sysname not null,
  8201.     COLUMN_GUID    binary(16) null,
  8202.     COLUMN_PROPID    int null,
  8203.     PRIVILEGE_TYPE    sysname not null,
  8204.     IS_GRANTABLE    bit not null
  8205.     )
  8206.  
  8207. IF @table_name is not null
  8208.     BEGIN
  8209.     insert into #spcprivsrowset1
  8210.     select
  8211.         GRANTOR        = user_name(p.grantor),
  8212.         GRANTEE        = user_name(u.uid),
  8213.         TABLE_CATALOG    = db_name(),
  8214.         TABLE_SCHEMA    = user_name(o.uid),
  8215.         TABLE_NAME    = o.name,
  8216.         COLUMN_NAME    = c.name,
  8217.         COLUMN_GUID    = convert(binary(16),null),
  8218.         COLUMN_PROPID    = convert(int,null),
  8219.         PRIVILEGE_TYPE    = convert(varchar(30),
  8220.                     case p.action
  8221.                     when 193 then 'SELECT'
  8222.                     when 195 then 'INSERT'
  8223.                     when 197 then 'UPDATE'
  8224.                     else 'REFERENCES'
  8225.                     end),
  8226.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8227.     from 
  8228.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  8229.     where
  8230.         o.name = @table_name
  8231.     and     o.type in ('U','V','S')
  8232.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8233.     and    c.id = o.id
  8234.     and     (@column_name is null or @column_name = c.name)
  8235.     and     c.id = p.id
  8236.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8237.     and     case 
  8238.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8239.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8240.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8241.             end & v.high <> 0            /* permission applies to this column */
  8242.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8243.     and     v.type = 'P'
  8244.     and     v.number = c.colid
  8245.     and    (@grantee is null or @grantee = user_name(u.uid))
  8246.             /* expand groups */
  8247.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  8248.     and     p.protecttype <> 206    /* only grant rows */
  8249.     and     p.action in (26,193,195,197)
  8250.     and     o.uid <> u.uid            /* no rows for owner */
  8251.     and     not exists (            /* exclude revoke'd privileges */
  8252.             select *
  8253.             from sysprotects p1
  8254.             where
  8255.                 p1.protecttype = 206
  8256.             and     p1.action = p.action
  8257.             and     p1.id = p.id
  8258.             and     p1.uid = u.uid
  8259.             and     case 
  8260.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8261.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8262.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8263.                 end & v.high <> 0)            /* permission applies to this column */
  8264.     union all
  8265.     select    /*    Add rows for table owner */
  8266.         GRANTOR        = user_name(u.uid),
  8267.         GRANTEE        = user_name(o.uid),
  8268.         TABLE_CATALOG    = db_name(),
  8269.         TABLE_SCHEMA    = user_name(o.uid),
  8270.         TABLE_NAME    = o.name,
  8271.         COLUMN_NAME    = c.name,
  8272.         COLUMN_GUID    = convert(binary(16),null),
  8273.         COLUMN_PROPID    = convert(int,null),
  8274.         PRIVILEGE_TYPE    = convert(varchar(30),
  8275.                     case v.number
  8276.                     when 193 then 'SELECT'
  8277.                     when 195 then 'INSERT'
  8278.                     when 197 then 'UPDATE'
  8279.                     else 'REFERENCES'
  8280.                     end),
  8281.         IS_GRANTABLE    = convert(bit,1)    
  8282.     from 
  8283.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8284.     where
  8285.         o.name = @table_name
  8286.     and     o.type in ('U','V','S')
  8287.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8288.     and    (@grantee is null or @grantee = user_name(o.uid))
  8289.     and    c.id = o.id
  8290.     and     (@column_name is null or @column_name = c.name)
  8291.     and     u.suid = 1        /* grantor is dbo of database */
  8292.     and    (@grantor is null or @grantor = user_name(u.uid))
  8293.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8294.     and     v.number in (26,193,195,197)
  8295.     and     not exists (        /* exclude revoke'd privileges */
  8296.             select *
  8297.             from     sysprotects p1
  8298.             where    p1.protecttype = 206
  8299.             and     p1.action = v.number
  8300.             and     p1.id = o.id
  8301.             and     p1.uid = o.uid)
  8302.     order by 4, 5, 6, 9, 1, 2
  8303.     END
  8304. ELSE
  8305.     BEGIN
  8306.     insert into #spcprivsrowset1
  8307.     select
  8308.         GRANTOR        = user_name(p.grantor),
  8309.         GRANTEE        = user_name(u.uid),
  8310.         TABLE_CATALOG    = db_name(),
  8311.         TABLE_SCHEMA    = user_name(o.uid),
  8312.         TABLE_NAME    = o.name,
  8313.         COLUMN_NAME    = c.name,
  8314.         COLUMN_GUID    = convert(binary(16),null),
  8315.         COLUMN_PROPID    = convert(int,null),
  8316.         PRIVILEGE_TYPE    = convert(varchar(30),
  8317.                     case p.action
  8318.                     when 193 then 'SELECT'
  8319.                     when 195 then 'INSERT'
  8320.                     when 197 then 'UPDATE'
  8321.                     else 'REFERENCES'
  8322.                     end),
  8323.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8324.     from 
  8325.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  8326.     where
  8327.         o.type in ('U','V','S')
  8328.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8329.     and    c.id = o.id
  8330.     and     (@column_name is null or @column_name = c.name)
  8331.     and     c.id = p.id
  8332.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8333.     and     case 
  8334.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8335.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8336.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8337.             end & v.high <> 0            /* permission applies to this column */
  8338.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8339.     and     v.type = 'P'
  8340.     and     v.number = c.colid
  8341.     and    (@grantee is null or @grantee = user_name(u.uid))
  8342.             /* expand groups */
  8343.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  8344.     and     p.protecttype <> 206    /* only grant rows */
  8345.     and     p.action in (26,193,195,197)
  8346.     and     o.uid <> u.uid            /* no rows for owner */
  8347.     and     not exists (            /* exclude revoke'd privileges */
  8348.             select *
  8349.             from sysprotects p1
  8350.             where
  8351.                 p1.protecttype = 206
  8352.             and     p1.action = p.action
  8353.             and     p1.id = p.id
  8354.             and     p1.uid = u.uid
  8355.             and     case 
  8356.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8357.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8358.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8359.                 end & v.high <> 0)            /* permission applies to this column */
  8360.     union all
  8361.     select    /*    Add rows for table owner */
  8362.         GRANTOR        = user_name(u.uid),
  8363.         GRANTEE        = user_name(o.uid),
  8364.         TABLE_CATALOG    = db_name(),
  8365.         TABLE_SCHEMA    = user_name(o.uid),
  8366.         TABLE_NAME    = o.name,
  8367.         COLUMN_NAME    = c.name,
  8368.         COLUMN_GUID    = convert(binary(16),null),
  8369.         COLUMN_PROPID    = convert(int,null),
  8370.         PRIVILEGE_TYPE    = convert(varchar(30),
  8371.                     case v.number
  8372.                     when 193 then 'SELECT'
  8373.                     when 195 then 'INSERT'
  8374.                     when 197 then 'UPDATE'
  8375.                     else 'REFERENCES'
  8376.                     end),
  8377.         IS_GRANTABLE    = convert(bit,1)    
  8378.     from 
  8379.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8380.     where
  8381.          o.type in ('U','V','S')
  8382.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8383.     and    (@grantee is null or @grantee = user_name(o.uid))
  8384.     and    c.id = o.id
  8385.     and     (@column_name is null or @column_name = c.name)
  8386.     and     u.suid = 1        /* grantor is dbo of database */
  8387.     and    (@grantor is null or @grantor = user_name(u.uid))
  8388.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8389.     and     v.number in (26,193,195,197)
  8390.     and     not exists (        /* exclude revoke'd privileges */
  8391.             select *
  8392.             from     sysprotects p1
  8393.             where    p1.protecttype = 206
  8394.             and     p1.action = v.number
  8395.             and     p1.id = o.id
  8396.             and     p1.uid = o.uid)
  8397.     order by 4, 5, 6, 9, 1, 2
  8398.     END
  8399.  
  8400. exec @ret = sp_cursoropen @handle output, 'select * from #spcprivsrowset1',
  8401.     @scrollopt output, @ccopt output, @rows output
  8402.  
  8403. drop table #spcprivsrowset1
  8404.  
  8405. return isnull(@ret,0)
  8406. go
  8407.  
  8408.  
  8409. if (charindex('7.00', @@version) = 0)
  8410. begin
  8411.     print ''
  8412.     print ''
  8413.     print 'Warning:'
  8414.     print 'you are installing the stored procedures '
  8415.     print 'on a pre 7.0 SQL Server.'
  8416.     print 'Ignore the following errors.'
  8417. end
  8418. else
  8419.     drop proc sp_column_privileges_rowset
  8420. go
  8421.  
  8422.  
  8423. /*    Procedure for 7.0 server */
  8424. CREATE PROCEDURE sp_column_privileges_rowset
  8425.     (
  8426.     @table_name         sysname,
  8427.     @table_schema        sysname = null,
  8428.     @column_name        sysname = null,
  8429.     @grantor        sysname = null,
  8430.     @grantee        sysname = null
  8431.     )
  8432. as
  8433.     select
  8434.         GRANTOR        = user_name(p.grantor),
  8435.         GRANTEE        = user_name(u.uid),
  8436.         TABLE_CATALOG    = db_name(),
  8437.         TABLE_SCHEMA    = user_name(o.uid),
  8438.         TABLE_NAME    = o.name,
  8439.         COLUMN_NAME    = c.name,
  8440.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8441.         COLUMN_PROPID    = convert(int,null),
  8442.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8443.                     case p.action
  8444.                     when 193 then N'SELECT'
  8445.                     when 195 then N'INSERT'
  8446.                     when 197 then N'UPDATE'
  8447.                     else N'REFERENCES'
  8448.                     end),
  8449.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8450.     from 
  8451.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  8452.     where
  8453.         o.name = @table_name
  8454.     and     o.type in ('U','V','S')
  8455.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8456.     and    c.id = o.id
  8457.     and     (@column_name is null or @column_name = c.name)
  8458.     and     c.id = p.id
  8459.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8460.     and     case 
  8461.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8462.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8463.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8464.             end & v.high <> 0            /* permission applies to this column */
  8465.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8466.     and     v.type = 'P'
  8467.     and     v.number = c.colid
  8468.     and    (@grantee is null or @grantee = user_name(u.uid))
  8469.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  8470.     and     (u.uid > 0 and u.uid < 16384)
  8471.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  8472.     and     p.protecttype <> 206    /* only grant rows */
  8473.     and     p.action in (26,193,195,197)
  8474.     and     o.uid <> u.uid            /* no rows for owner */
  8475.     and     not exists (            /* exclude revoke'd privileges */
  8476.             select *
  8477.             from sysprotects p1
  8478.             where
  8479.                 p1.protecttype = 206
  8480.             and     p1.action = p.action
  8481.             and     p1.id = p.id
  8482.             and     p1.uid = u.uid
  8483.             and     case 
  8484.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8485.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8486.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8487.                 end & v.high <> 0)            /* permission applies to this column */
  8488.     union all
  8489.     select    /*    Add rows for table owner */
  8490.         GRANTOR        = user_name(u.uid),
  8491.         GRANTEE        = user_name(o.uid),
  8492.         TABLE_CATALOG    = db_name(),
  8493.         TABLE_SCHEMA    = user_name(o.uid),
  8494.         TABLE_NAME    = o.name,
  8495.         COLUMN_NAME    = c.name,
  8496.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8497.         COLUMN_PROPID    = convert(int,null),
  8498.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8499.                     case v.number
  8500.                     when 193 then N'SELECT'
  8501.                     when 195 then N'INSERT'
  8502.                     when 197 then N'UPDATE'
  8503.                     else N'REFERENCES'
  8504.                     end),
  8505.         IS_GRANTABLE    = convert(bit,1)    
  8506.     from 
  8507.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8508.     where
  8509.         o.name = @table_name
  8510.     and     o.type in ('U','V','S')
  8511.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8512.     and    (@grantee is null or @grantee = user_name(o.uid))
  8513.     and    c.id = o.id
  8514.     and     (@column_name is null or @column_name = c.name)
  8515.     and     u.suid = 1        /* grantor is dbo of database */
  8516.     and    (@grantor is null or @grantor = user_name(u.uid))
  8517.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8518.     and     v.number in (26,193,195,197)
  8519.     and     not exists (        /* exclude revoke'd privileges */
  8520.             select *
  8521.             from     sysprotects p1
  8522.             where    p1.protecttype = 206
  8523.             and     p1.action = v.number
  8524.             and     p1.id = o.id
  8525.             and     p1.uid = o.uid)
  8526.     order by 4, 5, 6, 9, 1, 2
  8527. go
  8528. CREATE PROCEDURE sp_column_privileges_rowset;2
  8529.     (
  8530.     @table_schema        sysname = null,
  8531.     @column_name        sysname = null,
  8532.     @grantor        sysname = null,
  8533.     @grantee        sysname = null
  8534.     )
  8535. as
  8536.     select
  8537.         GRANTOR        = user_name(p.grantor),
  8538.         GRANTEE        = user_name(u.uid),
  8539.         TABLE_CATALOG    = db_name(),
  8540.         TABLE_SCHEMA    = user_name(o.uid),
  8541.         TABLE_NAME    = o.name,
  8542.         COLUMN_NAME    = c.name,
  8543.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8544.         COLUMN_PROPID    = convert(int,null),
  8545.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8546.                     case p.action
  8547.                     when 193 then N'SELECT'
  8548.                     when 195 then N'INSERT'
  8549.                     when 197 then N'UPDATE'
  8550.                     else N'REFERENCES'
  8551.                     end),
  8552.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8553.     from 
  8554.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  8555.     where
  8556.         o.type in ('U','V','S')
  8557.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8558.     and    c.id = o.id
  8559.     and     (@column_name is null or @column_name = c.name)
  8560.     and     c.id = p.id
  8561.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8562.     and     case 
  8563.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8564.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8565.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8566.             end & v.high <> 0            /* permission applies to this column */
  8567.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8568.     and     v.type = 'P'
  8569.     and     v.number = c.colid
  8570.     and    (@grantee is null or @grantee = user_name(u.uid))
  8571.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  8572.     and     (u.uid > 0 and u.uid < 16384)
  8573.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  8574.     and     p.protecttype <> 206    /* only grant rows */
  8575.     and     p.action in (26,193,195,197)
  8576.     and     o.uid <> u.uid            /* no rows for owner */
  8577.     and     not exists (            /* exclude revoke'd privileges */
  8578.             select *
  8579.             from sysprotects p1
  8580.             where
  8581.                 p1.protecttype = 206
  8582.             and     p1.action = p.action
  8583.             and     p1.id = p.id
  8584.             and     p1.uid = u.uid
  8585.             and     case 
  8586.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8587.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8588.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8589.                 end & v.high <> 0)            /* permission applies to this column */
  8590.     union all
  8591.     select    /*    Add rows for table owner */
  8592.         GRANTOR        = user_name(u.uid),
  8593.         GRANTEE        = user_name(o.uid),
  8594.         TABLE_CATALOG    = db_name(),
  8595.         TABLE_SCHEMA    = user_name(o.uid),
  8596.         TABLE_NAME    = o.name,
  8597.         COLUMN_NAME    = c.name,
  8598.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8599.         COLUMN_PROPID    = convert(int,null),
  8600.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8601.                     case v.number
  8602.                     when 193 then N'SELECT'
  8603.                     when 195 then N'INSERT'
  8604.                     when 197 then N'UPDATE'
  8605.                     else N'REFERENCES'
  8606.                     end),
  8607.         IS_GRANTABLE    = convert(bit,1)    
  8608.     from 
  8609.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8610.     where
  8611.         o.type in ('U','V','S')
  8612.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8613.     and    (@grantee is null or @grantee = user_name(o.uid))
  8614.     and    c.id = o.id
  8615.     and     (@column_name is null or @column_name = c.name)
  8616.     and     u.suid = 1        /* grantor is dbo of database */
  8617.     and    (@grantor is null or @grantor = user_name(u.uid))
  8618.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8619.     and     v.number in (26,193,195,197)
  8620.     and     not exists (        /* exclude revoke'd privileges */
  8621.             select *
  8622.             from     sysprotects p1
  8623.             where    p1.protecttype = 206
  8624.             and     p1.action = v.number
  8625.             and     p1.id = o.id
  8626.             and     p1.uid = o.uid)
  8627.     order by 4, 5, 6, 9, 1, 2
  8628. go
  8629. CREATE PROCEDURE sp_column_privileges_rowset;3
  8630.     (
  8631.     @table_name         sysname = null,
  8632.     @table_schema        sysname = null,
  8633.     @column_name        sysname = null,
  8634.     @grantor        sysname = null,
  8635.     @grantee        sysname = null
  8636.     )
  8637. as
  8638. IF @table_name is not null
  8639.     BEGIN
  8640.     select
  8641.         GRANTOR        = user_name(p.grantor),
  8642.         GRANTEE        = user_name(u.uid),
  8643.         TABLE_CATALOG    = db_name(),
  8644.         TABLE_SCHEMA    = user_name(o.uid),
  8645.         TABLE_NAME    = o.name,
  8646.         COLUMN_NAME    = c.name,
  8647.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8648.         COLUMN_PROPID    = convert(int,null),
  8649.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8650.                     case p.action
  8651.                     when 193 then N'SELECT'
  8652.                     when 195 then N'INSERT'
  8653.                     when 197 then N'UPDATE'
  8654.                     else N'REFERENCES'
  8655.                     end),
  8656.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8657.     from 
  8658.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  8659.     where
  8660.         o.name = @table_name
  8661.     and     o.type in ('U','V','S')
  8662.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8663.     and    c.id = o.id
  8664.     and     (@column_name is null or @column_name = c.name)
  8665.     and     c.id = p.id
  8666.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8667.     and     case 
  8668.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8669.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8670.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8671.             end & v.high <> 0            /* permission applies to this column */
  8672.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8673.     and     v.type = 'P'
  8674.     and     v.number = c.colid
  8675.     and    (@grantee is null or @grantee = user_name(u.uid))
  8676.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  8677.     and     (u.uid > 0 and u.uid < 16384)
  8678.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  8679.     and     p.protecttype <> 206    /* only grant rows */
  8680.     and     p.action in (26,193,195,197)
  8681.     and     o.uid <> u.uid            /* no rows for owner */
  8682.     and     not exists (            /* exclude revoke'd privileges */
  8683.             select *
  8684.             from sysprotects p1
  8685.             where
  8686.                 p1.protecttype = 206
  8687.             and     p1.action = p.action
  8688.             and     p1.id = p.id
  8689.             and     p1.uid = u.uid
  8690.             and     case 
  8691.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8692.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8693.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8694.                 end & v.high <> 0)            /* permission applies to this column */
  8695.     union all
  8696.     select    /*    Add rows for table owner */
  8697.         GRANTOR        = user_name(u.uid),
  8698.         GRANTEE        = user_name(o.uid),
  8699.         TABLE_CATALOG    = db_name(),
  8700.         TABLE_SCHEMA    = user_name(o.uid),
  8701.         TABLE_NAME    = o.name,
  8702.         COLUMN_NAME    = c.name,
  8703.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8704.         COLUMN_PROPID    = convert(int,null),
  8705.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8706.                     case v.number
  8707.                     when 193 then N'SELECT'
  8708.                     when 195 then N'INSERT'
  8709.                     when 197 then N'UPDATE'
  8710.                     else N'REFERENCES'
  8711.                     end),
  8712.         IS_GRANTABLE    = convert(bit,1)    
  8713.     from 
  8714.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8715.     where
  8716.         o.name = @table_name
  8717.     and     o.type in ('U','V','S')
  8718.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8719.     and    (@grantee is null or @grantee = user_name(o.uid))
  8720.     and    c.id = o.id
  8721.     and     (@column_name is null or @column_name = c.name)
  8722.     and     u.suid = 1        /* grantor is dbo of database */
  8723.     and    (@grantor is null or @grantor = user_name(u.uid))
  8724.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8725.     and     v.number in (26,193,195,197)
  8726.     and     not exists (        /* exclude revoke'd privileges */
  8727.             select *
  8728.             from     sysprotects p1
  8729.             where    p1.protecttype = 206
  8730.             and     p1.action = v.number
  8731.             and     p1.id = o.id
  8732.             and     p1.uid = o.uid)
  8733.     END
  8734. ELSE
  8735.     BEGIN
  8736.     select
  8737.         GRANTOR        = user_name(p.grantor),
  8738.         GRANTEE        = user_name(u.uid),
  8739.         TABLE_CATALOG    = db_name(),
  8740.         TABLE_SCHEMA    = user_name(o.uid),
  8741.         TABLE_NAME    = o.name,
  8742.         COLUMN_NAME    = c.name,
  8743.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8744.         COLUMN_PROPID    = convert(int,null),
  8745.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8746.                     case p.action
  8747.                     when 193 then N'SELECT'
  8748.                     when 195 then N'INSERT'
  8749.                     when 197 then N'UPDATE'
  8750.                     else N'REFERENCES'
  8751.                     end),
  8752.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  8753.     from 
  8754.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  8755.     where
  8756.         o.type in ('U','V','S')
  8757.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8758.     and    c.id = o.id
  8759.     and     (@column_name is null or @column_name = c.name)
  8760.     and     c.id = p.id
  8761.     and    (@grantor is null or @grantor = user_name(p.grantor))
  8762.     and     case 
  8763.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8764.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  8765.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  8766.             end & v.high <> 0            /* permission applies to this column */
  8767.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  8768.     and     v.type = 'P'
  8769.     and     v.number = c.colid
  8770.     and    (@grantee is null or @grantee = user_name(u.uid))
  8771.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  8772.     and     (u.uid > 0 and u.uid < 16384)
  8773.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  8774.     and     p.protecttype <> 206    /* only grant rows */
  8775.     and     p.action in (26,193,195,197)
  8776.     and     o.uid <> u.uid            /* no rows for owner */
  8777.     and     not exists (            /* exclude revoke'd privileges */
  8778.             select *
  8779.             from sysprotects p1
  8780.             where
  8781.                 p1.protecttype = 206
  8782.             and     p1.action = p.action
  8783.             and     p1.id = p.id
  8784.             and     p1.uid = u.uid
  8785.             and     case 
  8786.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  8787.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  8788.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  8789.                 end & v.high <> 0)            /* permission applies to this column */
  8790.     union all
  8791.     select    /*    Add rows for table owner */
  8792.         GRANTOR        = user_name(u.uid),
  8793.         GRANTEE        = user_name(o.uid),
  8794.         TABLE_CATALOG    = db_name(),
  8795.         TABLE_SCHEMA    = user_name(o.uid),
  8796.         TABLE_NAME    = o.name,
  8797.         COLUMN_NAME    = c.name,
  8798.         COLUMN_GUID    = convert(uniqueidentifier,null),
  8799.         COLUMN_PROPID    = convert(int,null),
  8800.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  8801.                     case v.number
  8802.                     when 193 then N'SELECT'
  8803.                     when 195 then N'INSERT'
  8804.                     when 197 then N'UPDATE'
  8805.                     else N'REFERENCES'
  8806.                     end),
  8807.         IS_GRANTABLE    = convert(bit,1)    
  8808.     from 
  8809.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  8810.     where
  8811.          o.type in ('U','V','S')
  8812.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  8813.     and    (@grantee is null or @grantee = user_name(o.uid))
  8814.     and    c.id = o.id
  8815.     and     (@column_name is null or @column_name = c.name)
  8816.     and     u.suid = 1        /* grantor is dbo of database */
  8817.     and    (@grantor is null or @grantor = user_name(u.uid))
  8818.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  8819.     and     v.number in (26,193,195,197)
  8820.     and     not exists (        /* exclude revoke'd privileges */
  8821.             select *
  8822.             from     sysprotects p1
  8823.             where    p1.protecttype = 206
  8824.             and     p1.action = v.number
  8825.             and     p1.id = o.id
  8826.             and     p1.uid = o.uid)
  8827.     END
  8828. go
  8829.  
  8830. create procedure sp_column_privileges_rowset;4
  8831.     (
  8832.        @handle        int output,
  8833.        @scrollopt    int output,
  8834.     @ccopt        int output,
  8835.     @rows        int output,
  8836.     @cmd        nvarchar(1200)
  8837.     )
  8838. as
  8839.     declare @ret int
  8840.     declare @database_name sysname
  8841.     declare @SQL nvarchar(1500)
  8842.  
  8843.     create table #spcprivsrowset
  8844.         (
  8845.         GRANTOR        sysname not null,
  8846.         GRANTEE        sysname not null,
  8847.         TABLE_CATALOG    sysname not null,
  8848.         TABLE_SCHEMA    sysname not null,
  8849.         TABLE_NAME    sysname not null,
  8850.         COLUMN_NAME    sysname not null,
  8851.         COLUMN_GUID    uniqueidentifier null,
  8852.         COLUMN_PROPID    int null,
  8853.         PRIVILEGE_TYPE    nvarchar(30) not null,
  8854.         IS_GRANTABLE    bit not null
  8855.         )
  8856.  
  8857.     declare sysdatabases_cursor insensitive cursor for 
  8858.         select name from master.dbo.sysdatabases
  8859.   
  8860.     set nocount on
  8861.     open sysdatabases_cursor
  8862.       fetch next from sysdatabases_cursor into @database_name 
  8863.     while @@fetch_status = 0
  8864.         begin
  8865.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spcprivsrowset '+@cmd
  8866.         exec(@SQL)
  8867.         fetch next from sysdatabases_cursor into @database_name 
  8868.         end
  8869.       close sysdatabases_cursor
  8870.     deallocate sysdatabases_cursor
  8871.  
  8872.     if @scrollopt is null
  8873.         begin
  8874.         select * from #spcprivsrowset order by 3,4,5,6,9,1,2
  8875.         end
  8876.     else
  8877.         begin
  8878.         exec @ret = sp_cursoropen @handle output,
  8879.             'select * from #spcprivsrowset order by 3,4,5,6,9,1,2',
  8880.                 @scrollopt output, @ccopt output, @rows output
  8881.         end
  8882.     drop table #spcprivsrowset
  8883.     return isnull(@ret,0)
  8884. go
  8885. create procedure sp_column_privileges_rowset;5
  8886.     (
  8887.     @table_server        sysname,
  8888.     @table_catalog        sysname = null,
  8889.     @table_name        sysname = null,
  8890.     @table_schema        sysname = null,
  8891.     @column_name        sysname = null,
  8892.     @grantor        sysname = null,
  8893.     @grantee        sysname = null
  8894.     )
  8895. as
  8896.     select
  8897.         GRANTOR,
  8898.         GRANTEE,
  8899.         TABLE_CATALOG,
  8900.         TABLE_SCHEMA,
  8901.         TABLE_NAME,
  8902.         COLUMN_NAME,
  8903.         COLUMN_GUID,
  8904.         COLUMN_PROPID,    
  8905.         PRIVILEGE_TYPE,
  8906.         IS_GRANTABLE    
  8907.         from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
  8908.                 @table_server,
  8909.                 @table_catalog,
  8910.                 @table_schema,
  8911.                 @table_name,
  8912.                 @column_name,
  8913.                 @grantor,
  8914.                 @grantee>
  8915.     order by 3, 4, 5, 6, 9, 1, 2
  8916. go
  8917.  
  8918. grant execute on sp_column_privileges_rowset to public
  8919. go
  8920.  
  8921. dump tran master with no_log
  8922. go
  8923.  
  8924.  
  8925. print ''
  8926. print 'creating sp_columns_rowset'
  8927. go
  8928.  
  8929. /*    Procedure for 6.0 and 6.50 server */
  8930. create procedure sp_columns_rowset
  8931.     (
  8932.        @table_name    varchar(255),
  8933.     @table_schema     varchar(255) = null,
  8934.     @column_name    varchar(255) = null
  8935.     )
  8936. as     
  8937.     select
  8938.         TABLE_CATALOG        = db_name(),
  8939.         TABLE_SCHEMA        = user_name(o.uid),
  8940.         TABLE_NAME        = o.name,
  8941.         COLUMN_NAME        = c.name,
  8942.         COLUMN_GUID        = convert(binary(16),null),
  8943.         COLUMN_PROPID        = convert(int,null),
  8944.         ORDINAL_POSITION    = convert(int,c.colid),
  8945.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  8946.         COLUMN_DEFAULT        = substring(m.text,2,datalength(m.text)-2),
  8947.         COLUMN_FLAGS        = convert(int,
  8948.                         case when d.is_long = 1 
  8949.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  8950.                         else 0
  8951.                         end
  8952.                     |    case when d.fixlen is not null
  8953.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  8954.                         else 0
  8955.                         end
  8956.                     |    case when c.status&8 = 8
  8957.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  8958.                         else 0
  8959.                         end
  8960.                     |    case 
  8961.                         when d.type_name = 'timestamp'
  8962.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  8963.                         when (c.status&128) != 128
  8964.                             then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/ 
  8965.                         else 0 
  8966.                         end),
  8967.         IS_NULLABLE        = convert(bit,c.status&8),
  8968.         DATA_TYPE        = d.oledb_data_type,
  8969.         TYPE_GUID        = convert(binary(16),null),
  8970.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  8971.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  8972.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  8973.                         then coalesce(d.column_size,c.length)
  8974.                         else null 
  8975.                         end),
  8976.         CHARACTER_OCTET_LENGTH    = convert(int,
  8977.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  8978.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  8979.                         then coalesce(d.column_size,c.length)
  8980.                         else null 
  8981.                         end),
  8982.         NUMERIC_PRECISION    = convert(smallint,
  8983.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  8984.         NUMERIC_SCALE        = convert(smallint, 
  8985.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  8986.         DATETIME_PRECISION    = convert(int,
  8987.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  8988.         CHARACTER_SET_CATALOG    = convert(sysname,
  8989.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  8990.                         then 'master' 
  8991.                         else null 
  8992.                         end),
  8993.         CHARACTER_SET_SCHEMA    = convert(sysname,
  8994.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  8995.                         then 'dbo' 
  8996.                         else null 
  8997.                         end),
  8998.         CHARACTER_SET_NAME    = convert(sysname,
  8999.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9000.                         then a_cha.name 
  9001.                         else null 
  9002.                         end),
  9003.         COLLATION_CATALOG    = convert(sysname,
  9004.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9005.                         then 'master' 
  9006.                         else null 
  9007.                         end),
  9008.         COLLATION_SCHEMA    = convert(sysname,
  9009.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9010.                         then 'dbo' 
  9011.                         else null 
  9012.                         end),
  9013.         COLLATION_NAME        = convert(sysname,
  9014.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9015.                         then b_cha.name 
  9016.                         else null 
  9017.                         end),
  9018.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9019.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9020.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9021.         DESCRIPTION        = convert(varchar(1),null)    
  9022.     
  9023.     from
  9024.         syscolumns c,
  9025.         syscomments m,
  9026.         sysobjects o,
  9027.         master.dbo.spt_provider_types d,
  9028.         systypes t,
  9029.         sysusers u,
  9030.         master.dbo.sysconfigures    cfg,
  9031.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  9032.         master.dbo.syscharsets        b_cha  /* sortorder/2001, not charset. */
  9033.     where
  9034.         o.name = @table_name
  9035.     and     o.type in ('U','V','S')
  9036.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  9037.     and     (
  9038.         suser_id() = 1     /* User is the System Administrator */
  9039.         or o.uid = user_id()     /* User created the object */
  9040.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  9041.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  9042.             from sysprotects p
  9043.             where p.id = o.id
  9044.             /* get rows for public,current user,user's group */
  9045.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  9046.             /* check for SELECT,EXECUTE privilege */
  9047.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  9048.             ) = 1    /* final magic...compare Grants      */
  9049.            )
  9050.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9051.     and    (@column_name is null or @column_name = c.name)
  9052.     and     o.id = c.id
  9053.     and     t.type = d.ss_dtype
  9054.     and    (t.usertype != 80 or d.type_name='timestamp')
  9055.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9056.     and     c.usertype = t.usertype
  9057.     and    c.cdefault *= m.id
  9058.     and    m.colid = 1
  9059.     and    cfg.comment = 'default sortorder ID' 
  9060.     and    a_cha.type = 1001 /* type is charset */
  9061.     and    b_cha.type = 2001 /* type is sortorder */
  9062.     and    a_cha.id = b_cha.csid
  9063.     and     b_cha.id = cfg.value
  9064.     order by 2, 3, 7
  9065. go
  9066. create procedure sp_columns_rowset;2
  9067.     (
  9068.     @table_schema     varchar(255) = null,
  9069.     @column_name    varchar(255) = null
  9070.     )
  9071. as     
  9072.     select
  9073.         TABLE_CATALOG        = db_name(),
  9074.         TABLE_SCHEMA        = user_name(o.uid),
  9075.         TABLE_NAME        = o.name,
  9076.         COLUMN_NAME        = c.name,
  9077.         COLUMN_GUID        = convert(binary(16),null),
  9078.         COLUMN_PROPID        = convert(int,null),
  9079.         ORDINAL_POSITION    = convert(int,c.colid),
  9080.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  9081.         COLUMN_DEFAULT        = substring(m.text,2,datalength(m.text)-2),
  9082.         COLUMN_FLAGS        = convert(int,
  9083.                         case when d.is_long = 1 
  9084.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  9085.                         else 0
  9086.                         end
  9087.                     |    case when d.fixlen is not null
  9088.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  9089.                         else 0
  9090.                         end
  9091.                     |    case when c.status&8 = 8
  9092.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  9093.                         else 0
  9094.                         end
  9095.                     |    case 
  9096.                         when d.type_name = 'timestamp'
  9097.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  9098.                         when (c.status&128) != 128
  9099.                             then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/ 
  9100.                         else 0 
  9101.                         end),
  9102.         IS_NULLABLE        = convert(bit,c.status&8),
  9103.         DATA_TYPE        = d.oledb_data_type,
  9104.         TYPE_GUID        = convert(binary(16),null),
  9105.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  9106.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9107.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9108.                         then coalesce(d.column_size,c.length)
  9109.                         else null 
  9110.                         end),
  9111.         CHARACTER_OCTET_LENGTH    = convert(int,
  9112.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9113.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9114.                         then coalesce(d.column_size,c.length)
  9115.                         else null 
  9116.                         end),
  9117.         NUMERIC_PRECISION    = convert(smallint,
  9118.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  9119.         NUMERIC_SCALE        = convert(smallint, 
  9120.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  9121.         DATETIME_PRECISION    = convert(int,
  9122.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  9123.         CHARACTER_SET_CATALOG    = convert(sysname,
  9124.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9125.                         then 'master' 
  9126.                         else null 
  9127.                         end),
  9128.         CHARACTER_SET_SCHEMA    = convert(sysname,
  9129.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9130.                         then 'dbo' 
  9131.                         else null 
  9132.                         end),
  9133.         CHARACTER_SET_NAME    = convert(sysname,
  9134.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9135.                         then a_cha.name 
  9136.                         else null 
  9137.                         end),
  9138.         COLLATION_CATALOG    = convert(sysname,
  9139.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9140.                         then 'master' 
  9141.                         else null 
  9142.                         end),
  9143.         COLLATION_SCHEMA    = convert(sysname,
  9144.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9145.                         then 'dbo' 
  9146.                         else null 
  9147.                         end),
  9148.         COLLATION_NAME        = convert(sysname,
  9149.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9150.                         then b_cha.name 
  9151.                         else null 
  9152.                         end),
  9153.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9154.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9155.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9156.         DESCRIPTION        = convert(varchar(1),null)    
  9157.     
  9158.     from
  9159.         syscolumns c,
  9160.         syscomments m,
  9161.         sysobjects o,
  9162.         master.dbo.spt_provider_types d,
  9163.         systypes t,
  9164.         sysusers u,
  9165.         master.dbo.sysconfigures    cfg,
  9166.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  9167.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset. */
  9168.     where
  9169.          o.type in ('U','V','S')
  9170.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  9171.     and     (
  9172.         suser_id() = 1     /* User is the System Administrator */
  9173.         or o.uid = user_id()     /* User created the object */
  9174.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  9175.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  9176.             from sysprotects p
  9177.             where p.id = o.id
  9178.             /* get rows for public,current user,user's group */
  9179.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  9180.             /* check for SELECT,EXECUTE privilege */
  9181.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  9182.             ) = 1    /* final magic...compare Grants      */
  9183.            )
  9184.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9185.     and    (@column_name is null or @column_name = c.name)
  9186.     and     o.id = c.id
  9187.     and     t.type = d.ss_dtype
  9188.     and    (t.usertype != 80 or d.type_name='timestamp')
  9189.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9190.     and     c.usertype = t.usertype
  9191.     and    c.cdefault *= m.id
  9192.     and     m.colid = 1
  9193.     and    cfg.comment = 'default sortorder ID' 
  9194.     and    a_cha.type = 1001 /* type is charset */
  9195.     and    b_cha.type = 2001 /* type is sortorder */
  9196.     and    a_cha.id = b_cha.csid
  9197.     and     b_cha.id = cfg.value
  9198.     order by 2, 3, 7
  9199. go
  9200.  
  9201. if (charindex('7.00', @@version) = 0)
  9202. begin
  9203.     print ''
  9204.     print ''
  9205.     print 'Warning:'
  9206.     print 'you are installing the stored procedures '
  9207.     print 'on a pre 7.0 SQL Server.'
  9208.     print 'Ignore the following errors.'
  9209. end
  9210. else
  9211.     drop proc sp_columns_rowset
  9212. go
  9213.  
  9214. /*    Procedure for 7.0 server */
  9215. create procedure sp_columns_rowset
  9216.     (
  9217.        @table_name    sysname,
  9218.     @table_schema     sysname = NULL,
  9219.     @column_name    sysname = NULL
  9220.     )
  9221. as     
  9222.     select
  9223.         TABLE_CATALOG        = db_name(),
  9224.         TABLE_SCHEMA        = user_name(o.uid),
  9225.         TABLE_NAME        = o.name,
  9226.         COLUMN_NAME        = c.name,
  9227.         COLUMN_GUID        = convert(uniqueidentifier,null),
  9228.         COLUMN_PROPID        = convert(int,null),
  9229.         ORDINAL_POSITION    = convert(int,c.colid),
  9230.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  9231.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  9232.                         substring(m.text,2,datalength(m.text)/2-2)),
  9233.         COLUMN_FLAGS        = convert(int,
  9234.                         case when d.is_long = 1 
  9235.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  9236.                         else 0
  9237.                         end
  9238.                     |    case when d.fixlen is not null
  9239.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  9240.                         else 0
  9241.                         end
  9242.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  9243.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  9244.                         else 0
  9245.                         end
  9246.                     |    case 
  9247.                         when d.type_name = 'timestamp'
  9248.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  9249.                         when (c.status&128) != 128  and permissions(o.id,c.name)&2 = 2
  9250.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  9251.                         else 0 
  9252.                         end),
  9253.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  9254.         DATA_TYPE        = d.oledb_data_type,
  9255.         TYPE_GUID        = convert(uniqueidentifier,null),
  9256.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  9257.                         case 
  9258.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9259.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9260.                         then coalesce(d.column_size,c.length)
  9261.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9262.                         then coalesce(d.column_size,c.length/2)
  9263.                         else null 
  9264.                         end),
  9265.         CHARACTER_OCTET_LENGTH    = convert(int,
  9266.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9267.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9268.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9269.                         then coalesce(d.column_size,c.length)
  9270.                         else null 
  9271.                         end),
  9272.         NUMERIC_PRECISION    = convert(smallint,
  9273.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec else null end),
  9274.         NUMERIC_SCALE        = convert(smallint, 
  9275.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  9276.         DATETIME_PRECISION    = convert(int,
  9277.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  9278.         CHARACTER_SET_CATALOG    = convert(sysname,
  9279.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9280.                         then N'master' 
  9281.                         else null 
  9282.                         end),
  9283.         CHARACTER_SET_SCHEMA    = convert(sysname,
  9284.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9285.                         then N'dbo' 
  9286.                         else null 
  9287.                         end),
  9288.         CHARACTER_SET_NAME    = convert(sysname,
  9289.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9290.                         then a_cha.name 
  9291.                         else null 
  9292.                         end),
  9293.         COLLATION_CATALOG    = convert(sysname,
  9294.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9295.                         then N'master' 
  9296.                         else null 
  9297.                         end),
  9298.         COLLATION_SCHEMA    = convert(sysname,
  9299.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9300.                         then N'dbo' 
  9301.                         else null 
  9302.                         end),
  9303.         COLLATION_NAME        = convert(sysname,
  9304.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9305.                         then b_cha.name 
  9306.                         else null 
  9307.                         end),
  9308.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9309.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9310.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9311.         DESCRIPTION        = convert(nvarchar(1),null)    
  9312.     
  9313.     from
  9314.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  9315.         sysobjects o,
  9316.         master.dbo.spt_provider_types d,
  9317.         systypes t,
  9318.         master.dbo.sysconfigures    cfg,
  9319.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  9320.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset. */
  9321.     where
  9322.         permissions(o.id, c.name) <> 0
  9323.     and    o.name = @table_name
  9324.     and     o.type in ('U','V','S')
  9325.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9326.     and    (@column_name is null or @column_name = c.name)
  9327.     and     o.id = c.id
  9328.     and     t.xtype = d.ss_dtype
  9329.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9330.     and     c.xusertype = t.xusertype
  9331.     and    cfg.comment = 'default sortorder ID' 
  9332.     and    a_cha.type = 1001 /* type is charset */
  9333.     and    b_cha.type = 2001 /* type is sortorder */
  9334.     and    a_cha.id = b_cha.csid
  9335.     and     b_cha.id = cfg.value
  9336.     order by 2, 3, 7
  9337. go
  9338. create procedure sp_columns_rowset;2
  9339.     (
  9340.     @table_schema     sysname = NULL,
  9341.     @column_name    sysname = NULL
  9342.     )
  9343. as     
  9344.     select
  9345.         TABLE_CATALOG        = db_name(),
  9346.         TABLE_SCHEMA        = user_name(o.uid),
  9347.         TABLE_NAME        = o.name,
  9348.         COLUMN_NAME        = c.name,
  9349.         COLUMN_GUID        = convert(uniqueidentifier,null),
  9350.         COLUMN_PROPID        = convert(int,null),
  9351.         ORDINAL_POSITION    = convert(int,c.colid),
  9352.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  9353.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  9354.                         substring(m.text,2,datalength(m.text)/2-2)),
  9355.         COLUMN_FLAGS        = convert(int,
  9356.                         case when d.is_long = 1 
  9357.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  9358.                         else 0
  9359.                         end
  9360.                     |    case when d.fixlen is not null
  9361.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  9362.                         else 0
  9363.                         end
  9364.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  9365.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  9366.                         else 0
  9367.                         end
  9368.                     |    case 
  9369.                         when d.type_name = 'timestamp'
  9370.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  9371.                         when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
  9372.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  9373.                         else 0 
  9374.                         end),
  9375.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  9376.         DATA_TYPE        = d.oledb_data_type,
  9377.         TYPE_GUID        = convert(uniqueidentifier,null),
  9378.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  9379.                         case 
  9380.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9381.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9382.                         then coalesce(d.column_size,c.length)
  9383.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9384.                         then coalesce(d.column_size,c.length/2)
  9385.                         else null 
  9386.                         end),
  9387.         CHARACTER_OCTET_LENGTH    = convert(int,
  9388.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9389.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9390.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9391.                         then coalesce(d.column_size,c.length)
  9392.                         else null 
  9393.                         end),
  9394.         NUMERIC_PRECISION    = convert(smallint,
  9395.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec else null end),
  9396.         NUMERIC_SCALE        = convert(smallint, 
  9397.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  9398.         DATETIME_PRECISION    = convert(int,
  9399.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  9400.         CHARACTER_SET_CATALOG    = convert(sysname,
  9401.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9402.                         then N'master' 
  9403.                         else null 
  9404.                         end),
  9405.         CHARACTER_SET_SCHEMA    = convert(sysname,
  9406.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9407.                         then N'dbo' 
  9408.                         else null 
  9409.                         end),
  9410.         CHARACTER_SET_NAME    = convert(sysname,
  9411.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9412.                         then a_cha.name 
  9413.                         else null 
  9414.                         end),
  9415.         COLLATION_CATALOG    = convert(sysname,
  9416.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9417.                         then N'master' 
  9418.                         else null 
  9419.                         end),
  9420.         COLLATION_SCHEMA    = convert(sysname,
  9421.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9422.                         then N'dbo' 
  9423.                         else null 
  9424.                         end),
  9425.         COLLATION_NAME        = convert(sysname,
  9426.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9427.                         then b_cha.name 
  9428.                         else null 
  9429.                         end),
  9430.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9431.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9432.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9433.         DESCRIPTION        = convert(nvarchar(1),null)    
  9434.     
  9435.     from
  9436.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  9437.         sysobjects o,
  9438.         master.dbo.spt_provider_types d,
  9439.         systypes t,
  9440.         master.dbo.sysconfigures    cfg,
  9441.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder.*/
  9442.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset.*/
  9443.     where
  9444.         permissions(o.id, c.name) <> 0
  9445.     and     o.type in ('U','V','S')
  9446.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9447.     and    (@column_name is null or @column_name = c.name)
  9448.     and     o.id = c.id
  9449.     and     t.xtype = d.ss_dtype
  9450.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9451.     and     c.xusertype = t.xusertype
  9452.     and    cfg.comment = 'default sortorder ID' 
  9453.     and a_cha.type = 1001 /* type is charset */
  9454.     and b_cha.type = 2001 /* type is sortorder */
  9455.     and    a_cha.id = b_cha.csid
  9456.     and     b_cha.id = cfg.value
  9457.     order by 2, 3, 7
  9458. go
  9459. create procedure sp_columns_rowset;3
  9460.     (
  9461.        @table_name    sysname = NULL,
  9462.     @table_schema     sysname = NULL,
  9463.     @column_name    sysname = NULL
  9464.     )
  9465. as     
  9466. IF @table_name is not null
  9467.     BEGIN
  9468.     select
  9469.         TABLE_CATALOG        = db_name(),
  9470.         TABLE_SCHEMA        = user_name(o.uid),
  9471.         TABLE_NAME        = o.name,
  9472.         COLUMN_NAME        = c.name,
  9473.         COLUMN_GUID        = convert(uniqueidentifier,null),
  9474.         COLUMN_PROPID        = convert(int,null),
  9475.         ORDINAL_POSITION    = convert(int,c.colid),
  9476.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  9477.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  9478.                         substring(m.text,2,datalength(m.text)/2-2)),
  9479.         COLUMN_FLAGS        = convert(int,
  9480.                         case when d.is_long = 1 
  9481.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  9482.                         else 0
  9483.                         end
  9484.                     |    case when d.fixlen is not null
  9485.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  9486.                         else 0
  9487.                         end
  9488.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  9489.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  9490.                         else 0
  9491.                         end
  9492.                     |    case 
  9493.                         when d.type_name = 'timestamp'
  9494.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  9495.                         when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
  9496.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  9497.                         else 0 
  9498.                         end),
  9499.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  9500.         DATA_TYPE        = d.oledb_data_type,
  9501.         TYPE_GUID        = convert(uniqueidentifier,null),
  9502.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  9503.                         case 
  9504.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9505.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9506.                         then coalesce(d.column_size,c.length)
  9507.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9508.                         then coalesce(d.column_size,c.length/2)
  9509.                         else null 
  9510.                         end),
  9511.         CHARACTER_OCTET_LENGTH    = convert(int,
  9512.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9513.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9514.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9515.                         then coalesce(d.column_size,c.length)
  9516.                         else null 
  9517.                         end),
  9518.         NUMERIC_PRECISION    = convert(smallint,
  9519.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec else null end),
  9520.         NUMERIC_SCALE        = convert(smallint, 
  9521.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  9522.         DATETIME_PRECISION    = convert(int,
  9523.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  9524.         CHARACTER_SET_CATALOG    = convert(sysname,
  9525.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9526.                         then N'master' 
  9527.                         else null 
  9528.                         end),
  9529.         CHARACTER_SET_SCHEMA    = convert(sysname,
  9530.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9531.                         then N'dbo' 
  9532.                         else null 
  9533.                         end),
  9534.         CHARACTER_SET_NAME    = convert(sysname,
  9535.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9536.                         then a_cha.name 
  9537.                         else null 
  9538.                         end),
  9539.         COLLATION_CATALOG    = convert(sysname,
  9540.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9541.                         then N'master' 
  9542.                         else null 
  9543.                         end),
  9544.         COLLATION_SCHEMA    = convert(sysname,
  9545.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9546.                         then N'dbo' 
  9547.                         else null 
  9548.                         end),
  9549.         COLLATION_NAME        = convert(sysname,
  9550.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9551.                         then b_cha.name 
  9552.                         else null 
  9553.                         end),
  9554.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9555.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9556.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9557.         DESCRIPTION        = convert(nvarchar(1),null)    
  9558.     
  9559.     from
  9560.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  9561.         sysobjects o,
  9562.         master.dbo.spt_provider_types d,
  9563.         systypes t,
  9564.         master.dbo.sysconfigures    cfg,
  9565.         master.dbo.syscharsets        a_cha, /*charset/1001, not sortorder.*/
  9566.         master.dbo.syscharsets        b_cha /*sortorder/2001, not charset.*/
  9567.     where
  9568.         permissions(o.id, c.name) <> 0
  9569.     and    o.name = @table_name
  9570.     and     o.type in ('U','V','S')
  9571.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9572.     and    (@column_name is null or @column_name = c.name)
  9573.     and     o.id = c.id
  9574.     and     t.xtype = d.ss_dtype
  9575.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9576.     and     c.xusertype = t.xusertype
  9577.     and    cfg.comment = 'default sortorder ID' 
  9578.     and    a_cha.type = 1001 /* type is charset */
  9579.     and    b_cha.type = 2001 /* type is sortorder */
  9580.     and    a_cha.id = b_cha.csid
  9581.     and     b_cha.id = cfg.value
  9582.     END    
  9583. ELSE 
  9584.     BEGIN
  9585.     select
  9586.         TABLE_CATALOG        = db_name(),
  9587.         TABLE_SCHEMA        = user_name(o.uid),
  9588.         TABLE_NAME        = o.name,
  9589.         COLUMN_NAME        = c.name,
  9590.         COLUMN_GUID        = convert(uniqueidentifier,null),
  9591.         COLUMN_PROPID        = convert(int,null),
  9592.         ORDINAL_POSITION    = convert(int,c.colid),
  9593.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  9594.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  9595.                         substring(m.text,2,datalength(m.text)/2-2)),
  9596.         COLUMN_FLAGS        = convert(int,
  9597.                         case when d.is_long = 1 
  9598.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  9599.                         else 0
  9600.                         end
  9601.                     |    case when d.fixlen is not null
  9602.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  9603.                         else 0
  9604.                         end
  9605.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  9606.                         then 0x20 /*DBCOLUMNFLAGS_ISNULLABLE*/
  9607.                         else 0
  9608.                         end
  9609.                     |    case 
  9610.                         when d.type_name = 'timestamp'
  9611.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  9612.                         when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
  9613.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  9614.                         else 0 
  9615.                         end),
  9616.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  9617.         DATA_TYPE        = d.oledb_data_type,
  9618.         TYPE_GUID        = convert(uniqueidentifier,null),
  9619.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  9620.                         case 
  9621.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9622.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9623.                         then coalesce(d.column_size,c.length)
  9624.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9625.                         then coalesce(d.column_size,c.length/2)
  9626.                         else null 
  9627.                         end),
  9628.         CHARACTER_OCTET_LENGTH    = convert(int,
  9629.                         case 
  9630.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  9631.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  9632.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  9633.                         then coalesce(d.column_size,c.length)
  9634.                         else null 
  9635.                         end),
  9636.         NUMERIC_PRECISION    = convert(smallint,
  9637.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec else null end),
  9638.         NUMERIC_SCALE        = convert(smallint, 
  9639.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  9640.         DATETIME_PRECISION    = convert(int,
  9641.                         case when d.oledb_data_type = 135 /*DBTYPE_DBTIMESTAMP*/ then 3 else null end),
  9642.         CHARACTER_SET_CATALOG    = convert(sysname,
  9643.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9644.                         then N'master' 
  9645.                         else null 
  9646.                         end),
  9647.         CHARACTER_SET_SCHEMA    = convert(sysname,
  9648.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9649.                         then N'dbo' 
  9650.                         else null 
  9651.                         end),
  9652.         CHARACTER_SET_NAME    = convert(sysname,
  9653.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9654.                         then a_cha.name 
  9655.                         else null 
  9656.                         end),
  9657.         COLLATION_CATALOG    = convert(sysname,
  9658.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9659.                         then N'master' 
  9660.                         else null 
  9661.                         end),
  9662.         COLLATION_SCHEMA    = convert(sysname,
  9663.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9664.                         then N'dbo' 
  9665.                         else null 
  9666.                         end),
  9667.         COLLATION_NAME        = convert(sysname,
  9668.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  9669.                         then b_cha.name 
  9670.                         else null 
  9671.                         end),
  9672.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  9673.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  9674.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  9675.         DESCRIPTION        = convert(nvarchar(1),null)    
  9676.     
  9677.     from
  9678.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  9679.         sysobjects o,
  9680.         master.dbo.spt_provider_types d,
  9681.         systypes t,
  9682.         master.dbo.sysconfigures    cfg,
  9683.         master.dbo.syscharsets        a_cha, /*charset/1001, not sortorder.*/
  9684.         master.dbo.syscharsets        b_cha /*sortorder/2001, not charset.*/
  9685.     where
  9686.         permissions(o.id, c.name) <> 0
  9687.     and     o.type in ('U','V','S')
  9688.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  9689.     and    (@column_name is null or @column_name = c.name)
  9690.     and     o.id = c.id
  9691.     and     t.xtype = d.ss_dtype
  9692.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  9693.     and     c.xusertype = t.xusertype
  9694.     and    cfg.comment = 'default sortorder ID' 
  9695.     and a_cha.type = 1001 /* type is charset */
  9696.     and b_cha.type = 2001 /* type is sortorder */
  9697.     and    a_cha.id = b_cha.csid
  9698.     and     b_cha.id = cfg.value
  9699. END
  9700. go
  9701. create procedure sp_columns_rowset;4
  9702.     (
  9703.  
  9704.        @handle        int output,
  9705.        @scrollopt    int output,
  9706.     @ccopt        int output,
  9707.     @rows        int output,
  9708.     @cmd        nvarchar(1200)
  9709.     )
  9710. as
  9711.     declare @ret int
  9712.     declare @database_name sysname
  9713.     declare @SQL nvarchar(1500)
  9714.  
  9715.     create table #spcolumnsrowset 
  9716.         (
  9717.         TABLE_CATALOG        sysname not null,
  9718.         TABLE_SCHEMA        sysname not null,
  9719.         TABLE_NAME        sysname not null,
  9720.         COLUMN_NAME        sysname not null,
  9721.         COLUMN_GUID        uniqueidentifier null,
  9722.         COLUMN_PROPID        int null,
  9723.         ORDINAL_POSITION    int not null,
  9724.         COLUMN_HASDEFAULT    bit not null,
  9725.         COLUMN_DEFAULT        nvarchar(2000) null,
  9726.         COLUMN_FLAGS        int not null,
  9727.         IS_NULLABLE        bit not null,
  9728.         DATA_TYPE        smallint not null,
  9729.         TYPE_GUID        uniqueidentifier null,
  9730.         CHARACTER_MAXIMUM_LENGTH int null,
  9731.         CHARACTER_OCTET_LENGTH    int null,
  9732.         NUMERIC_PRECISION    smallint null,
  9733.         NUMERIC_SCALE        smallint null,
  9734.         DATETIME_PRECISION    int null,
  9735.         CHARACTER_SET_CATALOG    sysname null,
  9736.         CHARACTER_SET_SCHEMA    sysname null,
  9737.         CHARACTER_SET_NAME    sysname null,
  9738.         COLLATION_CATALOG    sysname null,
  9739.         COLLATION_SCHEMA    sysname null,
  9740.         COLLATION_NAME        sysname null,
  9741.         DOMAIN_CATALOG        sysname null,
  9742.         DOMAIN_SCHEMA        sysname null,
  9743.         DOMAIN_NAME        sysname null,
  9744.         DESCRIPTION        nvarchar(1) null    
  9745.         )
  9746.  
  9747.     declare sysdatabases_cursor insensitive cursor for 
  9748.         select name from master.dbo.sysdatabases
  9749.   
  9750.     set nocount on
  9751.     open sysdatabases_cursor
  9752.       fetch next from sysdatabases_cursor into @database_name 
  9753.     while @@fetch_status = 0
  9754.         begin
  9755.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spcolumnsrowset '+@cmd
  9756.         exec(@SQL)
  9757.         fetch next from sysdatabases_cursor into @database_name 
  9758.         end
  9759.       close sysdatabases_cursor
  9760.     deallocate sysdatabases_cursor
  9761.  
  9762.     if @scrollopt is null
  9763.         begin
  9764.         select * from #spcolumnsrowset order by 1,2,3,7
  9765.         end
  9766.     else
  9767.         begin
  9768.         exec @ret = sp_cursoropen @handle output,
  9769.             'select * from #spcolumnsrowset order by 1,2,3,7',
  9770.                 @scrollopt output, @ccopt output, @rows output
  9771.         end
  9772.     drop table #spcolumnsrowset 
  9773.     return coalesce(@ret,0)
  9774. go
  9775. create procedure sp_columns_rowset;5
  9776.     (
  9777.     @table_server        sysname,
  9778.     @table_catalog        sysname = null,
  9779.     @table_name        sysname = null,
  9780.     @table_schema        sysname = null,
  9781.     @column_name        sysname = null
  9782.     )
  9783. as
  9784.     select
  9785.         TABLE_CATALOG,
  9786.         TABLE_SCHEMA,
  9787.         TABLE_NAME,
  9788.         COLUMN_NAME,
  9789.         COLUMN_GUID,
  9790.         COLUMN_PROPID,
  9791.         ORDINAL_POSITION,
  9792.         COLUMN_HASDEFAULT,
  9793.         COLUMN_DEFAULT,
  9794.         COLUMN_FLAGS,
  9795.         IS_NULLABLE,
  9796.         DATA_TYPE,
  9797.         TYPE_GUID,
  9798.         CHARACTER_MAXIMUM_LENGTH,
  9799.         CHARACTER_OCTET_LENGTH,
  9800.         NUMERIC_PRECISION,
  9801.         NUMERIC_SCALE,
  9802.         DATETIME_PRECISION,
  9803.         CHARACTER_SET_CATALOG,
  9804.         CHARACTER_SET_SCHEMA,
  9805.         CHARACTER_SET_NAME,
  9806.         COLLATION_CATALOG,
  9807.         COLLATION_SCHEMA,
  9808.         COLLATION_NAME,
  9809.         DOMAIN_CATALOG,
  9810.         DOMAIN_SCHEMA,
  9811.         DOMAIN_NAME,
  9812.         DESCRIPTION
  9813.     from master.dbo.SYSREMOTE_COLUMNS <
  9814.                 @table_server,
  9815.                 @table_catalog,
  9816.                 @table_schema,
  9817.                 @table_name,
  9818.                 @column_name > 
  9819.     order by 1, 2, 3, 7
  9820. go
  9821.  
  9822. grant execute on sp_columns_rowset to public
  9823. go
  9824.  
  9825. dump tran master with no_log
  9826. go
  9827.  
  9828.  
  9829. print ''
  9830. print 'creating sp_foreign_keys_rowset'
  9831. go
  9832.  
  9833. /*    Procedure for 6.0 and 6.5 server */
  9834. CREATE PROCEDURE sp_foreign_keys_rowset
  9835.     (
  9836.      @pk_table_name        varchar(255) = null,
  9837.     @pk_table_schema    varchar(255) = null,
  9838.     @pk_table_catalog    varchar(255) = null,
  9839.     @fk_table_name        varchar(255) = null,
  9840.     @fk_table_schema    varchar(255) = null,
  9841.     @fk_table_catalog    varchar(255) = null
  9842.     )
  9843. as
  9844. IF @pk_table_name is not null
  9845.     BEGIN
  9846.     select
  9847.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  9848.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  9849.         PK_TABLE_NAME         = o1.name,
  9850.         PK_COLUMN_NAME         = c1.name,
  9851.         PK_COLUMN_GUID        = convert(binary(16),null),
  9852.         PK_COLUMN_PROPID    = convert(int,null),
  9853.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  9854.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  9855.         FK_TABLE_NAME         = o2.name,
  9856.         FK_COLUMN_NAME         = c2.name,
  9857.         FK_COLUMN_GUID        = convert(binary(16),null),
  9858.         FK_COLUMN_PROPID    = convert(int,null),
  9859.         ORDINAL            = convert(int,1),
  9860.         UPDATE_RULE        = 'NO ACTION',
  9861.         DELETE_RULE         = 'NO ACTION'        
  9862.     from
  9863.         sysobjects o1, sysobjects o2,
  9864.         syscolumns c1, syscolumns c2,
  9865.         sysreferences r
  9866.     where    
  9867.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  9868.     and    o1.name = @pk_table_name
  9869.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  9870.     and    o1.id = r.rkeyid
  9871.     and    o1.id = c1.id
  9872.     and    c1.colid = r.rkey1
  9873.     and     r.fkeyid = o2.id
  9874.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  9875.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  9876.     and    o2.id = c2.id    
  9877.     and    c2.colid = r.fkey1
  9878.     union all
  9879.     select
  9880.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  9881.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  9882.         PK_TABLE_NAME         = o1.name,
  9883.         PK_COLUMN_NAME         = c1.name,
  9884.         PK_COLUMN_GUID        = convert(binary(16),null),
  9885.         PK_COLUMN_PROPID    = convert(int,null),
  9886.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  9887.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  9888.         FK_TABLE_NAME         = o2.name,
  9889.         FK_COLUMN_NAME         = c2.name,
  9890.         FK_COLUMN_GUID        = convert(binary(16),null),
  9891.         FK_COLUMN_PROPID    = convert(int,null),
  9892.         ORDINAL            = convert(int,2),
  9893.         UPDATE_RULE        = 'NO ACTION',
  9894.         DELETE_RULE         = 'NO ACTION'        
  9895.     from
  9896.         sysobjects o1, sysobjects o2,
  9897.         syscolumns c1, syscolumns c2,
  9898.         sysreferences r
  9899.     where    
  9900.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  9901.     and    o1.name = @pk_table_name
  9902.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  9903.     and    o1.id = r.rkeyid
  9904.     and    o1.id = c1.id
  9905.     and    c1.colid = r.rkey2
  9906.     and    r.keycnt >= 2
  9907.     and     r.fkeyid = o2.id
  9908.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  9909.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  9910.     and    o2.id = c2.id    
  9911.     and    c2.colid = r.fkey2
  9912.     union all
  9913.     select
  9914.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  9915.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  9916.         PK_TABLE_NAME         = o1.name,
  9917.         PK_COLUMN_NAME         = c1.name,
  9918.         PK_COLUMN_GUID        = convert(binary(16),null),
  9919.         PK_COLUMN_PROPID    = convert(int,null),
  9920.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  9921.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  9922.         FK_TABLE_NAME         = o2.name,
  9923.         FK_COLUMN_NAME         = c2.name,
  9924.         FK_COLUMN_GUID        = convert(binary(16),null),
  9925.         FK_COLUMN_PROPID    = convert(int,null),
  9926.         ORDINAL            = convert(int,3),
  9927.         UPDATE_RULE        = 'NO ACTION',
  9928.         DELETE_RULE         = 'NO ACTION'        
  9929.     from
  9930.         sysobjects o1, sysobjects o2,
  9931.         syscolumns c1, syscolumns c2,
  9932.         sysreferences r
  9933.     where    
  9934.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  9935.     and    o1.name = @pk_table_name
  9936.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  9937.     and    o1.id = r.rkeyid
  9938.     and    o1.id = c1.id
  9939.     and    c1.colid = r.rkey3
  9940.     and    r.keycnt >= 3
  9941.     and     r.fkeyid = o2.id
  9942.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  9943.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  9944.     and    o2.id = c2.id    
  9945.     and    c2.colid = r.fkey3
  9946.     union all
  9947.     select
  9948.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  9949.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  9950.         PK_TABLE_NAME         = o1.name,
  9951.         PK_COLUMN_NAME         = c1.name,
  9952.         PK_COLUMN_GUID        = convert(binary(16),null),
  9953.         PK_COLUMN_PROPID    = convert(int,null),
  9954.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  9955.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  9956.         FK_TABLE_NAME         = o2.name,
  9957.         FK_COLUMN_NAME         = c2.name,
  9958.         FK_COLUMN_GUID        = convert(binary(16),null),
  9959.         FK_COLUMN_PROPID    = convert(int,null),
  9960.         ORDINAL            = convert(int,4),
  9961.         UPDATE_RULE        = 'NO ACTION',
  9962.         DELETE_RULE         = 'NO ACTION'        
  9963.     from
  9964.         sysobjects o1, sysobjects o2,
  9965.         syscolumns c1, syscolumns c2,
  9966.         sysreferences r
  9967.     where    
  9968.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  9969.     and    o1.name = @pk_table_name
  9970.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  9971.     and    o1.id = r.rkeyid
  9972.     and    r.keycnt >= 4
  9973.     and    o1.id = c1.id
  9974.     and    c1.colid = r.rkey4
  9975.     and     r.fkeyid = o2.id
  9976.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  9977.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  9978.     and    o2.id = c2.id    
  9979.     and    c2.colid = r.fkey4
  9980.     union all
  9981.     select
  9982.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  9983.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  9984.         PK_TABLE_NAME         = o1.name,
  9985.         PK_COLUMN_NAME         = c1.name,
  9986.         PK_COLUMN_GUID        = convert(binary(16),null),
  9987.         PK_COLUMN_PROPID    = convert(int,null),
  9988.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  9989.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  9990.         FK_TABLE_NAME         = o2.name,
  9991.         FK_COLUMN_NAME         = c2.name,
  9992.         FK_COLUMN_GUID        = convert(binary(16),null),
  9993.         FK_COLUMN_PROPID    = convert(int,null),
  9994.         ORDINAL            = convert(int,5),
  9995.         UPDATE_RULE        = 'NO ACTION',
  9996.         DELETE_RULE         = 'NO ACTION'        
  9997.     from
  9998.         sysobjects o1, sysobjects o2,
  9999.         syscolumns c1, syscolumns c2,
  10000.         sysreferences r
  10001.     where    
  10002.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10003.     and    o1.name = @pk_table_name
  10004.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10005.     and    o1.id = r.rkeyid
  10006.     and    r.keycnt >= 5
  10007.     and    o1.id = c1.id
  10008.     and    c1.colid = r.rkey5
  10009.     and     r.fkeyid = o2.id
  10010.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10011.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10012.     and    o2.id = c2.id    
  10013.     and    c2.colid = r.fkey5
  10014.     union all
  10015.     select
  10016.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10017.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10018.         PK_TABLE_NAME         = o1.name,
  10019.         PK_COLUMN_NAME         = c1.name,
  10020.         PK_COLUMN_GUID        = convert(binary(16),null),
  10021.         PK_COLUMN_PROPID    = convert(int,null),
  10022.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10023.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10024.         FK_TABLE_NAME         = o2.name,
  10025.         FK_COLUMN_NAME         = c2.name,
  10026.         FK_COLUMN_GUID        = convert(binary(16),null),
  10027.         FK_COLUMN_PROPID    = convert(int,null),
  10028.         ORDINAL            = convert(int,6),
  10029.         UPDATE_RULE        = 'NO ACTION',
  10030.         DELETE_RULE         = 'NO ACTION'        
  10031.     from
  10032.         sysobjects o1, sysobjects o2,
  10033.         syscolumns c1, syscolumns c2,
  10034.         sysreferences r
  10035.     where    
  10036.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10037.     and    o1.name = @pk_table_name
  10038.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10039.     and    o1.id = r.rkeyid
  10040.     and    r.keycnt >= 6
  10041.     and    o1.id = c1.id
  10042.     and    c1.colid = r.rkey6
  10043.     and     r.fkeyid = o2.id
  10044.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10045.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10046.     and    o2.id = c2.id    
  10047.     and    c2.colid = r.fkey6
  10048.     union all
  10049.     select
  10050.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10051.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10052.         PK_TABLE_NAME         = o1.name,
  10053.         PK_COLUMN_NAME         = c1.name,
  10054.         PK_COLUMN_GUID        = convert(binary(16),null),
  10055.         PK_COLUMN_PROPID    = convert(int,null),
  10056.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10057.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10058.         FK_TABLE_NAME         = o2.name,
  10059.         FK_COLUMN_NAME         = c2.name,
  10060.         FK_COLUMN_GUID        = convert(binary(16),null),
  10061.         FK_COLUMN_PROPID    = convert(int,null),
  10062.         ORDINAL            = convert(int,7),
  10063.         UPDATE_RULE        = 'NO ACTION',
  10064.         DELETE_RULE         = 'NO ACTION'        
  10065.     from
  10066.         sysobjects o1, sysobjects o2,
  10067.         syscolumns c1, syscolumns c2,
  10068.         sysreferences r
  10069.     where    
  10070.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10071.     and    o1.name = @pk_table_name
  10072.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10073.     and    o1.id = r.rkeyid
  10074.     and    r.keycnt >= 7
  10075.     and    o1.id = c1.id
  10076.     and    c1.colid = r.rkey7
  10077.     and     r.fkeyid = o2.id
  10078.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10079.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10080.     and    o2.id = c2.id    
  10081.     and    c2.colid = r.fkey7
  10082.     union all
  10083.     select
  10084.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10085.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10086.         PK_TABLE_NAME         = o1.name,
  10087.         PK_COLUMN_NAME         = c1.name,
  10088.         PK_COLUMN_GUID        = convert(binary(16),null),
  10089.         PK_COLUMN_PROPID    = convert(int,null),
  10090.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10091.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10092.         FK_TABLE_NAME         = o2.name,
  10093.         FK_COLUMN_NAME         = c2.name,
  10094.         FK_COLUMN_GUID        = convert(binary(16),null),
  10095.         FK_COLUMN_PROPID    = convert(int,null),
  10096.         ORDINAL            = convert(int,8),
  10097.         UPDATE_RULE        = 'NO ACTION',
  10098.         DELETE_RULE         = 'NO ACTION'        
  10099.     from
  10100.         sysobjects o1, sysobjects o2,
  10101.         syscolumns c1, syscolumns c2,
  10102.         sysreferences r
  10103.     where    
  10104.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10105.     and    o1.name = @pk_table_name
  10106.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10107.     and    o1.id = r.rkeyid
  10108.     and    r.keycnt >= 8
  10109.     and    o1.id = c1.id
  10110.     and    c1.colid = r.rkey8
  10111.     and     r.fkeyid = o2.id
  10112.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10113.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10114.     and    o2.id = c2.id    
  10115.     and    c2.colid = r.fkey8
  10116.     union all
  10117.     select
  10118.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10119.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10120.         PK_TABLE_NAME         = o1.name,
  10121.         PK_COLUMN_NAME         = c1.name,
  10122.         PK_COLUMN_GUID        = convert(binary(16),null),
  10123.         PK_COLUMN_PROPID    = convert(int,null),
  10124.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10125.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10126.         FK_TABLE_NAME         = o2.name,
  10127.         FK_COLUMN_NAME         = c2.name,
  10128.         FK_COLUMN_GUID        = convert(binary(16),null),
  10129.         FK_COLUMN_PROPID    = convert(int,null),
  10130.         ORDINAL            = convert(int,9),
  10131.         UPDATE_RULE        = 'NO ACTION',
  10132.         DELETE_RULE         = 'NO ACTION'        
  10133.     from
  10134.         sysobjects o1, sysobjects o2,
  10135.         syscolumns c1, syscolumns c2,
  10136.         sysreferences r
  10137.     where    
  10138.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10139.     and    o1.name = @pk_table_name
  10140.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10141.     and    o1.id = r.rkeyid
  10142.     and    r.keycnt >= 9
  10143.     and    o1.id = c1.id
  10144.     and    c1.colid = r.rkey9
  10145.     and     r.fkeyid = o2.id
  10146.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10147.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10148.     and    o2.id = c2.id    
  10149.     and    c2.colid = r.fkey9
  10150.     union all
  10151.     select
  10152.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10153.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10154.         PK_TABLE_NAME         = o1.name,
  10155.         PK_COLUMN_NAME         = c1.name,
  10156.         PK_COLUMN_GUID        = convert(binary(16),null),
  10157.         PK_COLUMN_PROPID    = convert(int,null),
  10158.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10159.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10160.         FK_TABLE_NAME         = o2.name,
  10161.         FK_COLUMN_NAME         = c2.name,
  10162.         FK_COLUMN_GUID        = convert(binary(16),null),
  10163.         FK_COLUMN_PROPID    = convert(int,null),
  10164.         ORDINAL            = convert(int,10),
  10165.         UPDATE_RULE        = 'NO ACTION',
  10166.         DELETE_RULE         = 'NO ACTION'        
  10167.     from
  10168.         sysobjects o1, sysobjects o2,
  10169.         syscolumns c1, syscolumns c2,
  10170.         sysreferences r
  10171.     where    
  10172.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10173.     and    o1.name = @pk_table_name
  10174.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10175.     and    o1.id = r.rkeyid
  10176.     and    r.keycnt >= 10
  10177.     and    o1.id = c1.id
  10178.     and    c1.colid = r.rkey10
  10179.     and     r.fkeyid = o2.id
  10180.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10181.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10182.     and    o2.id = c2.id    
  10183.     and    c2.colid = r.fkey10
  10184.     union all
  10185.     select
  10186.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10187.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10188.         PK_TABLE_NAME         = o1.name,
  10189.         PK_COLUMN_NAME         = c1.name,
  10190.         PK_COLUMN_GUID        = convert(binary(16),null),
  10191.         PK_COLUMN_PROPID    = convert(int,null),
  10192.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10193.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10194.         FK_TABLE_NAME         = o2.name,
  10195.         FK_COLUMN_NAME         = c2.name,
  10196.         FK_COLUMN_GUID        = convert(binary(16),null),
  10197.         FK_COLUMN_PROPID    = convert(int,null),
  10198.         ORDINAL            = convert(int,11),
  10199.         UPDATE_RULE        = 'NO ACTION',
  10200.         DELETE_RULE         = 'NO ACTION'        
  10201.     from
  10202.         sysobjects o1, sysobjects o2,
  10203.         syscolumns c1, syscolumns c2,
  10204.         sysreferences r
  10205.     where    
  10206.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10207.     and    o1.name = @pk_table_name
  10208.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10209.     and    o1.id = r.rkeyid
  10210.     and    r.keycnt >= 11
  10211.     and    o1.id = c1.id
  10212.     and    c1.colid = r.rkey11
  10213.     and     r.fkeyid = o2.id
  10214.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10215.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10216.     and    o2.id = c2.id    
  10217.     and    c2.colid = r.fkey11
  10218.     union all
  10219.     select
  10220.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10221.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10222.         PK_TABLE_NAME         = o1.name,
  10223.         PK_COLUMN_NAME         = c1.name,
  10224.         PK_COLUMN_GUID        = convert(binary(16),null),
  10225.         PK_COLUMN_PROPID    = convert(int,null),
  10226.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10227.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10228.         FK_TABLE_NAME         = o2.name,
  10229.         FK_COLUMN_NAME         = c2.name,
  10230.         FK_COLUMN_GUID        = convert(binary(16),null),
  10231.         FK_COLUMN_PROPID    = convert(int,null),
  10232.         ORDINAL            = convert(int,12),
  10233.         UPDATE_RULE        = 'NO ACTION',
  10234.         DELETE_RULE         = 'NO ACTION'        
  10235.     from
  10236.         sysobjects o1, sysobjects o2,
  10237.         syscolumns c1, syscolumns c2,
  10238.         sysreferences r
  10239.     where    
  10240.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10241.     and    o1.name = @pk_table_name
  10242.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10243.     and    o1.id = r.rkeyid
  10244.     and    r.keycnt >= 12
  10245.     and    o1.id = c1.id
  10246.     and    c1.colid = r.rkey12
  10247.     and     r.fkeyid = o2.id
  10248.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10249.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10250.     and    o2.id = c2.id    
  10251.     and    c2.colid = r.fkey12
  10252.     union all
  10253.     select
  10254.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10255.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10256.         PK_TABLE_NAME         = o1.name,
  10257.         PK_COLUMN_NAME         = c1.name,
  10258.         PK_COLUMN_GUID        = convert(binary(16),null),
  10259.         PK_COLUMN_PROPID    = convert(int,null),
  10260.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10261.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10262.         FK_TABLE_NAME         = o2.name,
  10263.         FK_COLUMN_NAME         = c2.name,
  10264.         FK_COLUMN_GUID        = convert(binary(16),null),
  10265.         FK_COLUMN_PROPID    = convert(int,null),
  10266.         ORDINAL            = convert(int,13),
  10267.         UPDATE_RULE        = 'NO ACTION',
  10268.         DELETE_RULE         = 'NO ACTION'        
  10269.     from
  10270.         sysobjects o1, sysobjects o2,
  10271.         syscolumns c1, syscolumns c2,
  10272.         sysreferences r
  10273.     where    
  10274.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10275.     and    o1.name = @pk_table_name
  10276.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10277.     and    o1.id = r.rkeyid
  10278.     and    r.keycnt >= 13
  10279.     and    o1.id = c1.id
  10280.     and    c1.colid = r.rkey13
  10281.     and     r.fkeyid = o2.id
  10282.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10283.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10284.     and    o2.id = c2.id    
  10285.     and    c2.colid = r.fkey13
  10286.     union all
  10287.     select
  10288.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10289.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10290.         PK_TABLE_NAME         = o1.name,
  10291.         PK_COLUMN_NAME         = c1.name,
  10292.         PK_COLUMN_GUID        = convert(binary(16),null),
  10293.         PK_COLUMN_PROPID    = convert(int,null),
  10294.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10295.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10296.         FK_TABLE_NAME         = o2.name,
  10297.         FK_COLUMN_NAME         = c2.name,
  10298.         FK_COLUMN_GUID        = convert(binary(16),null),
  10299.         FK_COLUMN_PROPID    = convert(int,null),
  10300.         ORDINAL            = convert(int,14),
  10301.         UPDATE_RULE        = 'NO ACTION',
  10302.         DELETE_RULE         = 'NO ACTION'        
  10303.     from
  10304.         sysobjects o1, sysobjects o2,
  10305.         syscolumns c1, syscolumns c2,
  10306.         sysreferences r
  10307.     where    
  10308.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10309.     and    o1.name = @pk_table_name
  10310.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10311.     and    o1.id = r.rkeyid
  10312.     and    r.keycnt >= 14
  10313.     and    o1.id = c1.id
  10314.     and    c1.colid = r.rkey14
  10315.     and     r.fkeyid = o2.id
  10316.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10317.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10318.     and    o2.id = c2.id    
  10319.     and    c2.colid = r.fkey14
  10320.     union all
  10321.     select
  10322.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10323.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10324.         PK_TABLE_NAME         = o1.name,
  10325.         PK_COLUMN_NAME         = c1.name,
  10326.         PK_COLUMN_GUID        = convert(binary(16),null),
  10327.         PK_COLUMN_PROPID    = convert(int,null),
  10328.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10329.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10330.         FK_TABLE_NAME         = o2.name,
  10331.         FK_COLUMN_NAME         = c2.name,
  10332.         FK_COLUMN_GUID        = convert(binary(16),null),
  10333.         FK_COLUMN_PROPID    = convert(int,null),
  10334.         ORDINAL            = convert(int,15),
  10335.         UPDATE_RULE        = 'NO ACTION',
  10336.         DELETE_RULE         = 'NO ACTION'        
  10337.     from
  10338.         sysobjects o1, sysobjects o2,
  10339.         syscolumns c1, syscolumns c2,
  10340.         sysreferences r
  10341.     where    
  10342.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10343.     and    o1.name = @pk_table_name
  10344.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10345.     and    o1.id = r.rkeyid
  10346.     and    r.keycnt >= 15
  10347.     and    o1.id = c1.id
  10348.     and    c1.colid = r.rkey15
  10349.     and     r.fkeyid = o2.id
  10350.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10351.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10352.     and    o2.id = c2.id    
  10353.     and    c2.colid = r.fkey15
  10354.     union all
  10355.     select
  10356.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10357.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10358.         PK_TABLE_NAME         = o1.name,
  10359.         PK_COLUMN_NAME         = c1.name,
  10360.         PK_COLUMN_GUID        = convert(binary(16),null),
  10361.         PK_COLUMN_PROPID    = convert(int,null),
  10362.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10363.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10364.         FK_TABLE_NAME         = o2.name,
  10365.         FK_COLUMN_NAME         = c2.name,
  10366.         FK_COLUMN_GUID        = convert(binary(16),null),
  10367.         FK_COLUMN_PROPID    = convert(int,null),
  10368.         ORDINAL            = convert(int,16),
  10369.         UPDATE_RULE        = 'NO ACTION',
  10370.         DELETE_RULE         = 'NO ACTION'        
  10371.     from
  10372.         sysobjects o1, sysobjects o2,
  10373.         syscolumns c1, syscolumns c2,
  10374.         sysreferences r
  10375.     where    
  10376.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10377.     and    o1.name = @pk_table_name
  10378.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10379.     and    o1.id = r.rkeyid
  10380.     and    r.keycnt >= 16
  10381.     and    o1.id = c1.id
  10382.     and    c1.colid = r.rkey16
  10383.     and     r.fkeyid = o2.id
  10384.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  10385.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10386.     and    o2.id = c2.id    
  10387.     and    c2.colid = r.fkey16
  10388.     order by 8,9,2,3,13
  10389.     END
  10390. ELSE IF @fk_table_name is not null
  10391.     BEGIN
  10392.     select
  10393.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10394.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10395.         PK_TABLE_NAME         = o1.name,
  10396.         PK_COLUMN_NAME         = c1.name,
  10397.         PK_COLUMN_GUID        = convert(binary(16),null),
  10398.         PK_COLUMN_PROPID    = convert(int,null),
  10399.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10400.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10401.         FK_TABLE_NAME         = o2.name,
  10402.         FK_COLUMN_NAME         = c2.name,
  10403.         FK_COLUMN_GUID        = convert(binary(16),null),
  10404.         FK_COLUMN_PROPID    = convert(int,null),
  10405.         ORDINAL            = convert(int,1),
  10406.         UPDATE_RULE        = 'NO ACTION',
  10407.         DELETE_RULE         = 'NO ACTION'        
  10408.     from
  10409.         sysobjects o1, sysobjects o2,
  10410.         syscolumns c1, syscolumns c2,
  10411.         sysreferences r
  10412.     where    
  10413.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10414.     and    o2.name = @fk_table_name
  10415.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10416.     and    o2.id = r.fkeyid
  10417.     and    o2.id = c2.id
  10418.     and    c2.colid = r.fkey1
  10419.     and     r.rkeyid = o1.id
  10420.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10421.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10422.     and    o1.id = c1.id    
  10423.     and    c1.colid = r.rkey1
  10424.     union    all
  10425.     select
  10426.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10427.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10428.         PK_TABLE_NAME         = o1.name,
  10429.         PK_COLUMN_NAME         = c1.name,
  10430.         PK_COLUMN_GUID        = convert(binary(16),null),
  10431.         PK_COLUMN_PROPID    = convert(int,null),
  10432.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10433.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10434.         FK_TABLE_NAME         = o2.name,
  10435.         FK_COLUMN_NAME         = c2.name,
  10436.         FK_COLUMN_GUID        = convert(binary(16),null),
  10437.         FK_COLUMN_PROPID    = convert(int,null),
  10438.         ORDINAL            = convert(int,2),
  10439.         UPDATE_RULE        = 'NO ACTION',
  10440.         DELETE_RULE         = 'NO ACTION'        
  10441.     from
  10442.         sysobjects o1, sysobjects o2,
  10443.         syscolumns c1, syscolumns c2,
  10444.         sysreferences r
  10445.     where    
  10446.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10447.     and    o2.name = @fk_table_name
  10448.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10449.     and    o2.id = r.fkeyid
  10450.     and    r.keycnt >= 2
  10451.     and    o2.id = c2.id
  10452.     and    c2.colid = r.fkey2
  10453.     and     r.rkeyid = o1.id
  10454.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10455.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10456.     and    o1.id = c1.id    
  10457.     and    c1.colid = r.rkey2
  10458.     union    all
  10459.     select
  10460.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10461.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10462.         PK_TABLE_NAME         = o1.name,
  10463.         PK_COLUMN_NAME         = c1.name,
  10464.         PK_COLUMN_GUID        = convert(binary(16),null),
  10465.         PK_COLUMN_PROPID    = convert(int,null),
  10466.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10467.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10468.         FK_TABLE_NAME         = o2.name,
  10469.         FK_COLUMN_NAME         = c2.name,
  10470.         FK_COLUMN_GUID        = convert(binary(16),null),
  10471.         FK_COLUMN_PROPID    = convert(int,null),
  10472.         ORDINAL            = convert(int,3),
  10473.         UPDATE_RULE        = 'NO ACTION',
  10474.         DELETE_RULE         = 'NO ACTION'        
  10475.     from
  10476.         sysobjects o1, sysobjects o2,
  10477.         syscolumns c1, syscolumns c2,
  10478.         sysreferences r
  10479.     where    
  10480.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10481.     and    o2.name = @fk_table_name
  10482.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10483.     and    o2.id = r.fkeyid
  10484.     and    r.keycnt >= 3
  10485.     and    o2.id = c2.id
  10486.     and    c2.colid = r.fkey3
  10487.     and     r.rkeyid = o1.id
  10488.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10489.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10490.     and    o1.id = c1.id    
  10491.     and    c1.colid = r.rkey3
  10492.     union    all
  10493.     select
  10494.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10495.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10496.         PK_TABLE_NAME         = o1.name,
  10497.         PK_COLUMN_NAME         = c1.name,
  10498.         PK_COLUMN_GUID        = convert(binary(16),null),
  10499.         PK_COLUMN_PROPID    = convert(int,null),
  10500.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10501.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10502.         FK_TABLE_NAME         = o2.name,
  10503.         FK_COLUMN_NAME         = c2.name,
  10504.         FK_COLUMN_GUID        = convert(binary(16),null),
  10505.         FK_COLUMN_PROPID    = convert(int,null),
  10506.         ORDINAL            = convert(int,4),
  10507.         UPDATE_RULE        = 'NO ACTION',
  10508.         DELETE_RULE         = 'NO ACTION'        
  10509.     from
  10510.         sysobjects o1, sysobjects o2,
  10511.         syscolumns c1, syscolumns c2,
  10512.         sysreferences r
  10513.     where    
  10514.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10515.     and    o2.name = @fk_table_name
  10516.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10517.     and    o2.id = r.fkeyid
  10518.     and    r.keycnt >= 4
  10519.     and    o2.id = c2.id
  10520.     and    c2.colid = r.fkey4
  10521.     and     r.rkeyid = o1.id
  10522.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10523.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10524.     and    o1.id = c1.id    
  10525.     and    c1.colid = r.rkey4
  10526.     union    all
  10527.     select
  10528.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10529.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10530.         PK_TABLE_NAME         = o1.name,
  10531.         PK_COLUMN_NAME         = c1.name,
  10532.         PK_COLUMN_GUID        = convert(binary(16),null),
  10533.         PK_COLUMN_PROPID    = convert(int,null),
  10534.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10535.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10536.         FK_TABLE_NAME         = o2.name,
  10537.         FK_COLUMN_NAME         = c2.name,
  10538.         FK_COLUMN_GUID        = convert(binary(16),null),
  10539.         FK_COLUMN_PROPID    = convert(int,null),
  10540.         ORDINAL            = convert(int,5),
  10541.         UPDATE_RULE        = 'NO ACTION',
  10542.         DELETE_RULE         = 'NO ACTION'        
  10543.     from
  10544.         sysobjects o1, sysobjects o2,
  10545.         syscolumns c1, syscolumns c2,
  10546.         sysreferences r
  10547.     where    
  10548.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10549.     and    o2.name = @fk_table_name
  10550.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10551.     and    o2.id = r.fkeyid
  10552.     and    r.keycnt >= 5
  10553.     and    o2.id = c2.id
  10554.     and    c2.colid = r.fkey5
  10555.     and     r.rkeyid = o1.id
  10556.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10557.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10558.     and    o1.id = c1.id    
  10559.     and    c1.colid = r.rkey5
  10560.     union    all
  10561.     select
  10562.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10563.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10564.         PK_TABLE_NAME         = o1.name,
  10565.         PK_COLUMN_NAME         = c1.name,
  10566.         PK_COLUMN_GUID        = convert(binary(16),null),
  10567.         PK_COLUMN_PROPID    = convert(int,null),
  10568.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10569.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10570.         FK_TABLE_NAME         = o2.name,
  10571.         FK_COLUMN_NAME         = c2.name,
  10572.         FK_COLUMN_GUID        = convert(binary(16),null),
  10573.         FK_COLUMN_PROPID    = convert(int,null),
  10574.         ORDINAL            = convert(int,6),
  10575.         UPDATE_RULE        = 'NO ACTION',
  10576.         DELETE_RULE         = 'NO ACTION'        
  10577.     from
  10578.         sysobjects o1, sysobjects o2,
  10579.         syscolumns c1, syscolumns c2,
  10580.         sysreferences r
  10581.     where    
  10582.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10583.     and    o2.name = @fk_table_name
  10584.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10585.     and    o2.id = r.fkeyid
  10586.     and    r.keycnt >= 6
  10587.     and    o2.id = c2.id
  10588.     and    c2.colid = r.fkey6
  10589.     and     r.rkeyid = o1.id
  10590.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10591.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10592.     and    o1.id = c1.id    
  10593.     and    c1.colid = r.rkey6
  10594.     union    all
  10595.     select
  10596.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10597.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10598.         PK_TABLE_NAME         = o1.name,
  10599.         PK_COLUMN_NAME         = c1.name,
  10600.         PK_COLUMN_GUID        = convert(binary(16),null),
  10601.         PK_COLUMN_PROPID    = convert(int,null),
  10602.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10603.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10604.         FK_TABLE_NAME         = o2.name,
  10605.         FK_COLUMN_NAME         = c2.name,
  10606.         FK_COLUMN_GUID        = convert(binary(16),null),
  10607.         FK_COLUMN_PROPID    = convert(int,null),
  10608.         ORDINAL            = convert(int,7),
  10609.         UPDATE_RULE        = 'NO ACTION',
  10610.         DELETE_RULE         = 'NO ACTION'        
  10611.     from
  10612.         sysobjects o1, sysobjects o2,
  10613.         syscolumns c1, syscolumns c2,
  10614.         sysreferences r
  10615.     where    
  10616.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10617.     and    o2.name = @fk_table_name
  10618.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10619.     and    o2.id = r.fkeyid
  10620.     and    r.keycnt >= 7
  10621.     and    o2.id = c2.id
  10622.     and    c2.colid = r.fkey7
  10623.     and     r.rkeyid = o1.id
  10624.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10625.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10626.     and    o1.id = c1.id    
  10627.     and    c1.colid = r.rkey7
  10628.     union    all
  10629.     select
  10630.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10631.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10632.         PK_TABLE_NAME         = o1.name,
  10633.         PK_COLUMN_NAME         = c1.name,
  10634.         PK_COLUMN_GUID        = convert(binary(16),null),
  10635.         PK_COLUMN_PROPID    = convert(int,null),
  10636.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10637.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10638.         FK_TABLE_NAME         = o2.name,
  10639.         FK_COLUMN_NAME         = c2.name,
  10640.         FK_COLUMN_GUID        = convert(binary(16),null),
  10641.         FK_COLUMN_PROPID    = convert(int,null),
  10642.         ORDINAL            = convert(int,8),
  10643.         UPDATE_RULE        = 'NO ACTION',
  10644.         DELETE_RULE         = 'NO ACTION'        
  10645.     from
  10646.         sysobjects o1, sysobjects o2,
  10647.         syscolumns c1, syscolumns c2,
  10648.         sysreferences r
  10649.     where    
  10650.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10651.     and    o2.name = @fk_table_name
  10652.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10653.     and    o2.id = r.fkeyid
  10654.     and    r.keycnt >= 8
  10655.     and    o2.id = c2.id
  10656.     and    c2.colid = r.fkey8
  10657.     and     r.rkeyid = o1.id
  10658.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10659.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10660.     and    o1.id = c1.id    
  10661.     and    c1.colid = r.rkey8
  10662.     union    all
  10663.     select
  10664.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10665.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10666.         PK_TABLE_NAME         = o1.name,
  10667.         PK_COLUMN_NAME         = c1.name,
  10668.         PK_COLUMN_GUID        = convert(binary(16),null),
  10669.         PK_COLUMN_PROPID    = convert(int,null),
  10670.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10671.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10672.         FK_TABLE_NAME         = o2.name,
  10673.         FK_COLUMN_NAME         = c2.name,
  10674.         FK_COLUMN_GUID        = convert(binary(16),null),
  10675.         FK_COLUMN_PROPID    = convert(int,null),
  10676.         ORDINAL            = convert(int,9),
  10677.         UPDATE_RULE        = 'NO ACTION',
  10678.         DELETE_RULE         = 'NO ACTION'        
  10679.     from
  10680.         sysobjects o1, sysobjects o2,
  10681.         syscolumns c1, syscolumns c2,
  10682.         sysreferences r
  10683.     where    
  10684.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10685.     and    o2.name = @fk_table_name
  10686.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10687.     and    o2.id = r.fkeyid
  10688.     and    r.keycnt >= 9
  10689.     and    o2.id = c2.id
  10690.     and    c2.colid = r.fkey9
  10691.     and     r.rkeyid = o1.id
  10692.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10693.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10694.     and    o1.id = c1.id    
  10695.     and    c1.colid = r.rkey9
  10696.     union    all
  10697.     select
  10698.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10699.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10700.         PK_TABLE_NAME         = o1.name,
  10701.         PK_COLUMN_NAME         = c1.name,
  10702.         PK_COLUMN_GUID        = convert(binary(16),null),
  10703.         PK_COLUMN_PROPID    = convert(int,null),
  10704.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10705.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10706.         FK_TABLE_NAME         = o2.name,
  10707.         FK_COLUMN_NAME         = c2.name,
  10708.         FK_COLUMN_GUID        = convert(binary(16),null),
  10709.         FK_COLUMN_PROPID    = convert(int,null),
  10710.         ORDINAL            = convert(int,10),
  10711.         UPDATE_RULE        = 'NO ACTION',
  10712.         DELETE_RULE         = 'NO ACTION'        
  10713.     from
  10714.         sysobjects o1, sysobjects o2,
  10715.         syscolumns c1, syscolumns c2,
  10716.         sysreferences r
  10717.     where    
  10718.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10719.     and    o2.name = @fk_table_name
  10720.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10721.     and    o2.id = r.fkeyid
  10722.     and    r.keycnt >= 10
  10723.     and    o2.id = c2.id
  10724.     and    c2.colid = r.fkey10
  10725.     and     r.rkeyid = o1.id
  10726.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10727.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10728.     and    o1.id = c1.id    
  10729.     and    c1.colid = r.rkey10
  10730.     union    all
  10731.     select
  10732.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10733.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10734.         PK_TABLE_NAME         = o1.name,
  10735.         PK_COLUMN_NAME         = c1.name,
  10736.         PK_COLUMN_GUID        = convert(binary(16),null),
  10737.         PK_COLUMN_PROPID    = convert(int,null),
  10738.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10739.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10740.         FK_TABLE_NAME         = o2.name,
  10741.         FK_COLUMN_NAME         = c2.name,
  10742.         FK_COLUMN_GUID        = convert(binary(16),null),
  10743.         FK_COLUMN_PROPID    = convert(int,null),
  10744.         ORDINAL            = convert(int,11),
  10745.         UPDATE_RULE        = 'NO ACTION',
  10746.         DELETE_RULE         = 'NO ACTION'        
  10747.     from
  10748.         sysobjects o1, sysobjects o2,
  10749.         syscolumns c1, syscolumns c2,
  10750.         sysreferences r
  10751.     where    
  10752.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10753.     and    o2.name = @fk_table_name
  10754.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10755.     and    o2.id = r.fkeyid
  10756.     and    r.keycnt >= 11
  10757.     and    o2.id = c2.id
  10758.     and    c2.colid = r.fkey11
  10759.     and     r.rkeyid = o1.id
  10760.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10761.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10762.     and    o1.id = c1.id    
  10763.     and    c1.colid = r.rkey11
  10764.     union    all
  10765.     select
  10766.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10767.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10768.         PK_TABLE_NAME         = o1.name,
  10769.         PK_COLUMN_NAME         = c1.name,
  10770.         PK_COLUMN_GUID        = convert(binary(16),null),
  10771.         PK_COLUMN_PROPID    = convert(int,null),
  10772.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10773.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10774.         FK_TABLE_NAME         = o2.name,
  10775.         FK_COLUMN_NAME         = c2.name,
  10776.         FK_COLUMN_GUID        = convert(binary(16),null),
  10777.         FK_COLUMN_PROPID    = convert(int,null),
  10778.         ORDINAL            = convert(int,12),
  10779.         UPDATE_RULE        = 'NO ACTION',
  10780.         DELETE_RULE         = 'NO ACTION'        
  10781.     from
  10782.         sysobjects o1, sysobjects o2,
  10783.         syscolumns c1, syscolumns c2,
  10784.         sysreferences r
  10785.     where    
  10786.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10787.     and    o2.name = @fk_table_name
  10788.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10789.     and    o2.id = r.fkeyid
  10790.     and    r.keycnt >= 12
  10791.     and    o2.id = c2.id
  10792.     and    c2.colid = r.fkey12
  10793.     and     r.rkeyid = o1.id
  10794.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10795.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10796.     and    o1.id = c1.id    
  10797.     and    c1.colid = r.rkey12
  10798.     union    all
  10799.     select
  10800.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10801.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10802.         PK_TABLE_NAME         = o1.name,
  10803.         PK_COLUMN_NAME         = c1.name,
  10804.         PK_COLUMN_GUID        = convert(binary(16),null),
  10805.         PK_COLUMN_PROPID    = convert(int,null),
  10806.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10807.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10808.         FK_TABLE_NAME         = o2.name,
  10809.         FK_COLUMN_NAME         = c2.name,
  10810.         FK_COLUMN_GUID        = convert(binary(16),null),
  10811.         FK_COLUMN_PROPID    = convert(int,null),
  10812.         ORDINAL            = convert(int,13),
  10813.         UPDATE_RULE        = 'NO ACTION',
  10814.         DELETE_RULE         = 'NO ACTION'        
  10815.     from
  10816.         sysobjects o1, sysobjects o2,
  10817.         syscolumns c1, syscolumns c2,
  10818.         sysreferences r
  10819.     where    
  10820.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10821.     and    o2.name = @fk_table_name
  10822.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10823.     and    o2.id = r.fkeyid
  10824.     and    r.keycnt >= 13
  10825.     and    o2.id = c2.id
  10826.     and    c2.colid = r.fkey13
  10827.     and     r.rkeyid = o1.id
  10828.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10829.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10830.     and    o1.id = c1.id    
  10831.     and    c1.colid = r.rkey13
  10832.     union    all
  10833.     select
  10834.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10835.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10836.         PK_TABLE_NAME         = o1.name,
  10837.         PK_COLUMN_NAME         = c1.name,
  10838.         PK_COLUMN_GUID        = convert(binary(16),null),
  10839.         PK_COLUMN_PROPID    = convert(int,null),
  10840.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10841.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10842.         FK_TABLE_NAME         = o2.name,
  10843.         FK_COLUMN_NAME         = c2.name,
  10844.         FK_COLUMN_GUID        = convert(binary(16),null),
  10845.         FK_COLUMN_PROPID    = convert(int,null),
  10846.         ORDINAL            = convert(int,14),
  10847.         UPDATE_RULE        = 'NO ACTION',
  10848.         DELETE_RULE         = 'NO ACTION'        
  10849.     from
  10850.         sysobjects o1, sysobjects o2,
  10851.         syscolumns c1, syscolumns c2,
  10852.         sysreferences r
  10853.     where    
  10854.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10855.     and    o2.name = @fk_table_name
  10856.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10857.     and    o2.id = r.fkeyid
  10858.     and    r.keycnt >= 14
  10859.     and    o2.id = c2.id
  10860.     and    c2.colid = r.fkey14
  10861.     and     r.rkeyid = o1.id
  10862.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10863.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10864.     and    o1.id = c1.id    
  10865.     and    c1.colid = r.rkey14
  10866.     union    all
  10867.     select
  10868.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10869.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10870.         PK_TABLE_NAME         = o1.name,
  10871.         PK_COLUMN_NAME         = c1.name,
  10872.         PK_COLUMN_GUID        = convert(binary(16),null),
  10873.         PK_COLUMN_PROPID    = convert(int,null),
  10874.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10875.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10876.         FK_TABLE_NAME         = o2.name,
  10877.         FK_COLUMN_NAME         = c2.name,
  10878.         FK_COLUMN_GUID        = convert(binary(16),null),
  10879.         FK_COLUMN_PROPID    = convert(int,null),
  10880.         ORDINAL            = convert(int,15),
  10881.         UPDATE_RULE        = 'NO ACTION',
  10882.         DELETE_RULE         = 'NO ACTION'        
  10883.     from
  10884.         sysobjects o1, sysobjects o2,
  10885.         syscolumns c1, syscolumns c2,
  10886.         sysreferences r
  10887.     where    
  10888.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10889.     and    o2.name = @fk_table_name
  10890.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10891.     and    o2.id = r.fkeyid
  10892.     and    r.keycnt >= 15
  10893.     and    o2.id = c2.id
  10894.     and    c2.colid = r.fkey15
  10895.     and     r.rkeyid = o1.id
  10896.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10897.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10898.     and    o1.id = c1.id    
  10899.     and    c1.colid = r.rkey15
  10900.     union    all
  10901.     select
  10902.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10903.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10904.         PK_TABLE_NAME         = o1.name,
  10905.         PK_COLUMN_NAME         = c1.name,
  10906.         PK_COLUMN_GUID        = convert(binary(16),null),
  10907.         PK_COLUMN_PROPID    = convert(int,null),
  10908.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10909.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10910.         FK_TABLE_NAME         = o2.name,
  10911.         FK_COLUMN_NAME         = c2.name,
  10912.         FK_COLUMN_GUID        = convert(binary(16),null),
  10913.         FK_COLUMN_PROPID    = convert(int,null),
  10914.         ORDINAL            = convert(int,16),
  10915.         UPDATE_RULE        = 'NO ACTION',
  10916.         DELETE_RULE         = 'NO ACTION'        
  10917.     from
  10918.         sysobjects o1, sysobjects o2,
  10919.         syscolumns c1, syscolumns c2,
  10920.         sysreferences r
  10921.     where    
  10922.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10923.     and    o2.name = @fk_table_name
  10924.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10925.     and    o2.id = r.fkeyid
  10926.     and    r.keycnt >= 16
  10927.     and    o2.id = c2.id
  10928.     and    c2.colid = r.fkey16
  10929.     and     r.rkeyid = o1.id
  10930.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  10931.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10932.     and    o1.id = c1.id    
  10933.     and    c1.colid = r.rkey16
  10934.     order by 8,9,2,3,13
  10935.     END
  10936. ELSE
  10937.     BEGIN
  10938.     select
  10939.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10940.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10941.         PK_TABLE_NAME         = o1.name,
  10942.         PK_COLUMN_NAME         = c1.name,
  10943.         PK_COLUMN_GUID        = convert(binary(16),null),
  10944.         PK_COLUMN_PROPID    = convert(int,null),
  10945.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10946.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10947.         FK_TABLE_NAME         = o2.name,
  10948.         FK_COLUMN_NAME         = c2.name,
  10949.         FK_COLUMN_GUID        = convert(binary(16),null),
  10950.         FK_COLUMN_PROPID    = convert(int,null),
  10951.         ORDINAL            = convert(int,1),
  10952.         UPDATE_RULE        = 'NO ACTION',
  10953.         DELETE_RULE         = 'NO ACTION'        
  10954.     from
  10955.         sysobjects o1, sysobjects o2,
  10956.         syscolumns c1, syscolumns c2,
  10957.         sysreferences r
  10958.     where    
  10959.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10960.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10961.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10962.     and    o1.id = r.rkeyid
  10963.     and    o1.id = c1.id
  10964.     and    c1.colid = r.rkey1
  10965.     and     r.fkeyid = o2.id
  10966.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  10967.     and    o2.id = c2.id    
  10968.     and    c2.colid = r.fkey1
  10969.     union all
  10970.     select
  10971.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  10972.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  10973.         PK_TABLE_NAME         = o1.name,
  10974.         PK_COLUMN_NAME         = c1.name,
  10975.         PK_COLUMN_GUID        = convert(binary(16),null),
  10976.         PK_COLUMN_PROPID    = convert(int,null),
  10977.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  10978.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  10979.         FK_TABLE_NAME         = o2.name,
  10980.         FK_COLUMN_NAME         = c2.name,
  10981.         FK_COLUMN_GUID        = convert(binary(16),null),
  10982.         FK_COLUMN_PROPID    = convert(int,null),
  10983.         ORDINAL            = convert(int,2),
  10984.         UPDATE_RULE        = 'NO ACTION',
  10985.         DELETE_RULE         = 'NO ACTION'        
  10986.     from
  10987.         sysobjects o1, sysobjects o2,
  10988.         syscolumns c1, syscolumns c2,
  10989.         sysreferences r
  10990.     where    
  10991.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  10992.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  10993.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  10994.     and    o1.id = r.rkeyid
  10995.     and    r.keycnt >= 2
  10996.     and    o1.id = c1.id
  10997.     and    c1.colid = r.rkey2
  10998.     and     r.fkeyid = o2.id
  10999.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11000.     and    o2.id = c2.id    
  11001.     and    c2.colid = r.fkey2
  11002.     union all
  11003.     select
  11004.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11005.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11006.         PK_TABLE_NAME         = o1.name,
  11007.         PK_COLUMN_NAME         = c1.name,
  11008.         PK_COLUMN_GUID        = convert(binary(16),null),
  11009.         PK_COLUMN_PROPID    = convert(int,null),
  11010.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11011.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11012.         FK_TABLE_NAME         = o2.name,
  11013.         FK_COLUMN_NAME         = c2.name,
  11014.         FK_COLUMN_GUID        = convert(binary(16),null),
  11015.         FK_COLUMN_PROPID    = convert(int,null),
  11016.         ORDINAL            = convert(int,3),
  11017.         UPDATE_RULE        = 'NO ACTION',
  11018.         DELETE_RULE         = 'NO ACTION'        
  11019.     from
  11020.         sysobjects o1, sysobjects o2,
  11021.         syscolumns c1, syscolumns c2,
  11022.         sysreferences r
  11023.     where    
  11024.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11025.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11026.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11027.     and    o1.id = r.rkeyid
  11028.     and    r.keycnt >= 3
  11029.     and    o1.id = c1.id
  11030.     and    c1.colid = r.rkey3
  11031.     and     r.fkeyid = o2.id
  11032.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11033.     and    o2.id = c2.id    
  11034.     and    c2.colid = r.fkey3
  11035.     union all
  11036.     select
  11037.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11038.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11039.         PK_TABLE_NAME         = o1.name,
  11040.         PK_COLUMN_NAME         = c1.name,
  11041.         PK_COLUMN_GUID        = convert(binary(16),null),
  11042.         PK_COLUMN_PROPID    = convert(int,null),
  11043.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11044.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11045.         FK_TABLE_NAME         = o2.name,
  11046.         FK_COLUMN_NAME         = c2.name,
  11047.         FK_COLUMN_GUID        = convert(binary(16),null),
  11048.         FK_COLUMN_PROPID    = convert(int,null),
  11049.         ORDINAL            = convert(int,4),
  11050.         UPDATE_RULE        = 'NO ACTION',
  11051.         DELETE_RULE         = 'NO ACTION'        
  11052.     from
  11053.         sysobjects o1, sysobjects o2,
  11054.         syscolumns c1, syscolumns c2,
  11055.         sysreferences r
  11056.     where    
  11057.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11058.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11059.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11060.     and    o1.id = r.rkeyid
  11061.     and    r.keycnt >= 4
  11062.     and    o1.id = c1.id
  11063.     and    c1.colid = r.rkey4
  11064.     and     r.fkeyid = o2.id
  11065.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11066.     and    o2.id = c2.id    
  11067.     and    c2.colid = r.fkey4
  11068.     union all
  11069.     select
  11070.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11071.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11072.         PK_TABLE_NAME         = o1.name,
  11073.         PK_COLUMN_NAME         = c1.name,
  11074.         PK_COLUMN_GUID        = convert(binary(16),null),
  11075.         PK_COLUMN_PROPID    = convert(int,null),
  11076.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11077.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11078.         FK_TABLE_NAME         = o2.name,
  11079.         FK_COLUMN_NAME         = c2.name,
  11080.         FK_COLUMN_GUID        = convert(binary(16),null),
  11081.         FK_COLUMN_PROPID    = convert(int,null),
  11082.         ORDINAL            = convert(int,5),
  11083.         UPDATE_RULE        = 'NO ACTION',
  11084.         DELETE_RULE         = 'NO ACTION'        
  11085.     from
  11086.         sysobjects o1, sysobjects o2,
  11087.         syscolumns c1, syscolumns c2,
  11088.         sysreferences r
  11089.     where    
  11090.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11091.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11092.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11093.     and    o1.id = r.rkeyid
  11094.     and    r.keycnt >= 5
  11095.     and    o1.id = c1.id
  11096.     and    c1.colid = r.rkey5
  11097.     and     r.fkeyid = o2.id
  11098.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11099.     and    o2.id = c2.id    
  11100.     and    c2.colid = r.fkey5
  11101.     union all
  11102.     select
  11103.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11104.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11105.         PK_TABLE_NAME         = o1.name,
  11106.         PK_COLUMN_NAME         = c1.name,
  11107.         PK_COLUMN_GUID        = convert(binary(16),null),
  11108.         PK_COLUMN_PROPID    = convert(int,null),
  11109.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11110.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11111.         FK_TABLE_NAME         = o2.name,
  11112.         FK_COLUMN_NAME         = c2.name,
  11113.         FK_COLUMN_GUID        = convert(binary(16),null),
  11114.         FK_COLUMN_PROPID    = convert(int,null),
  11115.         ORDINAL            = convert(int,6),
  11116.         UPDATE_RULE        = 'NO ACTION',
  11117.         DELETE_RULE         = 'NO ACTION'        
  11118.     from
  11119.         sysobjects o1, sysobjects o2,
  11120.         syscolumns c1, syscolumns c2,
  11121.         sysreferences r
  11122.     where    
  11123.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11124.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11125.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11126.     and    o1.id = r.rkeyid
  11127.     and    r.keycnt >= 6
  11128.     and    o1.id = c1.id
  11129.     and    c1.colid = r.rkey6
  11130.     and     r.fkeyid = o2.id
  11131.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11132.     and    o2.id = c2.id    
  11133.     and    c2.colid = r.fkey6
  11134.     union all
  11135.     select
  11136.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11137.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11138.         PK_TABLE_NAME         = o1.name,
  11139.         PK_COLUMN_NAME         = c1.name,
  11140.         PK_COLUMN_GUID        = convert(binary(16),null),
  11141.         PK_COLUMN_PROPID    = convert(int,null),
  11142.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11143.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11144.         FK_TABLE_NAME         = o2.name,
  11145.         FK_COLUMN_NAME         = c2.name,
  11146.         FK_COLUMN_GUID        = convert(binary(16),null),
  11147.         FK_COLUMN_PROPID    = convert(int,null),
  11148.         ORDINAL            = convert(int,7),
  11149.         UPDATE_RULE        = 'NO ACTION',
  11150.         DELETE_RULE         = 'NO ACTION'        
  11151.     from
  11152.         sysobjects o1, sysobjects o2,
  11153.         syscolumns c1, syscolumns c2,
  11154.         sysreferences r
  11155.     where    
  11156.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11157.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11158.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11159.     and    o1.id = r.rkeyid
  11160.     and    r.keycnt >= 7
  11161.     and    o1.id = c1.id
  11162.     and    c1.colid = r.rkey7
  11163.     and     r.fkeyid = o2.id
  11164.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11165.     and    o2.id = c2.id    
  11166.     and    c2.colid = r.fkey7
  11167.     union all
  11168.     select
  11169.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11170.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11171.         PK_TABLE_NAME         = o1.name,
  11172.         PK_COLUMN_NAME         = c1.name,
  11173.         PK_COLUMN_GUID        = convert(binary(16),null),
  11174.         PK_COLUMN_PROPID    = convert(int,null),
  11175.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11176.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11177.         FK_TABLE_NAME         = o2.name,
  11178.         FK_COLUMN_NAME         = c2.name,
  11179.         FK_COLUMN_GUID        = convert(binary(16),null),
  11180.         FK_COLUMN_PROPID    = convert(int,null),
  11181.         ORDINAL            = convert(int,8),
  11182.         UPDATE_RULE        = 'NO ACTION',
  11183.         DELETE_RULE         = 'NO ACTION'        
  11184.     from
  11185.         sysobjects o1, sysobjects o2,
  11186.         syscolumns c1, syscolumns c2,
  11187.         sysreferences r
  11188.     where    
  11189.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11190.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11191.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11192.     and    o1.id = r.rkeyid
  11193.     and    r.keycnt >= 8
  11194.     and    o1.id = c1.id
  11195.     and    c1.colid = r.rkey8
  11196.     and     r.fkeyid = o2.id
  11197.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11198.     and    o2.id = c2.id    
  11199.     and    c2.colid = r.fkey8
  11200.     union all
  11201.     select
  11202.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11203.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11204.         PK_TABLE_NAME         = o1.name,
  11205.         PK_COLUMN_NAME         = c1.name,
  11206.         PK_COLUMN_GUID        = convert(binary(16),null),
  11207.         PK_COLUMN_PROPID    = convert(int,null),
  11208.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11209.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11210.         FK_TABLE_NAME         = o2.name,
  11211.         FK_COLUMN_NAME         = c2.name,
  11212.         FK_COLUMN_GUID        = convert(binary(16),null),
  11213.         FK_COLUMN_PROPID    = convert(int,null),
  11214.         ORDINAL            = convert(int,9),
  11215.         UPDATE_RULE        = 'NO ACTION',
  11216.         DELETE_RULE         = 'NO ACTION'        
  11217.     from
  11218.         sysobjects o1, sysobjects o2,
  11219.         syscolumns c1, syscolumns c2,
  11220.         sysreferences r
  11221.     where    
  11222.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11223.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11224.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11225.     and    o1.id = r.rkeyid
  11226.     and    r.keycnt >= 9
  11227.     and    o1.id = c1.id
  11228.     and    c1.colid = r.rkey9
  11229.     and     r.fkeyid = o2.id
  11230.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11231.     and    o2.id = c2.id    
  11232.     and    c2.colid = r.fkey9
  11233.     union all
  11234.     select
  11235.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11236.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11237.         PK_TABLE_NAME         = o1.name,
  11238.         PK_COLUMN_NAME         = c1.name,
  11239.         PK_COLUMN_GUID        = convert(binary(16),null),
  11240.         PK_COLUMN_PROPID    = convert(int,null),
  11241.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11242.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11243.         FK_TABLE_NAME         = o2.name,
  11244.         FK_COLUMN_NAME         = c2.name,
  11245.         FK_COLUMN_GUID        = convert(binary(16),null),
  11246.         FK_COLUMN_PROPID    = convert(int,null),
  11247.         ORDINAL            = convert(int,10),
  11248.         UPDATE_RULE        = 'NO ACTION',
  11249.         DELETE_RULE         = 'NO ACTION'        
  11250.     from
  11251.         sysobjects o1, sysobjects o2,
  11252.         syscolumns c1, syscolumns c2,
  11253.         sysreferences r
  11254.     where    
  11255.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11256.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11257.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11258.     and    o1.id = r.rkeyid
  11259.     and    r.keycnt >= 10
  11260.     and    o1.id = c1.id
  11261.     and    c1.colid = r.rkey10
  11262.     and     r.fkeyid = o2.id
  11263.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11264.     and    o2.id = c2.id    
  11265.     and    c2.colid = r.fkey10
  11266.     union all
  11267.     select
  11268.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11269.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11270.         PK_TABLE_NAME         = o1.name,
  11271.         PK_COLUMN_NAME         = c1.name,
  11272.         PK_COLUMN_GUID        = convert(binary(16),null),
  11273.         PK_COLUMN_PROPID    = convert(int,null),
  11274.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11275.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11276.         FK_TABLE_NAME         = o2.name,
  11277.         FK_COLUMN_NAME         = c2.name,
  11278.         FK_COLUMN_GUID        = convert(binary(16),null),
  11279.         FK_COLUMN_PROPID    = convert(int,null),
  11280.         ORDINAL            = convert(int,11),
  11281.         UPDATE_RULE        = 'NO ACTION',
  11282.         DELETE_RULE         = 'NO ACTION'        
  11283.     from
  11284.         sysobjects o1, sysobjects o2,
  11285.         syscolumns c1, syscolumns c2,
  11286.         sysreferences r
  11287.     where    
  11288.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11289.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11290.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11291.     and    o1.id = r.rkeyid
  11292.     and    r.keycnt >= 11
  11293.     and    o1.id = c1.id
  11294.     and    c1.colid = r.rkey11
  11295.     and     r.fkeyid = o2.id
  11296.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11297.     and    o2.id = c2.id    
  11298.     and    c2.colid = r.fkey11
  11299.     union all
  11300.     select
  11301.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11302.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11303.         PK_TABLE_NAME         = o1.name,
  11304.         PK_COLUMN_NAME         = c1.name,
  11305.         PK_COLUMN_GUID        = convert(binary(16),null),
  11306.         PK_COLUMN_PROPID    = convert(int,null),
  11307.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11308.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11309.         FK_TABLE_NAME         = o2.name,
  11310.         FK_COLUMN_NAME         = c2.name,
  11311.         FK_COLUMN_GUID        = convert(binary(16),null),
  11312.         FK_COLUMN_PROPID    = convert(int,null),
  11313.         ORDINAL            = convert(int,12),
  11314.         UPDATE_RULE        = 'NO ACTION',
  11315.         DELETE_RULE         = 'NO ACTION'        
  11316.     from
  11317.         sysobjects o1, sysobjects o2,
  11318.         syscolumns c1, syscolumns c2,
  11319.         sysreferences r
  11320.     where    
  11321.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11322.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11323.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11324.     and    o1.id = r.rkeyid
  11325.     and    r.keycnt >= 12
  11326.     and    o1.id = c1.id
  11327.     and    c1.colid = r.rkey12
  11328.     and     r.fkeyid = o2.id
  11329.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11330.     and    o2.id = c2.id    
  11331.     and    c2.colid = r.fkey12
  11332.     union all
  11333.     select
  11334.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11335.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11336.         PK_TABLE_NAME         = o1.name,
  11337.         PK_COLUMN_NAME         = c1.name,
  11338.         PK_COLUMN_GUID        = convert(binary(16),null),
  11339.         PK_COLUMN_PROPID    = convert(int,null),
  11340.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11341.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11342.         FK_TABLE_NAME         = o2.name,
  11343.         FK_COLUMN_NAME         = c2.name,
  11344.         FK_COLUMN_GUID        = convert(binary(16),null),
  11345.         FK_COLUMN_PROPID    = convert(int,null),
  11346.         ORDINAL            = convert(int,13),
  11347.         UPDATE_RULE        = 'NO ACTION',
  11348.         DELETE_RULE         = 'NO ACTION'        
  11349.     from
  11350.         sysobjects o1, sysobjects o2,
  11351.         syscolumns c1, syscolumns c2,
  11352.         sysreferences r
  11353.     where    
  11354.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11355.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11356.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11357.     and    o1.id = r.rkeyid
  11358.     and    r.keycnt >= 13
  11359.     and    o1.id = c1.id
  11360.     and    c1.colid = r.rkey13
  11361.     and     r.fkeyid = o2.id
  11362.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11363.     and    o2.id = c2.id    
  11364.     and    c2.colid = r.fkey13
  11365.     union all
  11366.     select
  11367.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11368.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11369.         PK_TABLE_NAME         = o1.name,
  11370.         PK_COLUMN_NAME         = c1.name,
  11371.         PK_COLUMN_GUID        = convert(binary(16),null),
  11372.         PK_COLUMN_PROPID    = convert(int,null),
  11373.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11374.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11375.         FK_TABLE_NAME         = o2.name,
  11376.         FK_COLUMN_NAME         = c2.name,
  11377.         FK_COLUMN_GUID        = convert(binary(16),null),
  11378.         FK_COLUMN_PROPID    = convert(int,null),
  11379.         ORDINAL            = convert(int,14),
  11380.         UPDATE_RULE        = 'NO ACTION',
  11381.         DELETE_RULE         = 'NO ACTION'        
  11382.     from
  11383.         sysobjects o1, sysobjects o2,
  11384.         syscolumns c1, syscolumns c2,
  11385.         sysreferences r
  11386.     where    
  11387.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11388.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11389.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11390.     and    o1.id = r.rkeyid
  11391.     and    r.keycnt >= 14
  11392.     and    o1.id = c1.id
  11393.     and    c1.colid = r.rkey14
  11394.     and     r.fkeyid = o2.id
  11395.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11396.     and    o2.id = c2.id    
  11397.     and    c2.colid = r.fkey14
  11398.     union all
  11399.     select
  11400.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11401.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11402.         PK_TABLE_NAME         = o1.name,
  11403.         PK_COLUMN_NAME         = c1.name,
  11404.         PK_COLUMN_GUID        = convert(binary(16),null),
  11405.         PK_COLUMN_PROPID    = convert(int,null),
  11406.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11407.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11408.         FK_TABLE_NAME         = o2.name,
  11409.         FK_COLUMN_NAME         = c2.name,
  11410.         FK_COLUMN_GUID        = convert(binary(16),null),
  11411.         FK_COLUMN_PROPID    = convert(int,null),
  11412.         ORDINAL            = convert(int,15),
  11413.         UPDATE_RULE        = 'NO ACTION',
  11414.         DELETE_RULE         = 'NO ACTION'        
  11415.     from
  11416.         sysobjects o1, sysobjects o2,
  11417.         syscolumns c1, syscolumns c2,
  11418.         sysreferences r
  11419.     where    
  11420.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11421.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11422.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11423.     and    o1.id = r.rkeyid
  11424.     and    r.keycnt >= 15
  11425.     and    o1.id = c1.id
  11426.     and    c1.colid = r.rkey15
  11427.     and     r.fkeyid = o2.id
  11428.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11429.     and    o2.id = c2.id    
  11430.     and    c2.colid = r.fkey15
  11431.     union all
  11432.     select
  11433.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11434.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11435.         PK_TABLE_NAME         = o1.name,
  11436.         PK_COLUMN_NAME         = c1.name,
  11437.         PK_COLUMN_GUID        = convert(binary(16),null),
  11438.         PK_COLUMN_PROPID    = convert(int,null),
  11439.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11440.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  11441.         FK_TABLE_NAME         = o2.name,
  11442.         FK_COLUMN_NAME         = c2.name,
  11443.         FK_COLUMN_GUID        = convert(binary(16),null),
  11444.         FK_COLUMN_PROPID    = convert(int,null),
  11445.         ORDINAL            = convert(int,16),
  11446.         UPDATE_RULE        = 'NO ACTION',
  11447.         DELETE_RULE         = 'NO ACTION'        
  11448.     from
  11449.         sysobjects o1, sysobjects o2,
  11450.         syscolumns c1, syscolumns c2,
  11451.         sysreferences r
  11452.     where    
  11453.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  11454.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11455.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11456.     and    o1.id = r.rkeyid
  11457.     and    o1.id = c1.id
  11458.     and    r.keycnt >= 16
  11459.     and    c1.colid = r.rkey16
  11460.     and     r.fkeyid = o2.id
  11461.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11462.     and    o2.id = c2.id    
  11463.     and    c2.colid = r.fkey16
  11464.     order by 8,9,2,3,13
  11465.     END
  11466. go
  11467. dump tran master with no_log
  11468. go
  11469. CREATE PROCEDURE sp_foreign_keys_rowset;2
  11470.     (
  11471.        @handle            int output,
  11472.        @scrollopt        int output,
  11473.     @ccopt            int output,
  11474.     @rows            int output,
  11475.      @pk_table_name        varchar(255) = null,
  11476.     @pk_table_schema    varchar(255) = null,
  11477.     @pk_table_catalog    varchar(255) = null,
  11478.     @fk_table_name        varchar(255) = null,
  11479.     @fk_table_schema    varchar(255) = null,
  11480.     @fk_table_catalog    varchar(255) = null
  11481.     )
  11482. as
  11483.     declare @ret int
  11484.     
  11485.     create table #spfkeysrowset1
  11486.         (
  11487.         PK_TABLE_CATALOG    sysname not null,
  11488.         PK_TABLE_SCHEMA        sysname not null,
  11489.         PK_TABLE_NAME         sysname not null,
  11490.         PK_COLUMN_NAME         sysname not null,
  11491.         PK_COLUMN_GUID        binary(16) null,
  11492.         PK_COLUMN_PROPID    int null,
  11493.         FK_TABLE_CATALOG    sysname not null,
  11494.         FK_TABLE_SCHEMA        sysname not null,
  11495.         FK_TABLE_NAME         sysname not null,
  11496.         FK_COLUMN_NAME         sysname not null,
  11497.         FK_COLUMN_GUID        binary(16) null,
  11498.         FK_COLUMN_PROPID    int null,
  11499.         ORDINAL            int not null,
  11500.         UPDATE_RULE        sysname not null,
  11501.         DELETE_RULE         sysname not null        
  11502.         )
  11503.  
  11504. IF @pk_table_name is not null
  11505.     BEGIN
  11506.     insert into #spfkeysrowset1
  11507.     select
  11508.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11509.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11510.         PK_TABLE_NAME         = o1.name,
  11511.         PK_COLUMN_NAME         = c1.name,
  11512.         PK_COLUMN_GUID        = convert(binary(16),null),
  11513.         PK_COLUMN_PROPID    = convert(int,null),
  11514.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11515.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11516.         FK_TABLE_NAME         = o2.name,
  11517.         FK_COLUMN_NAME         = c2.name,
  11518.         FK_COLUMN_GUID        = convert(binary(16),null),
  11519.         FK_COLUMN_PROPID    = convert(int,null),
  11520.         ORDINAL            = convert(int,1),
  11521.         UPDATE_RULE        = 'NO ACTION',
  11522.         DELETE_RULE         = 'NO ACTION'        
  11523.     from
  11524.         sysobjects o1, sysobjects o2,
  11525.         syscolumns c1, syscolumns c2,
  11526.         sysreferences r
  11527.     where    
  11528.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11529.     and    o1.name = @pk_table_name
  11530.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11531.     and    o1.id = r.rkeyid
  11532.     and    o1.id = c1.id
  11533.     and    c1.colid = r.rkey1
  11534.     and     r.fkeyid = o2.id
  11535.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11536.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11537.     and    o2.id = c2.id    
  11538.     and    c2.colid = r.fkey1
  11539.     union all
  11540.     select
  11541.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11542.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11543.         PK_TABLE_NAME         = o1.name,
  11544.         PK_COLUMN_NAME         = c1.name,
  11545.         PK_COLUMN_GUID        = convert(binary(16),null),
  11546.         PK_COLUMN_PROPID    = convert(int,null),
  11547.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11548.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11549.         FK_TABLE_NAME         = o2.name,
  11550.         FK_COLUMN_NAME         = c2.name,
  11551.         FK_COLUMN_GUID        = convert(binary(16),null),
  11552.         FK_COLUMN_PROPID    = convert(int,null),
  11553.         ORDINAL            = convert(int,2),
  11554.         UPDATE_RULE        = 'NO ACTION',
  11555.         DELETE_RULE         = 'NO ACTION'        
  11556.     from
  11557.         sysobjects o1, sysobjects o2,
  11558.         syscolumns c1, syscolumns c2,
  11559.         sysreferences r
  11560.     where    
  11561.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11562.     and    o1.name = @pk_table_name
  11563.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11564.     and    o1.id = r.rkeyid
  11565.     and    o1.id = c1.id
  11566.     and    c1.colid = r.rkey2
  11567.     and    r.keycnt >= 2
  11568.     and     r.fkeyid = o2.id
  11569.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11570.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11571.     and    o2.id = c2.id    
  11572.     and    c2.colid = r.fkey2
  11573.     union all
  11574.     select
  11575.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11576.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11577.         PK_TABLE_NAME         = o1.name,
  11578.         PK_COLUMN_NAME         = c1.name,
  11579.         PK_COLUMN_GUID        = convert(binary(16),null),
  11580.         PK_COLUMN_PROPID    = convert(int,null),
  11581.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11582.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11583.         FK_TABLE_NAME         = o2.name,
  11584.         FK_COLUMN_NAME         = c2.name,
  11585.         FK_COLUMN_GUID        = convert(binary(16),null),
  11586.         FK_COLUMN_PROPID    = convert(int,null),
  11587.         ORDINAL            = convert(int,3),
  11588.         UPDATE_RULE        = 'NO ACTION',
  11589.         DELETE_RULE         = 'NO ACTION'        
  11590.     from
  11591.         sysobjects o1, sysobjects o2,
  11592.         syscolumns c1, syscolumns c2,
  11593.         sysreferences r
  11594.     where    
  11595.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11596.     and    o1.name = @pk_table_name
  11597.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11598.     and    o1.id = r.rkeyid
  11599.     and    o1.id = c1.id
  11600.     and    c1.colid = r.rkey3
  11601.     and    r.keycnt >= 3
  11602.     and     r.fkeyid = o2.id
  11603.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11604.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11605.     and    o2.id = c2.id    
  11606.     and    c2.colid = r.fkey3
  11607.     union all
  11608.     select
  11609.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11610.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11611.         PK_TABLE_NAME         = o1.name,
  11612.         PK_COLUMN_NAME         = c1.name,
  11613.         PK_COLUMN_GUID        = convert(binary(16),null),
  11614.         PK_COLUMN_PROPID    = convert(int,null),
  11615.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11616.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11617.         FK_TABLE_NAME         = o2.name,
  11618.         FK_COLUMN_NAME         = c2.name,
  11619.         FK_COLUMN_GUID        = convert(binary(16),null),
  11620.         FK_COLUMN_PROPID    = convert(int,null),
  11621.         ORDINAL            = convert(int,4),
  11622.         UPDATE_RULE        = 'NO ACTION',
  11623.         DELETE_RULE         = 'NO ACTION'        
  11624.     from
  11625.         sysobjects o1, sysobjects o2,
  11626.         syscolumns c1, syscolumns c2,
  11627.         sysreferences r
  11628.     where    
  11629.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11630.     and    o1.name = @pk_table_name
  11631.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11632.     and    o1.id = r.rkeyid
  11633.     and    r.keycnt >= 4
  11634.     and    o1.id = c1.id
  11635.     and    c1.colid = r.rkey4
  11636.     and     r.fkeyid = o2.id
  11637.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11638.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11639.     and    o2.id = c2.id    
  11640.     and    c2.colid = r.fkey4
  11641.     union all
  11642.     select
  11643.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11644.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11645.         PK_TABLE_NAME         = o1.name,
  11646.         PK_COLUMN_NAME         = c1.name,
  11647.         PK_COLUMN_GUID        = convert(binary(16),null),
  11648.         PK_COLUMN_PROPID    = convert(int,null),
  11649.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11650.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11651.         FK_TABLE_NAME         = o2.name,
  11652.         FK_COLUMN_NAME         = c2.name,
  11653.         FK_COLUMN_GUID        = convert(binary(16),null),
  11654.         FK_COLUMN_PROPID    = convert(int,null),
  11655.         ORDINAL            = convert(int,5),
  11656.         UPDATE_RULE        = 'NO ACTION',
  11657.         DELETE_RULE         = 'NO ACTION'        
  11658.     from
  11659.         sysobjects o1, sysobjects o2,
  11660.         syscolumns c1, syscolumns c2,
  11661.         sysreferences r
  11662.     where    
  11663.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11664.     and    o1.name = @pk_table_name
  11665.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11666.     and    o1.id = r.rkeyid
  11667.     and    r.keycnt >= 5
  11668.     and    o1.id = c1.id
  11669.     and    c1.colid = r.rkey5
  11670.     and     r.fkeyid = o2.id
  11671.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11672.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11673.     and    o2.id = c2.id    
  11674.     and    c2.colid = r.fkey5
  11675.     union all
  11676.     select
  11677.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11678.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11679.         PK_TABLE_NAME         = o1.name,
  11680.         PK_COLUMN_NAME         = c1.name,
  11681.         PK_COLUMN_GUID        = convert(binary(16),null),
  11682.         PK_COLUMN_PROPID    = convert(int,null),
  11683.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11684.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11685.         FK_TABLE_NAME         = o2.name,
  11686.         FK_COLUMN_NAME         = c2.name,
  11687.         FK_COLUMN_GUID        = convert(binary(16),null),
  11688.         FK_COLUMN_PROPID    = convert(int,null),
  11689.         ORDINAL            = convert(int,6),
  11690.         UPDATE_RULE        = 'NO ACTION',
  11691.         DELETE_RULE         = 'NO ACTION'        
  11692.     from
  11693.         sysobjects o1, sysobjects o2,
  11694.         syscolumns c1, syscolumns c2,
  11695.         sysreferences r
  11696.     where    
  11697.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11698.     and    o1.name = @pk_table_name
  11699.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11700.     and    o1.id = r.rkeyid
  11701.     and    r.keycnt >= 6
  11702.     and    o1.id = c1.id
  11703.     and    c1.colid = r.rkey6
  11704.     and     r.fkeyid = o2.id
  11705.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11706.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11707.     and    o2.id = c2.id    
  11708.     and    c2.colid = r.fkey6
  11709.     union all
  11710.     select
  11711.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11712.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11713.         PK_TABLE_NAME         = o1.name,
  11714.         PK_COLUMN_NAME         = c1.name,
  11715.         PK_COLUMN_GUID        = convert(binary(16),null),
  11716.         PK_COLUMN_PROPID    = convert(int,null),
  11717.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11718.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11719.         FK_TABLE_NAME         = o2.name,
  11720.         FK_COLUMN_NAME         = c2.name,
  11721.         FK_COLUMN_GUID        = convert(binary(16),null),
  11722.         FK_COLUMN_PROPID    = convert(int,null),
  11723.         ORDINAL            = convert(int,7),
  11724.         UPDATE_RULE        = 'NO ACTION',
  11725.         DELETE_RULE         = 'NO ACTION'        
  11726.     from
  11727.         sysobjects o1, sysobjects o2,
  11728.         syscolumns c1, syscolumns c2,
  11729.         sysreferences r
  11730.     where    
  11731.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11732.     and    o1.name = @pk_table_name
  11733.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11734.     and    o1.id = r.rkeyid
  11735.     and    r.keycnt >= 7
  11736.     and    o1.id = c1.id
  11737.     and    c1.colid = r.rkey7
  11738.     and     r.fkeyid = o2.id
  11739.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11740.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11741.     and    o2.id = c2.id    
  11742.     and    c2.colid = r.fkey7
  11743.     union all
  11744.     select
  11745.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11746.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11747.         PK_TABLE_NAME         = o1.name,
  11748.         PK_COLUMN_NAME         = c1.name,
  11749.         PK_COLUMN_GUID        = convert(binary(16),null),
  11750.         PK_COLUMN_PROPID    = convert(int,null),
  11751.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11752.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11753.         FK_TABLE_NAME         = o2.name,
  11754.         FK_COLUMN_NAME         = c2.name,
  11755.         FK_COLUMN_GUID        = convert(binary(16),null),
  11756.         FK_COLUMN_PROPID    = convert(int,null),
  11757.         ORDINAL            = convert(int,8),
  11758.         UPDATE_RULE        = 'NO ACTION',
  11759.         DELETE_RULE         = 'NO ACTION'        
  11760.     from
  11761.         sysobjects o1, sysobjects o2,
  11762.         syscolumns c1, syscolumns c2,
  11763.         sysreferences r
  11764.     where    
  11765.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11766.     and    o1.name = @pk_table_name
  11767.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11768.     and    o1.id = r.rkeyid
  11769.     and    r.keycnt >= 8
  11770.     and    o1.id = c1.id
  11771.     and    c1.colid = r.rkey8
  11772.     and     r.fkeyid = o2.id
  11773.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11774.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11775.     and    o2.id = c2.id    
  11776.     and    c2.colid = r.fkey8
  11777.     union all
  11778.     select
  11779.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11780.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11781.         PK_TABLE_NAME         = o1.name,
  11782.         PK_COLUMN_NAME         = c1.name,
  11783.         PK_COLUMN_GUID        = convert(binary(16),null),
  11784.         PK_COLUMN_PROPID    = convert(int,null),
  11785.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11786.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11787.         FK_TABLE_NAME         = o2.name,
  11788.         FK_COLUMN_NAME         = c2.name,
  11789.         FK_COLUMN_GUID        = convert(binary(16),null),
  11790.         FK_COLUMN_PROPID    = convert(int,null),
  11791.         ORDINAL            = convert(int,9),
  11792.         UPDATE_RULE        = 'NO ACTION',
  11793.         DELETE_RULE         = 'NO ACTION'        
  11794.     from
  11795.         sysobjects o1, sysobjects o2,
  11796.         syscolumns c1, syscolumns c2,
  11797.         sysreferences r
  11798.     where    
  11799.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11800.     and    o1.name = @pk_table_name
  11801.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11802.     and    o1.id = r.rkeyid
  11803.     and    r.keycnt >= 9
  11804.     and    o1.id = c1.id
  11805.     and    c1.colid = r.rkey9
  11806.     and     r.fkeyid = o2.id
  11807.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11808.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11809.     and    o2.id = c2.id    
  11810.     and    c2.colid = r.fkey9
  11811.     union all
  11812.     select
  11813.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11814.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11815.         PK_TABLE_NAME         = o1.name,
  11816.         PK_COLUMN_NAME         = c1.name,
  11817.         PK_COLUMN_GUID        = convert(binary(16),null),
  11818.         PK_COLUMN_PROPID    = convert(int,null),
  11819.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11820.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11821.         FK_TABLE_NAME         = o2.name,
  11822.         FK_COLUMN_NAME         = c2.name,
  11823.         FK_COLUMN_GUID        = convert(binary(16),null),
  11824.         FK_COLUMN_PROPID    = convert(int,null),
  11825.         ORDINAL            = convert(int,10),
  11826.         UPDATE_RULE        = 'NO ACTION',
  11827.         DELETE_RULE         = 'NO ACTION'        
  11828.     from
  11829.         sysobjects o1, sysobjects o2,
  11830.         syscolumns c1, syscolumns c2,
  11831.         sysreferences r
  11832.     where    
  11833.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11834.     and    o1.name = @pk_table_name
  11835.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11836.     and    o1.id = r.rkeyid
  11837.     and    r.keycnt >= 10
  11838.     and    o1.id = c1.id
  11839.     and    c1.colid = r.rkey10
  11840.     and     r.fkeyid = o2.id
  11841.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11842.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11843.     and    o2.id = c2.id    
  11844.     and    c2.colid = r.fkey10
  11845.     union all
  11846.     select
  11847.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11848.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11849.         PK_TABLE_NAME         = o1.name,
  11850.         PK_COLUMN_NAME         = c1.name,
  11851.         PK_COLUMN_GUID        = convert(binary(16),null),
  11852.         PK_COLUMN_PROPID    = convert(int,null),
  11853.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11854.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11855.         FK_TABLE_NAME         = o2.name,
  11856.         FK_COLUMN_NAME         = c2.name,
  11857.         FK_COLUMN_GUID        = convert(binary(16),null),
  11858.         FK_COLUMN_PROPID    = convert(int,null),
  11859.         ORDINAL            = convert(int,11),
  11860.         UPDATE_RULE        = 'NO ACTION',
  11861.         DELETE_RULE         = 'NO ACTION'        
  11862.     from
  11863.         sysobjects o1, sysobjects o2,
  11864.         syscolumns c1, syscolumns c2,
  11865.         sysreferences r
  11866.     where    
  11867.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11868.     and    o1.name = @pk_table_name
  11869.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11870.     and    o1.id = r.rkeyid
  11871.     and    r.keycnt >= 11
  11872.     and    o1.id = c1.id
  11873.     and    c1.colid = r.rkey11
  11874.     and     r.fkeyid = o2.id
  11875.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11876.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11877.     and    o2.id = c2.id    
  11878.     and    c2.colid = r.fkey11
  11879.     union all
  11880.     select
  11881.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11882.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11883.         PK_TABLE_NAME         = o1.name,
  11884.         PK_COLUMN_NAME         = c1.name,
  11885.         PK_COLUMN_GUID        = convert(binary(16),null),
  11886.         PK_COLUMN_PROPID    = convert(int,null),
  11887.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11888.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11889.         FK_TABLE_NAME         = o2.name,
  11890.         FK_COLUMN_NAME         = c2.name,
  11891.         FK_COLUMN_GUID        = convert(binary(16),null),
  11892.         FK_COLUMN_PROPID    = convert(int,null),
  11893.         ORDINAL            = convert(int,12),
  11894.         UPDATE_RULE        = 'NO ACTION',
  11895.         DELETE_RULE         = 'NO ACTION'        
  11896.     from
  11897.         sysobjects o1, sysobjects o2,
  11898.         syscolumns c1, syscolumns c2,
  11899.         sysreferences r
  11900.     where    
  11901.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11902.     and    o1.name = @pk_table_name
  11903.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11904.     and    o1.id = r.rkeyid
  11905.     and    r.keycnt >= 12
  11906.     and    o1.id = c1.id
  11907.     and    c1.colid = r.rkey12
  11908.     and     r.fkeyid = o2.id
  11909.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11910.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11911.     and    o2.id = c2.id    
  11912.     and    c2.colid = r.fkey12
  11913.     union all
  11914.     select
  11915.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11916.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11917.         PK_TABLE_NAME         = o1.name,
  11918.         PK_COLUMN_NAME         = c1.name,
  11919.         PK_COLUMN_GUID        = convert(binary(16),null),
  11920.         PK_COLUMN_PROPID    = convert(int,null),
  11921.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11922.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11923.         FK_TABLE_NAME         = o2.name,
  11924.         FK_COLUMN_NAME         = c2.name,
  11925.         FK_COLUMN_GUID        = convert(binary(16),null),
  11926.         FK_COLUMN_PROPID    = convert(int,null),
  11927.         ORDINAL            = convert(int,13),
  11928.         UPDATE_RULE        = 'NO ACTION',
  11929.         DELETE_RULE         = 'NO ACTION'        
  11930.     from
  11931.         sysobjects o1, sysobjects o2,
  11932.         syscolumns c1, syscolumns c2,
  11933.         sysreferences r
  11934.     where    
  11935.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11936.     and    o1.name = @pk_table_name
  11937.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11938.     and    o1.id = r.rkeyid
  11939.     and    r.keycnt >= 13
  11940.     and    o1.id = c1.id
  11941.     and    c1.colid = r.rkey13
  11942.     and     r.fkeyid = o2.id
  11943.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11944.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11945.     and    o2.id = c2.id    
  11946.     and    c2.colid = r.fkey13
  11947.     union all
  11948.     select
  11949.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11950.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11951.         PK_TABLE_NAME         = o1.name,
  11952.         PK_COLUMN_NAME         = c1.name,
  11953.         PK_COLUMN_GUID        = convert(binary(16),null),
  11954.         PK_COLUMN_PROPID    = convert(int,null),
  11955.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11956.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11957.         FK_TABLE_NAME         = o2.name,
  11958.         FK_COLUMN_NAME         = c2.name,
  11959.         FK_COLUMN_GUID        = convert(binary(16),null),
  11960.         FK_COLUMN_PROPID    = convert(int,null),
  11961.         ORDINAL            = convert(int,14),
  11962.         UPDATE_RULE        = 'NO ACTION',
  11963.         DELETE_RULE         = 'NO ACTION'        
  11964.     from
  11965.         sysobjects o1, sysobjects o2,
  11966.         syscolumns c1, syscolumns c2,
  11967.         sysreferences r
  11968.     where    
  11969.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  11970.     and    o1.name = @pk_table_name
  11971.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  11972.     and    o1.id = r.rkeyid
  11973.     and    r.keycnt >= 14
  11974.     and    o1.id = c1.id
  11975.     and    c1.colid = r.rkey14
  11976.     and     r.fkeyid = o2.id
  11977.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  11978.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  11979.     and    o2.id = c2.id    
  11980.     and    c2.colid = r.fkey14
  11981.     union all
  11982.     select
  11983.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  11984.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  11985.         PK_TABLE_NAME         = o1.name,
  11986.         PK_COLUMN_NAME         = c1.name,
  11987.         PK_COLUMN_GUID        = convert(binary(16),null),
  11988.         PK_COLUMN_PROPID    = convert(int,null),
  11989.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  11990.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  11991.         FK_TABLE_NAME         = o2.name,
  11992.         FK_COLUMN_NAME         = c2.name,
  11993.         FK_COLUMN_GUID        = convert(binary(16),null),
  11994.         FK_COLUMN_PROPID    = convert(int,null),
  11995.         ORDINAL            = convert(int,15),
  11996.         UPDATE_RULE        = 'NO ACTION',
  11997.         DELETE_RULE         = 'NO ACTION'        
  11998.     from
  11999.         sysobjects o1, sysobjects o2,
  12000.         syscolumns c1, syscolumns c2,
  12001.         sysreferences r
  12002.     where    
  12003.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12004.     and    o1.name = @pk_table_name
  12005.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12006.     and    o1.id = r.rkeyid
  12007.     and    r.keycnt >= 15
  12008.     and    o1.id = c1.id
  12009.     and    c1.colid = r.rkey15
  12010.     and     r.fkeyid = o2.id
  12011.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  12012.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12013.     and    o2.id = c2.id    
  12014.     and    c2.colid = r.fkey15
  12015.     union all
  12016.     select
  12017.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12018.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12019.         PK_TABLE_NAME         = o1.name,
  12020.         PK_COLUMN_NAME         = c1.name,
  12021.         PK_COLUMN_GUID        = convert(binary(16),null),
  12022.         PK_COLUMN_PROPID    = convert(int,null),
  12023.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12024.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12025.         FK_TABLE_NAME         = o2.name,
  12026.         FK_COLUMN_NAME         = c2.name,
  12027.         FK_COLUMN_GUID        = convert(binary(16),null),
  12028.         FK_COLUMN_PROPID    = convert(int,null),
  12029.         ORDINAL            = convert(int,16),
  12030.         UPDATE_RULE        = 'NO ACTION',
  12031.         DELETE_RULE         = 'NO ACTION'        
  12032.     from
  12033.         sysobjects o1, sysobjects o2,
  12034.         syscolumns c1, syscolumns c2,
  12035.         sysreferences r
  12036.     where    
  12037.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12038.     and    o1.name = @pk_table_name
  12039.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12040.     and    o1.id = r.rkeyid
  12041.     and    r.keycnt >= 16
  12042.     and    o1.id = c1.id
  12043.     and    c1.colid = r.rkey16
  12044.     and     r.fkeyid = o2.id
  12045.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  12046.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12047.     and    o2.id = c2.id    
  12048.     and    c2.colid = r.fkey16
  12049.     order by 8,9,2,3,13
  12050.     END
  12051. ELSE IF @fk_table_name is not null
  12052.     BEGIN
  12053.     insert into #spfkeysrowset1
  12054.     select
  12055.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12056.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12057.         PK_TABLE_NAME         = o1.name,
  12058.         PK_COLUMN_NAME         = c1.name,
  12059.         PK_COLUMN_GUID        = convert(binary(16),null),
  12060.         PK_COLUMN_PROPID    = convert(int,null),
  12061.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12062.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12063.         FK_TABLE_NAME         = o2.name,
  12064.         FK_COLUMN_NAME         = c2.name,
  12065.         FK_COLUMN_GUID        = convert(binary(16),null),
  12066.         FK_COLUMN_PROPID    = convert(int,null),
  12067.         ORDINAL            = convert(int,1),
  12068.         UPDATE_RULE        = 'NO ACTION',
  12069.         DELETE_RULE         = 'NO ACTION'        
  12070.     from
  12071.         sysobjects o1, sysobjects o2,
  12072.         syscolumns c1, syscolumns c2,
  12073.         sysreferences r
  12074.     where    
  12075.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12076.     and    o2.name = @fk_table_name
  12077.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12078.     and    o2.id = r.fkeyid
  12079.     and    o2.id = c2.id
  12080.     and    c2.colid = r.fkey1
  12081.     and     r.rkeyid = o1.id
  12082.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12083.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12084.     and    o1.id = c1.id    
  12085.     and    c1.colid = r.rkey1
  12086.     union    all
  12087.     select
  12088.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12089.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12090.         PK_TABLE_NAME         = o1.name,
  12091.         PK_COLUMN_NAME         = c1.name,
  12092.         PK_COLUMN_GUID        = convert(binary(16),null),
  12093.         PK_COLUMN_PROPID    = convert(int,null),
  12094.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12095.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12096.         FK_TABLE_NAME         = o2.name,
  12097.         FK_COLUMN_NAME         = c2.name,
  12098.         FK_COLUMN_GUID        = convert(binary(16),null),
  12099.         FK_COLUMN_PROPID    = convert(int,null),
  12100.         ORDINAL            = convert(int,2),
  12101.         UPDATE_RULE        = 'NO ACTION',
  12102.         DELETE_RULE         = 'NO ACTION'        
  12103.     from
  12104.         sysobjects o1, sysobjects o2,
  12105.         syscolumns c1, syscolumns c2,
  12106.         sysreferences r
  12107.     where    
  12108.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12109.     and    o2.name = @fk_table_name
  12110.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12111.     and    o2.id = r.fkeyid
  12112.     and    r.keycnt >= 2
  12113.     and    o2.id = c2.id
  12114.     and    c2.colid = r.fkey2
  12115.     and     r.rkeyid = o1.id
  12116.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12117.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12118.     and    o1.id = c1.id    
  12119.     and    c1.colid = r.rkey2
  12120.     union    all
  12121.     select
  12122.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12123.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12124.         PK_TABLE_NAME         = o1.name,
  12125.         PK_COLUMN_NAME         = c1.name,
  12126.         PK_COLUMN_GUID        = convert(binary(16),null),
  12127.         PK_COLUMN_PROPID    = convert(int,null),
  12128.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12129.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  12130.         FK_TABLE_NAME         = o2.name,
  12131.         FK_COLUMN_NAME         = c2.name,
  12132.         FK_COLUMN_GUID        = convert(binary(16),null),
  12133.         FK_COLUMN_PROPID    = convert(int,null),
  12134.         ORDINAL            = convert(int,3),
  12135.         UPDATE_RULE        = 'NO ACTION',
  12136.         DELETE_RULE         = 'NO ACTION'        
  12137.     from
  12138.         sysobjects o1, sysobjects o2,
  12139.         syscolumns c1, syscolumns c2,
  12140.         sysreferences r
  12141.     where    
  12142.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12143.     and    o2.name = @fk_table_name
  12144.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12145.     and    o2.id = r.fkeyid
  12146.     and    r.keycnt >= 3
  12147.     and    o2.id = c2.id
  12148.     and    c2.colid = r.fkey3
  12149.     and     r.rkeyid = o1.id
  12150.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12151.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12152.     and    o1.id = c1.id    
  12153.     and    c1.colid = r.rkey3
  12154.     union    all
  12155.     select
  12156.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12157.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12158.         PK_TABLE_NAME         = o1.name,
  12159.         PK_COLUMN_NAME         = c1.name,
  12160.         PK_COLUMN_GUID        = convert(binary(16),null),
  12161.         PK_COLUMN_PROPID    = convert(int,null),
  12162.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12163.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12164.         FK_TABLE_NAME         = o2.name,
  12165.         FK_COLUMN_NAME         = c2.name,
  12166.         FK_COLUMN_GUID        = convert(binary(16),null),
  12167.         FK_COLUMN_PROPID    = convert(int,null),
  12168.         ORDINAL            = convert(int,4),
  12169.         UPDATE_RULE        = 'NO ACTION',
  12170.         DELETE_RULE         = 'NO ACTION'        
  12171.     from
  12172.         sysobjects o1, sysobjects o2,
  12173.         syscolumns c1, syscolumns c2,
  12174.         sysreferences r
  12175.     where    
  12176.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12177.     and    o2.name = @fk_table_name
  12178.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12179.     and    o2.id = r.fkeyid
  12180.     and    r.keycnt >= 4
  12181.     and    o2.id = c2.id
  12182.     and    c2.colid = r.fkey4
  12183.     and     r.rkeyid = o1.id
  12184.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12185.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12186.     and    o1.id = c1.id    
  12187.     and    c1.colid = r.rkey4
  12188.     union    all
  12189.     select
  12190.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12191.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12192.         PK_TABLE_NAME         = o1.name,
  12193.         PK_COLUMN_NAME         = c1.name,
  12194.         PK_COLUMN_GUID        = convert(binary(16),null),
  12195.         PK_COLUMN_PROPID    = convert(int,null),
  12196.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12197.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12198.         FK_TABLE_NAME         = o2.name,
  12199.         FK_COLUMN_NAME         = c2.name,
  12200.         FK_COLUMN_GUID        = convert(binary(16),null),
  12201.         FK_COLUMN_PROPID    = convert(int,null),
  12202.         ORDINAL            = convert(int,5),
  12203.         UPDATE_RULE        = 'NO ACTION',
  12204.         DELETE_RULE         = 'NO ACTION'        
  12205.     from
  12206.         sysobjects o1, sysobjects o2,
  12207.         syscolumns c1, syscolumns c2,
  12208.         sysreferences r
  12209.     where    
  12210.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12211.     and    o2.name = @fk_table_name
  12212.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12213.     and    o2.id = r.fkeyid
  12214.     and    r.keycnt >= 5
  12215.     and    o2.id = c2.id
  12216.     and    c2.colid = r.fkey5
  12217.     and     r.rkeyid = o1.id
  12218.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12219.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12220.     and    o1.id = c1.id    
  12221.     and    c1.colid = r.rkey5
  12222.     union    all
  12223.     select
  12224.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12225.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12226.         PK_TABLE_NAME         = o1.name,
  12227.         PK_COLUMN_NAME         = c1.name,
  12228.         PK_COLUMN_GUID        = convert(binary(16),null),
  12229.         PK_COLUMN_PROPID    = convert(int,null),
  12230.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12231.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12232.         FK_TABLE_NAME         = o2.name,
  12233.         FK_COLUMN_NAME         = c2.name,
  12234.         FK_COLUMN_GUID        = convert(binary(16),null),
  12235.         FK_COLUMN_PROPID    = convert(int,null),
  12236.         ORDINAL            = convert(int,6),
  12237.         UPDATE_RULE        = 'NO ACTION',
  12238.         DELETE_RULE         = 'NO ACTION'        
  12239.     from
  12240.         sysobjects o1, sysobjects o2,
  12241.         syscolumns c1, syscolumns c2,
  12242.         sysreferences r
  12243.     where    
  12244.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12245.     and    o2.name = @fk_table_name
  12246.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12247.     and    o2.id = r.fkeyid
  12248.     and    r.keycnt >= 6
  12249.     and    o2.id = c2.id
  12250.     and    c2.colid = r.fkey6
  12251.     and     r.rkeyid = o1.id
  12252.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12253.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12254.     and    o1.id = c1.id    
  12255.     and    c1.colid = r.rkey6
  12256.     union    all
  12257.     select
  12258.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12259.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12260.         PK_TABLE_NAME         = o1.name,
  12261.         PK_COLUMN_NAME         = c1.name,
  12262.         PK_COLUMN_GUID        = convert(binary(16),null),
  12263.         PK_COLUMN_PROPID    = convert(int,null),
  12264.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12265.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12266.         FK_TABLE_NAME         = o2.name,
  12267.         FK_COLUMN_NAME         = c2.name,
  12268.         FK_COLUMN_GUID        = convert(binary(16),null),
  12269.         FK_COLUMN_PROPID    = convert(int,null),
  12270.         ORDINAL            = convert(int,7),
  12271.         UPDATE_RULE        = 'NO ACTION',
  12272.         DELETE_RULE         = 'NO ACTION'        
  12273.     from
  12274.         sysobjects o1, sysobjects o2,
  12275.         syscolumns c1, syscolumns c2,
  12276.         sysreferences r
  12277.     where    
  12278.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12279.     and    o2.name = @fk_table_name
  12280.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12281.     and    o2.id = r.fkeyid
  12282.     and    r.keycnt >= 7
  12283.     and    o2.id = c2.id
  12284.     and    c2.colid = r.fkey7
  12285.     and     r.rkeyid = o1.id
  12286.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12287.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12288.     and    o1.id = c1.id    
  12289.     and    c1.colid = r.rkey7
  12290.     union    all
  12291.     select
  12292.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12293.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12294.         PK_TABLE_NAME         = o1.name,
  12295.         PK_COLUMN_NAME         = c1.name,
  12296.         PK_COLUMN_GUID        = convert(binary(16),null),
  12297.         PK_COLUMN_PROPID    = convert(int,null),
  12298.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12299.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12300.         FK_TABLE_NAME         = o2.name,
  12301.         FK_COLUMN_NAME         = c2.name,
  12302.         FK_COLUMN_GUID        = convert(binary(16),null),
  12303.         FK_COLUMN_PROPID    = convert(int,null),
  12304.         ORDINAL            = convert(int,8),
  12305.         UPDATE_RULE        = 'NO ACTION',
  12306.         DELETE_RULE         = 'NO ACTION'        
  12307.     from
  12308.         sysobjects o1, sysobjects o2,
  12309.         syscolumns c1, syscolumns c2,
  12310.         sysreferences r
  12311.     where    
  12312.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12313.     and    o2.name = @fk_table_name
  12314.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12315.     and    o2.id = r.fkeyid
  12316.     and    r.keycnt >= 8
  12317.     and    o2.id = c2.id
  12318.     and    c2.colid = r.fkey8
  12319.     and     r.rkeyid = o1.id
  12320.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12321.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12322.     and    o1.id = c1.id    
  12323.     and    c1.colid = r.rkey8
  12324.     union    all
  12325.     select
  12326.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12327.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12328.         PK_TABLE_NAME         = o1.name,
  12329.         PK_COLUMN_NAME         = c1.name,
  12330.         PK_COLUMN_GUID        = convert(binary(16),null),
  12331.         PK_COLUMN_PROPID    = convert(int,null),
  12332.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12333.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12334.         FK_TABLE_NAME         = o2.name,
  12335.         FK_COLUMN_NAME         = c2.name,
  12336.         FK_COLUMN_GUID        = convert(binary(16),null),
  12337.         FK_COLUMN_PROPID    = convert(int,null),
  12338.         ORDINAL            = convert(int,9),
  12339.         UPDATE_RULE        = 'NO ACTION',
  12340.         DELETE_RULE         = 'NO ACTION'        
  12341.     from
  12342.         sysobjects o1, sysobjects o2,
  12343.         syscolumns c1, syscolumns c2,
  12344.         sysreferences r
  12345.     where    
  12346.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12347.     and    o2.name = @fk_table_name
  12348.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12349.     and    o2.id = r.fkeyid
  12350.     and    r.keycnt >= 9
  12351.     and    o2.id = c2.id
  12352.     and    c2.colid = r.fkey9
  12353.     and     r.rkeyid = o1.id
  12354.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12355.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12356.     and    o1.id = c1.id    
  12357.     and    c1.colid = r.rkey9
  12358.     union    all
  12359.     select
  12360.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12361.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12362.         PK_TABLE_NAME         = o1.name,
  12363.         PK_COLUMN_NAME         = c1.name,
  12364.         PK_COLUMN_GUID        = convert(binary(16),null),
  12365.         PK_COLUMN_PROPID    = convert(int,null),
  12366.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12367.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12368.         FK_TABLE_NAME         = o2.name,
  12369.         FK_COLUMN_NAME         = c2.name,
  12370.         FK_COLUMN_GUID        = convert(binary(16),null),
  12371.         FK_COLUMN_PROPID    = convert(int,null),
  12372.         ORDINAL            = convert(int,10),
  12373.         UPDATE_RULE        = 'NO ACTION',
  12374.         DELETE_RULE         = 'NO ACTION'        
  12375.     from
  12376.         sysobjects o1, sysobjects o2,
  12377.         syscolumns c1, syscolumns c2,
  12378.         sysreferences r
  12379.     where    
  12380.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12381.     and    o2.name = @fk_table_name
  12382.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12383.     and    o2.id = r.fkeyid
  12384.     and    r.keycnt >= 10
  12385.     and    o2.id = c2.id
  12386.     and    c2.colid = r.fkey10
  12387.     and     r.rkeyid = o1.id
  12388.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12389.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12390.     and    o1.id = c1.id    
  12391.     and    c1.colid = r.rkey10
  12392.     union    all
  12393.     select
  12394.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12395.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12396.         PK_TABLE_NAME         = o1.name,
  12397.         PK_COLUMN_NAME         = c1.name,
  12398.         PK_COLUMN_GUID        = convert(binary(16),null),
  12399.         PK_COLUMN_PROPID    = convert(int,null),
  12400.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12401.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12402.         FK_TABLE_NAME         = o2.name,
  12403.         FK_COLUMN_NAME         = c2.name,
  12404.         FK_COLUMN_GUID        = convert(binary(16),null),
  12405.         FK_COLUMN_PROPID    = convert(int,null),
  12406.         ORDINAL            = convert(int,11),
  12407.         UPDATE_RULE        = 'NO ACTION',
  12408.         DELETE_RULE         = 'NO ACTION'        
  12409.     from
  12410.         sysobjects o1, sysobjects o2,
  12411.         syscolumns c1, syscolumns c2,
  12412.         sysreferences r
  12413.     where    
  12414.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12415.     and    o2.name = @fk_table_name
  12416.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12417.     and    o2.id = r.fkeyid
  12418.     and    r.keycnt >= 11
  12419.     and    o2.id = c2.id
  12420.     and    c2.colid = r.fkey11
  12421.     and     r.rkeyid = o1.id
  12422.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12423.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12424.     and    o1.id = c1.id    
  12425.     and    c1.colid = r.rkey11
  12426.     union    all
  12427.     select
  12428.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12429.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12430.         PK_TABLE_NAME         = o1.name,
  12431.         PK_COLUMN_NAME         = c1.name,
  12432.         PK_COLUMN_GUID        = convert(binary(16),null),
  12433.         PK_COLUMN_PROPID    = convert(int,null),
  12434.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12435.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12436.         FK_TABLE_NAME         = o2.name,
  12437.         FK_COLUMN_NAME         = c2.name,
  12438.         FK_COLUMN_GUID        = convert(binary(16),null),
  12439.         FK_COLUMN_PROPID    = convert(int,null),
  12440.         ORDINAL            = convert(int,12),
  12441.         UPDATE_RULE        = 'NO ACTION',
  12442.         DELETE_RULE         = 'NO ACTION'        
  12443.     from
  12444.         sysobjects o1, sysobjects o2,
  12445.         syscolumns c1, syscolumns c2,
  12446.         sysreferences r
  12447.     where    
  12448.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12449.     and    o2.name = @fk_table_name
  12450.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12451.     and    o2.id = r.fkeyid
  12452.     and    r.keycnt >= 12
  12453.     and    o2.id = c2.id
  12454.     and    c2.colid = r.fkey12
  12455.     and     r.rkeyid = o1.id
  12456.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12457.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12458.     and    o1.id = c1.id    
  12459.     and    c1.colid = r.rkey12
  12460.     union    all
  12461.     select
  12462.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12463.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12464.         PK_TABLE_NAME         = o1.name,
  12465.         PK_COLUMN_NAME         = c1.name,
  12466.         PK_COLUMN_GUID        = convert(binary(16),null),
  12467.         PK_COLUMN_PROPID    = convert(int,null),
  12468.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12469.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12470.         FK_TABLE_NAME         = o2.name,
  12471.         FK_COLUMN_NAME         = c2.name,
  12472.         FK_COLUMN_GUID        = convert(binary(16),null),
  12473.         FK_COLUMN_PROPID    = convert(int,null),
  12474.         ORDINAL            = convert(int,13),
  12475.         UPDATE_RULE        = 'NO ACTION',
  12476.         DELETE_RULE         = 'NO ACTION'        
  12477.     from
  12478.         sysobjects o1, sysobjects o2,
  12479.         syscolumns c1, syscolumns c2,
  12480.         sysreferences r
  12481.     where    
  12482.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12483.     and    o2.name = @fk_table_name
  12484.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12485.     and    o2.id = r.fkeyid
  12486.     and    r.keycnt >= 13
  12487.     and    o2.id = c2.id
  12488.     and    c2.colid = r.fkey13
  12489.     and     r.rkeyid = o1.id
  12490.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12491.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12492.     and    o1.id = c1.id    
  12493.     and    c1.colid = r.rkey13
  12494.     union    all
  12495.     select
  12496.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12497.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12498.         PK_TABLE_NAME         = o1.name,
  12499.         PK_COLUMN_NAME         = c1.name,
  12500.         PK_COLUMN_GUID        = convert(binary(16),null),
  12501.         PK_COLUMN_PROPID    = convert(int,null),
  12502.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12503.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  12504.         FK_TABLE_NAME         = o2.name,
  12505.         FK_COLUMN_NAME         = c2.name,
  12506.         FK_COLUMN_GUID        = convert(binary(16),null),
  12507.         FK_COLUMN_PROPID    = convert(int,null),
  12508.         ORDINAL            = convert(int,14),
  12509.         UPDATE_RULE        = 'NO ACTION',
  12510.         DELETE_RULE         = 'NO ACTION'        
  12511.     from
  12512.         sysobjects o1, sysobjects o2,
  12513.         syscolumns c1, syscolumns c2,
  12514.         sysreferences r
  12515.     where    
  12516.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12517.     and    o2.name = @fk_table_name
  12518.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12519.     and    o2.id = r.fkeyid
  12520.     and    r.keycnt >= 14
  12521.     and    o2.id = c2.id
  12522.     and    c2.colid = r.fkey14
  12523.     and     r.rkeyid = o1.id
  12524.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12525.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12526.     and    o1.id = c1.id    
  12527.     and    c1.colid = r.rkey14
  12528.     union    all
  12529.     select
  12530.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12531.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12532.         PK_TABLE_NAME         = o1.name,
  12533.         PK_COLUMN_NAME         = c1.name,
  12534.         PK_COLUMN_GUID        = convert(binary(16),null),
  12535.         PK_COLUMN_PROPID    = convert(int,null),
  12536.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12537.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12538.         FK_TABLE_NAME         = o2.name,
  12539.         FK_COLUMN_NAME         = c2.name,
  12540.         FK_COLUMN_GUID        = convert(binary(16),null),
  12541.         FK_COLUMN_PROPID    = convert(int,null),
  12542.         ORDINAL            = convert(int,15),
  12543.         UPDATE_RULE        = 'NO ACTION',
  12544.         DELETE_RULE         = 'NO ACTION'        
  12545.     from
  12546.         sysobjects o1, sysobjects o2,
  12547.         syscolumns c1, syscolumns c2,
  12548.         sysreferences r
  12549.     where    
  12550.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12551.     and    o2.name = @fk_table_name
  12552.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12553.     and    o2.id = r.fkeyid
  12554.     and    r.keycnt >= 15
  12555.     and    o2.id = c2.id
  12556.     and    c2.colid = r.fkey15
  12557.     and     r.rkeyid = o1.id
  12558.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12559.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12560.     and    o1.id = c1.id    
  12561.     and    c1.colid = r.rkey15
  12562.     union    all
  12563.     select
  12564.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12565.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12566.         PK_TABLE_NAME         = o1.name,
  12567.         PK_COLUMN_NAME         = c1.name,
  12568.         PK_COLUMN_GUID        = convert(binary(16),null),
  12569.         PK_COLUMN_PROPID    = convert(int,null),
  12570.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12571.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12572.         FK_TABLE_NAME         = o2.name,
  12573.         FK_COLUMN_NAME         = c2.name,
  12574.         FK_COLUMN_GUID        = convert(binary(16),null),
  12575.         FK_COLUMN_PROPID    = convert(int,null),
  12576.         ORDINAL            = convert(int,16),
  12577.         UPDATE_RULE        = 'NO ACTION',
  12578.         DELETE_RULE         = 'NO ACTION'        
  12579.     from
  12580.         sysobjects o1, sysobjects o2,
  12581.         syscolumns c1, syscolumns c2,
  12582.         sysreferences r
  12583.     where    
  12584.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12585.     and    o2.name = @fk_table_name
  12586.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12587.     and    o2.id = r.fkeyid
  12588.     and    r.keycnt >= 16
  12589.     and    o2.id = c2.id
  12590.     and    c2.colid = r.fkey16
  12591.     and     r.rkeyid = o1.id
  12592.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  12593.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12594.     and    o1.id = c1.id    
  12595.     and    c1.colid = r.rkey16
  12596.     order by 8,9,2,3,13
  12597.     END
  12598. ELSE
  12599.     BEGIN
  12600.     insert into #spfkeysrowset1
  12601.     select
  12602.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12603.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12604.         PK_TABLE_NAME         = o1.name,
  12605.         PK_COLUMN_NAME         = c1.name,
  12606.         PK_COLUMN_GUID        = convert(binary(16),null),
  12607.         PK_COLUMN_PROPID    = convert(int,null),
  12608.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12609.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12610.         FK_TABLE_NAME         = o2.name,
  12611.         FK_COLUMN_NAME         = c2.name,
  12612.         FK_COLUMN_GUID        = convert(binary(16),null),
  12613.         FK_COLUMN_PROPID    = convert(int,null),
  12614.         ORDINAL            = convert(int,1),
  12615.         UPDATE_RULE        = 'NO ACTION',
  12616.         DELETE_RULE         = 'NO ACTION'        
  12617.     from
  12618.         sysobjects o1, sysobjects o2,
  12619.         syscolumns c1, syscolumns c2,
  12620.         sysreferences r
  12621.     where    
  12622.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12623.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12624.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12625.     and    o1.id = r.rkeyid
  12626.     and    o1.id = c1.id
  12627.     and    c1.colid = r.rkey1
  12628.     and     r.fkeyid = o2.id
  12629.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12630.     and    o2.id = c2.id    
  12631.     and    c2.colid = r.fkey1
  12632.     union all
  12633.     select
  12634.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12635.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12636.         PK_TABLE_NAME         = o1.name,
  12637.         PK_COLUMN_NAME         = c1.name,
  12638.         PK_COLUMN_GUID        = convert(binary(16),null),
  12639.         PK_COLUMN_PROPID    = convert(int,null),
  12640.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12641.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12642.         FK_TABLE_NAME         = o2.name,
  12643.         FK_COLUMN_NAME         = c2.name,
  12644.         FK_COLUMN_GUID        = convert(binary(16),null),
  12645.         FK_COLUMN_PROPID    = convert(int,null),
  12646.         ORDINAL            = convert(int,2),
  12647.         UPDATE_RULE        = 'NO ACTION',
  12648.         DELETE_RULE         = 'NO ACTION'        
  12649.     from
  12650.         sysobjects o1, sysobjects o2,
  12651.         syscolumns c1, syscolumns c2,
  12652.         sysreferences r
  12653.     where    
  12654.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12655.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12656.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12657.     and    o1.id = r.rkeyid
  12658.     and    r.keycnt >= 2
  12659.     and    o1.id = c1.id
  12660.     and    c1.colid = r.rkey2
  12661.     and     r.fkeyid = o2.id
  12662.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12663.     and    o2.id = c2.id    
  12664.     and    c2.colid = r.fkey2
  12665.     union all
  12666.     select
  12667.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12668.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12669.         PK_TABLE_NAME         = o1.name,
  12670.         PK_COLUMN_NAME         = c1.name,
  12671.         PK_COLUMN_GUID        = convert(binary(16),null),
  12672.         PK_COLUMN_PROPID    = convert(int,null),
  12673.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12674.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12675.         FK_TABLE_NAME         = o2.name,
  12676.         FK_COLUMN_NAME         = c2.name,
  12677.         FK_COLUMN_GUID        = convert(binary(16),null),
  12678.         FK_COLUMN_PROPID    = convert(int,null),
  12679.         ORDINAL            = convert(int,3),
  12680.         UPDATE_RULE        = 'NO ACTION',
  12681.         DELETE_RULE         = 'NO ACTION'        
  12682.     from
  12683.         sysobjects o1, sysobjects o2,
  12684.         syscolumns c1, syscolumns c2,
  12685.         sysreferences r
  12686.     where    
  12687.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12688.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12689.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12690.     and    o1.id = r.rkeyid
  12691.     and    r.keycnt >= 3
  12692.     and    o1.id = c1.id
  12693.     and    c1.colid = r.rkey3
  12694.     and     r.fkeyid = o2.id
  12695.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12696.     and    o2.id = c2.id    
  12697.     and    c2.colid = r.fkey3
  12698.     union all
  12699.     select
  12700.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12701.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12702.         PK_TABLE_NAME         = o1.name,
  12703.         PK_COLUMN_NAME         = c1.name,
  12704.         PK_COLUMN_GUID        = convert(binary(16),null),
  12705.         PK_COLUMN_PROPID    = convert(int,null),
  12706.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12707.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12708.         FK_TABLE_NAME         = o2.name,
  12709.         FK_COLUMN_NAME         = c2.name,
  12710.         FK_COLUMN_GUID        = convert(binary(16),null),
  12711.         FK_COLUMN_PROPID    = convert(int,null),
  12712.         ORDINAL            = convert(int,4),
  12713.         UPDATE_RULE        = 'NO ACTION',
  12714.         DELETE_RULE         = 'NO ACTION'        
  12715.     from
  12716.         sysobjects o1, sysobjects o2,
  12717.         syscolumns c1, syscolumns c2,
  12718.         sysreferences r
  12719.     where    
  12720.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12721.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12722.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12723.     and    o1.id = r.rkeyid
  12724.     and    r.keycnt >= 4
  12725.     and    o1.id = c1.id
  12726.     and    c1.colid = r.rkey4
  12727.     and     r.fkeyid = o2.id
  12728.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12729.     and    o2.id = c2.id    
  12730.     and    c2.colid = r.fkey4
  12731.     union all
  12732.     select
  12733.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12734.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12735.         PK_TABLE_NAME         = o1.name,
  12736.         PK_COLUMN_NAME         = c1.name,
  12737.         PK_COLUMN_GUID        = convert(binary(16),null),
  12738.         PK_COLUMN_PROPID    = convert(int,null),
  12739.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12740.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12741.         FK_TABLE_NAME         = o2.name,
  12742.         FK_COLUMN_NAME         = c2.name,
  12743.         FK_COLUMN_GUID        = convert(binary(16),null),
  12744.         FK_COLUMN_PROPID    = convert(int,null),
  12745.         ORDINAL            = convert(int,5),
  12746.         UPDATE_RULE        = 'NO ACTION',
  12747.         DELETE_RULE         = 'NO ACTION'        
  12748.     from
  12749.         sysobjects o1, sysobjects o2,
  12750.         syscolumns c1, syscolumns c2,
  12751.         sysreferences r
  12752.     where    
  12753.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12754.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12755.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12756.     and    o1.id = r.rkeyid
  12757.     and    r.keycnt >= 5
  12758.     and    o1.id = c1.id
  12759.     and    c1.colid = r.rkey5
  12760.     and     r.fkeyid = o2.id
  12761.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12762.     and    o2.id = c2.id    
  12763.     and    c2.colid = r.fkey5
  12764.     union all
  12765.     select
  12766.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12767.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12768.         PK_TABLE_NAME         = o1.name,
  12769.         PK_COLUMN_NAME         = c1.name,
  12770.         PK_COLUMN_GUID        = convert(binary(16),null),
  12771.         PK_COLUMN_PROPID    = convert(int,null),
  12772.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12773.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12774.         FK_TABLE_NAME         = o2.name,
  12775.         FK_COLUMN_NAME         = c2.name,
  12776.         FK_COLUMN_GUID        = convert(binary(16),null),
  12777.         FK_COLUMN_PROPID    = convert(int,null),
  12778.         ORDINAL            = convert(int,6),
  12779.         UPDATE_RULE        = 'NO ACTION',
  12780.         DELETE_RULE         = 'NO ACTION'        
  12781.     from
  12782.         sysobjects o1, sysobjects o2,
  12783.         syscolumns c1, syscolumns c2,
  12784.         sysreferences r
  12785.     where    
  12786.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12787.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12788.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12789.     and    o1.id = r.rkeyid
  12790.     and    r.keycnt >= 6
  12791.     and    o1.id = c1.id
  12792.     and    c1.colid = r.rkey6
  12793.     and     r.fkeyid = o2.id
  12794.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12795.     and    o2.id = c2.id    
  12796.     and    c2.colid = r.fkey6
  12797.     union all
  12798.     select
  12799.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12800.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12801.         PK_TABLE_NAME         = o1.name,
  12802.         PK_COLUMN_NAME         = c1.name,
  12803.         PK_COLUMN_GUID        = convert(binary(16),null),
  12804.         PK_COLUMN_PROPID    = convert(int,null),
  12805.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12806.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12807.         FK_TABLE_NAME         = o2.name,
  12808.         FK_COLUMN_NAME         = c2.name,
  12809.         FK_COLUMN_GUID        = convert(binary(16),null),
  12810.         FK_COLUMN_PROPID    = convert(int,null),
  12811.         ORDINAL            = convert(int,7),
  12812.         UPDATE_RULE        = 'NO ACTION',
  12813.         DELETE_RULE         = 'NO ACTION'        
  12814.     from
  12815.         sysobjects o1, sysobjects o2,
  12816.         syscolumns c1, syscolumns c2,
  12817.         sysreferences r
  12818.     where    
  12819.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12820.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12821.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12822.     and    o1.id = r.rkeyid
  12823.     and    r.keycnt >= 7
  12824.     and    o1.id = c1.id
  12825.     and    c1.colid = r.rkey7
  12826.     and     r.fkeyid = o2.id
  12827.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12828.     and    o2.id = c2.id    
  12829.     and    c2.colid = r.fkey7
  12830.     union all
  12831.     select
  12832.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12833.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12834.         PK_TABLE_NAME         = o1.name,
  12835.         PK_COLUMN_NAME         = c1.name,
  12836.         PK_COLUMN_GUID        = convert(binary(16),null),
  12837.         PK_COLUMN_PROPID    = convert(int,null),
  12838.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12839.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12840.         FK_TABLE_NAME         = o2.name,
  12841.         FK_COLUMN_NAME         = c2.name,
  12842.         FK_COLUMN_GUID        = convert(binary(16),null),
  12843.         FK_COLUMN_PROPID    = convert(int,null),
  12844.         ORDINAL            = convert(int,8),
  12845.         UPDATE_RULE        = 'NO ACTION',
  12846.         DELETE_RULE         = 'NO ACTION'        
  12847.     from
  12848.         sysobjects o1, sysobjects o2,
  12849.         syscolumns c1, syscolumns c2,
  12850.         sysreferences r
  12851.     where    
  12852.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12853.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12854.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12855.     and    o1.id = r.rkeyid
  12856.     and    r.keycnt >= 8
  12857.     and    o1.id = c1.id
  12858.     and    c1.colid = r.rkey8
  12859.     and     r.fkeyid = o2.id
  12860.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12861.     and    o2.id = c2.id    
  12862.     and    c2.colid = r.fkey8
  12863.     union all
  12864.     select
  12865.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12866.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12867.         PK_TABLE_NAME         = o1.name,
  12868.         PK_COLUMN_NAME         = c1.name,
  12869.         PK_COLUMN_GUID        = convert(binary(16),null),
  12870.         PK_COLUMN_PROPID    = convert(int,null),
  12871.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12872.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12873.         FK_TABLE_NAME         = o2.name,
  12874.         FK_COLUMN_NAME         = c2.name,
  12875.         FK_COLUMN_GUID        = convert(binary(16),null),
  12876.         FK_COLUMN_PROPID    = convert(int,null),
  12877.         ORDINAL            = convert(int,9),
  12878.         UPDATE_RULE        = 'NO ACTION',
  12879.         DELETE_RULE         = 'NO ACTION'        
  12880.     from
  12881.         sysobjects o1, sysobjects o2,
  12882.         syscolumns c1, syscolumns c2,
  12883.         sysreferences r
  12884.     where    
  12885.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12886.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12887.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12888.     and    o1.id = r.rkeyid
  12889.     and    r.keycnt >= 9
  12890.     and    o1.id = c1.id
  12891.     and    c1.colid = r.rkey9
  12892.     and     r.fkeyid = o2.id
  12893.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12894.     and    o2.id = c2.id    
  12895.     and    c2.colid = r.fkey9
  12896.     union all
  12897.     select
  12898.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12899.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12900.         PK_TABLE_NAME         = o1.name,
  12901.         PK_COLUMN_NAME         = c1.name,
  12902.         PK_COLUMN_GUID        = convert(binary(16),null),
  12903.         PK_COLUMN_PROPID    = convert(int,null),
  12904.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12905.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12906.         FK_TABLE_NAME         = o2.name,
  12907.         FK_COLUMN_NAME         = c2.name,
  12908.         FK_COLUMN_GUID        = convert(binary(16),null),
  12909.         FK_COLUMN_PROPID    = convert(int,null),
  12910.         ORDINAL            = convert(int,10),
  12911.         UPDATE_RULE        = 'NO ACTION',
  12912.         DELETE_RULE         = 'NO ACTION'        
  12913.     from
  12914.         sysobjects o1, sysobjects o2,
  12915.         syscolumns c1, syscolumns c2,
  12916.         sysreferences r
  12917.     where    
  12918.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12919.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12920.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12921.     and    o1.id = r.rkeyid
  12922.     and    r.keycnt >= 10
  12923.     and    o1.id = c1.id
  12924.     and    c1.colid = r.rkey10
  12925.     and     r.fkeyid = o2.id
  12926.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12927.     and    o2.id = c2.id    
  12928.     and    c2.colid = r.fkey10
  12929.     union all
  12930.     select
  12931.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12932.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12933.         PK_TABLE_NAME         = o1.name,
  12934.         PK_COLUMN_NAME         = c1.name,
  12935.         PK_COLUMN_GUID        = convert(binary(16),null),
  12936.         PK_COLUMN_PROPID    = convert(int,null),
  12937.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12938.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12939.         FK_TABLE_NAME         = o2.name,
  12940.         FK_COLUMN_NAME         = c2.name,
  12941.         FK_COLUMN_GUID        = convert(binary(16),null),
  12942.         FK_COLUMN_PROPID    = convert(int,null),
  12943.         ORDINAL            = convert(int,11),
  12944.         UPDATE_RULE        = 'NO ACTION',
  12945.         DELETE_RULE         = 'NO ACTION'        
  12946.     from
  12947.         sysobjects o1, sysobjects o2,
  12948.         syscolumns c1, syscolumns c2,
  12949.         sysreferences r
  12950.     where    
  12951.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12952.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12953.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12954.     and    o1.id = r.rkeyid
  12955.     and    r.keycnt >= 11
  12956.     and    o1.id = c1.id
  12957.     and    c1.colid = r.rkey11
  12958.     and     r.fkeyid = o2.id
  12959.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12960.     and    o2.id = c2.id    
  12961.     and    c2.colid = r.fkey11
  12962.     union all
  12963.     select
  12964.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12965.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12966.         PK_TABLE_NAME         = o1.name,
  12967.         PK_COLUMN_NAME         = c1.name,
  12968.         PK_COLUMN_GUID        = convert(binary(16),null),
  12969.         PK_COLUMN_PROPID    = convert(int,null),
  12970.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  12971.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  12972.         FK_TABLE_NAME         = o2.name,
  12973.         FK_COLUMN_NAME         = c2.name,
  12974.         FK_COLUMN_GUID        = convert(binary(16),null),
  12975.         FK_COLUMN_PROPID    = convert(int,null),
  12976.         ORDINAL            = convert(int,12),
  12977.         UPDATE_RULE        = 'NO ACTION',
  12978.         DELETE_RULE         = 'NO ACTION'        
  12979.     from
  12980.         sysobjects o1, sysobjects o2,
  12981.         syscolumns c1, syscolumns c2,
  12982.         sysreferences r
  12983.     where    
  12984.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  12985.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  12986.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  12987.     and    o1.id = r.rkeyid
  12988.     and    r.keycnt >= 12
  12989.     and    o1.id = c1.id
  12990.     and    c1.colid = r.rkey12
  12991.     and     r.fkeyid = o2.id
  12992.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  12993.     and    o2.id = c2.id    
  12994.     and    c2.colid = r.fkey12
  12995.     union all
  12996.     select
  12997.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  12998.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  12999.         PK_TABLE_NAME         = o1.name,
  13000.         PK_COLUMN_NAME         = c1.name,
  13001.         PK_COLUMN_GUID        = convert(binary(16),null),
  13002.         PK_COLUMN_PROPID    = convert(int,null),
  13003.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13004.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13005.         FK_TABLE_NAME         = o2.name,
  13006.         FK_COLUMN_NAME         = c2.name,
  13007.         FK_COLUMN_GUID        = convert(binary(16),null),
  13008.         FK_COLUMN_PROPID    = convert(int,null),
  13009.         ORDINAL            = convert(int,13),
  13010.         UPDATE_RULE        = 'NO ACTION',
  13011.         DELETE_RULE         = 'NO ACTION'        
  13012.     from
  13013.         sysobjects o1, sysobjects o2,
  13014.         syscolumns c1, syscolumns c2,
  13015.         sysreferences r
  13016.     where    
  13017.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13018.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13019.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13020.     and    o1.id = r.rkeyid
  13021.     and    r.keycnt >= 13
  13022.     and    o1.id = c1.id
  13023.     and    c1.colid = r.rkey13
  13024.     and     r.fkeyid = o2.id
  13025.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13026.     and    o2.id = c2.id    
  13027.     and    c2.colid = r.fkey13
  13028.     union all
  13029.     select
  13030.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13031.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13032.         PK_TABLE_NAME         = o1.name,
  13033.         PK_COLUMN_NAME         = c1.name,
  13034.         PK_COLUMN_GUID        = convert(binary(16),null),
  13035.         PK_COLUMN_PROPID    = convert(int,null),
  13036.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13037.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13038.         FK_TABLE_NAME         = o2.name,
  13039.         FK_COLUMN_NAME         = c2.name,
  13040.         FK_COLUMN_GUID        = convert(binary(16),null),
  13041.         FK_COLUMN_PROPID    = convert(int,null),
  13042.         ORDINAL            = convert(int,14),
  13043.         UPDATE_RULE        = 'NO ACTION',
  13044.         DELETE_RULE         = 'NO ACTION'        
  13045.     from
  13046.         sysobjects o1, sysobjects o2,
  13047.         syscolumns c1, syscolumns c2,
  13048.         sysreferences r
  13049.     where    
  13050.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13051.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13052.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13053.     and    o1.id = r.rkeyid
  13054.     and    r.keycnt >= 14
  13055.     and    o1.id = c1.id
  13056.     and    c1.colid = r.rkey14
  13057.     and     r.fkeyid = o2.id
  13058.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13059.     and    o2.id = c2.id    
  13060.     and    c2.colid = r.fkey14
  13061.     union all
  13062.     select
  13063.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13064.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13065.         PK_TABLE_NAME         = o1.name,
  13066.         PK_COLUMN_NAME         = c1.name,
  13067.         PK_COLUMN_GUID        = convert(binary(16),null),
  13068.         PK_COLUMN_PROPID    = convert(int,null),
  13069.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13070.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13071.         FK_TABLE_NAME         = o2.name,
  13072.         FK_COLUMN_NAME         = c2.name,
  13073.         FK_COLUMN_GUID        = convert(binary(16),null),
  13074.         FK_COLUMN_PROPID    = convert(int,null),
  13075.         ORDINAL            = convert(int,15),
  13076.         UPDATE_RULE        = 'NO ACTION',
  13077.         DELETE_RULE         = 'NO ACTION'        
  13078.     from
  13079.         sysobjects o1, sysobjects o2,
  13080.         syscolumns c1, syscolumns c2,
  13081.         sysreferences r
  13082.     where    
  13083.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13084.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13085.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13086.     and    o1.id = r.rkeyid
  13087.     and    r.keycnt >= 15
  13088.     and    o1.id = c1.id
  13089.     and    c1.colid = r.rkey15
  13090.     and     r.fkeyid = o2.id
  13091.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13092.     and    o2.id = c2.id    
  13093.     and    c2.colid = r.fkey15
  13094.     union all
  13095.     select
  13096.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13097.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13098.         PK_TABLE_NAME         = o1.name,
  13099.         PK_COLUMN_NAME         = c1.name,
  13100.         PK_COLUMN_GUID        = convert(binary(16),null),
  13101.         PK_COLUMN_PROPID    = convert(int,null),
  13102.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13103.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13104.         FK_TABLE_NAME         = o2.name,
  13105.         FK_COLUMN_NAME         = c2.name,
  13106.         FK_COLUMN_GUID        = convert(binary(16),null),
  13107.         FK_COLUMN_PROPID    = convert(int,null),
  13108.         ORDINAL            = convert(int,16),
  13109.         UPDATE_RULE        = 'NO ACTION',
  13110.         DELETE_RULE         = 'NO ACTION'        
  13111.     from
  13112.         sysobjects o1, sysobjects o2,
  13113.         syscolumns c1, syscolumns c2,
  13114.         sysreferences r
  13115.     where    
  13116.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13117.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13118.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13119.     and    o1.id = r.rkeyid
  13120.     and    o1.id = c1.id
  13121.     and    r.keycnt >= 16
  13122.     and    c1.colid = r.rkey16
  13123.     and     r.fkeyid = o2.id
  13124.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13125.     and    o2.id = c2.id    
  13126.     and    c2.colid = r.fkey16
  13127.     order by 8,9,2,3,13
  13128.     END
  13129.  
  13130.     exec @ret = sp_cursoropen @handle output, 'select * from #spfkeysrowset1',
  13131.         @scrollopt output, @ccopt output, @rows output
  13132.  
  13133.     drop table #spfkeysrowset1
  13134.        return isnull(@ret,0)
  13135. go
  13136. dump tran master with no_log
  13137. go
  13138.  
  13139.  
  13140. if (charindex('7.00', @@version) = 0)
  13141. begin
  13142.     print ''
  13143.     print ''
  13144.     print 'Warning:'
  13145.     print 'you are installing the stored procedures '
  13146.     print 'on a pre 7.0 SQL Server.'
  13147.     print 'Ignore the following errors.'
  13148. end
  13149. else
  13150.     drop proc sp_foreign_keys_rowset
  13151. go
  13152.  
  13153.  
  13154. /*    Procedure for 7.0 server */
  13155. CREATE PROCEDURE sp_foreign_keys_rowset
  13156.     (
  13157.     @pk_table_name        sysname,
  13158.     @pk_table_schema    sysname = null,
  13159.     @fk_table_name        sysname = null,
  13160.     @fk_table_schema    sysname = null,
  13161.     @fk_table_catalog    sysname = null
  13162.     )
  13163. as
  13164.     select
  13165.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13166.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13167.         PK_TABLE_NAME         = o1.name,
  13168.         PK_COLUMN_NAME         = c1.name,
  13169.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13170.         PK_COLUMN_PROPID    = convert(int,null),
  13171.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13172.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13173.         FK_TABLE_NAME         = o2.name,
  13174.         FK_COLUMN_NAME         = c2.name,
  13175.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13176.         FK_COLUMN_PROPID    = convert(int,null),
  13177.         ORDINAL            = convert(int,1),
  13178.         UPDATE_RULE        = N'NO ACTION',
  13179.         DELETE_RULE         = N'NO ACTION'        
  13180.     from
  13181.         sysobjects o1, sysobjects o2,
  13182.         syscolumns c1, syscolumns c2,
  13183.         sysreferences r
  13184.     where    
  13185.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13186.     and    o1.name = @pk_table_name
  13187.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13188.     and    o1.id = r.rkeyid
  13189.     and    o1.id = c1.id
  13190.     and    c1.colid = r.rkey1
  13191.     and     r.fkeyid = o2.id
  13192.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13193.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13194.     and    o2.id = c2.id    
  13195.     and    c2.colid = r.fkey1
  13196.     union all
  13197.     select
  13198.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13199.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13200.         PK_TABLE_NAME         = o1.name,
  13201.         PK_COLUMN_NAME         = c1.name,
  13202.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13203.         PK_COLUMN_PROPID    = convert(int,null),
  13204.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13205.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13206.         FK_TABLE_NAME         = o2.name,
  13207.         FK_COLUMN_NAME         = c2.name,
  13208.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13209.         FK_COLUMN_PROPID    = convert(int,null),
  13210.         ORDINAL            = convert(int,2),
  13211.         UPDATE_RULE        = N'NO ACTION',
  13212.         DELETE_RULE         = N'NO ACTION'        
  13213.     from
  13214.         sysobjects o1, sysobjects o2,
  13215.         syscolumns c1, syscolumns c2,
  13216.         sysreferences r
  13217.     where    
  13218.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13219.     and    o1.name = @pk_table_name
  13220.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13221.     and    o1.id = r.rkeyid
  13222.     and    o1.id = c1.id
  13223.     and    c1.colid = r.rkey2
  13224.     and    r.keycnt >= 2
  13225.     and     r.fkeyid = o2.id
  13226.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13227.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13228.     and    o2.id = c2.id    
  13229.     and    c2.colid = r.fkey2
  13230.     union all
  13231.     select
  13232.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13233.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13234.         PK_TABLE_NAME         = o1.name,
  13235.         PK_COLUMN_NAME         = c1.name,
  13236.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13237.         PK_COLUMN_PROPID    = convert(int,null),
  13238.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13239.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13240.         FK_TABLE_NAME         = o2.name,
  13241.         FK_COLUMN_NAME         = c2.name,
  13242.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13243.         FK_COLUMN_PROPID    = convert(int,null),
  13244.         ORDINAL            = convert(int,3),
  13245.         UPDATE_RULE        = N'NO ACTION',
  13246.         DELETE_RULE         = N'NO ACTION'        
  13247.     from
  13248.         sysobjects o1, sysobjects o2,
  13249.         syscolumns c1, syscolumns c2,
  13250.         sysreferences r
  13251.     where    
  13252.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13253.     and    o1.name = @pk_table_name
  13254.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13255.     and    o1.id = r.rkeyid
  13256.     and    o1.id = c1.id
  13257.     and    c1.colid = r.rkey3
  13258.     and    r.keycnt >= 3
  13259.     and     r.fkeyid = o2.id
  13260.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13261.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13262.     and    o2.id = c2.id    
  13263.     and    c2.colid = r.fkey3
  13264.     union all
  13265.     select
  13266.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13267.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13268.         PK_TABLE_NAME         = o1.name,
  13269.         PK_COLUMN_NAME         = c1.name,
  13270.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13271.         PK_COLUMN_PROPID    = convert(int,null),
  13272.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13273.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13274.         FK_TABLE_NAME         = o2.name,
  13275.         FK_COLUMN_NAME         = c2.name,
  13276.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13277.         FK_COLUMN_PROPID    = convert(int,null),
  13278.         ORDINAL            = convert(int,4),
  13279.         UPDATE_RULE        = N'NO ACTION',
  13280.         DELETE_RULE         = N'NO ACTION'        
  13281.     from
  13282.         sysobjects o1, sysobjects o2,
  13283.         syscolumns c1, syscolumns c2,
  13284.         sysreferences r
  13285.     where    
  13286.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13287.     and    o1.name = @pk_table_name
  13288.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13289.     and    o1.id = r.rkeyid
  13290.     and    r.keycnt >= 4
  13291.     and    o1.id = c1.id
  13292.     and    c1.colid = r.rkey4
  13293.     and     r.fkeyid = o2.id
  13294.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13295.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13296.     and    o2.id = c2.id    
  13297.     and    c2.colid = r.fkey4
  13298.     union all
  13299.     select
  13300.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13301.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13302.         PK_TABLE_NAME         = o1.name,
  13303.         PK_COLUMN_NAME         = c1.name,
  13304.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13305.         PK_COLUMN_PROPID    = convert(int,null),
  13306.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13307.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13308.         FK_TABLE_NAME         = o2.name,
  13309.         FK_COLUMN_NAME         = c2.name,
  13310.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13311.         FK_COLUMN_PROPID    = convert(int,null),
  13312.         ORDINAL            = convert(int,5),
  13313.         UPDATE_RULE        = N'NO ACTION',
  13314.         DELETE_RULE         = N'NO ACTION'        
  13315.     from
  13316.         sysobjects o1, sysobjects o2,
  13317.         syscolumns c1, syscolumns c2,
  13318.         sysreferences r
  13319.     where    
  13320.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13321.     and    o1.name = @pk_table_name
  13322.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13323.     and    o1.id = r.rkeyid
  13324.     and    r.keycnt >= 5
  13325.     and    o1.id = c1.id
  13326.     and    c1.colid = r.rkey5
  13327.     and     r.fkeyid = o2.id
  13328.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13329.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13330.     and    o2.id = c2.id    
  13331.     and    c2.colid = r.fkey5
  13332.     union all
  13333.     select
  13334.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13335.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13336.         PK_TABLE_NAME         = o1.name,
  13337.         PK_COLUMN_NAME         = c1.name,
  13338.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13339.         PK_COLUMN_PROPID    = convert(int,null),
  13340.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13341.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13342.         FK_TABLE_NAME         = o2.name,
  13343.         FK_COLUMN_NAME         = c2.name,
  13344.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13345.         FK_COLUMN_PROPID    = convert(int,null),
  13346.         ORDINAL            = convert(int,6),
  13347.         UPDATE_RULE        = N'NO ACTION',
  13348.         DELETE_RULE         = N'NO ACTION'        
  13349.     from
  13350.         sysobjects o1, sysobjects o2,
  13351.         syscolumns c1, syscolumns c2,
  13352.         sysreferences r
  13353.     where    
  13354.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13355.     and    o1.name = @pk_table_name
  13356.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13357.     and    o1.id = r.rkeyid
  13358.     and    r.keycnt >= 6
  13359.     and    o1.id = c1.id
  13360.     and    c1.colid = r.rkey6
  13361.     and     r.fkeyid = o2.id
  13362.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13363.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13364.     and    o2.id = c2.id    
  13365.     and    c2.colid = r.fkey6
  13366.     union all
  13367.     select
  13368.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13369.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13370.         PK_TABLE_NAME         = o1.name,
  13371.         PK_COLUMN_NAME         = c1.name,
  13372.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13373.         PK_COLUMN_PROPID    = convert(int,null),
  13374.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13375.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13376.         FK_TABLE_NAME         = o2.name,
  13377.         FK_COLUMN_NAME         = c2.name,
  13378.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13379.         FK_COLUMN_PROPID    = convert(int,null),
  13380.         ORDINAL            = convert(int,7),
  13381.         UPDATE_RULE        = N'NO ACTION',
  13382.         DELETE_RULE         = N'NO ACTION'        
  13383.     from
  13384.         sysobjects o1, sysobjects o2,
  13385.         syscolumns c1, syscolumns c2,
  13386.         sysreferences r
  13387.     where    
  13388.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13389.     and    o1.name = @pk_table_name
  13390.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13391.     and    o1.id = r.rkeyid
  13392.     and    r.keycnt >= 7
  13393.     and    o1.id = c1.id
  13394.     and    c1.colid = r.rkey7
  13395.     and     r.fkeyid = o2.id
  13396.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13397.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13398.     and    o2.id = c2.id    
  13399.     and    c2.colid = r.fkey7
  13400.     union all
  13401.     select
  13402.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13403.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13404.         PK_TABLE_NAME         = o1.name,
  13405.         PK_COLUMN_NAME         = c1.name,
  13406.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13407.         PK_COLUMN_PROPID    = convert(int,null),
  13408.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13409.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13410.         FK_TABLE_NAME         = o2.name,
  13411.         FK_COLUMN_NAME         = c2.name,
  13412.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13413.         FK_COLUMN_PROPID    = convert(int,null),
  13414.         ORDINAL            = convert(int,8),
  13415.         UPDATE_RULE        = N'NO ACTION',
  13416.         DELETE_RULE         = N'NO ACTION'        
  13417.     from
  13418.         sysobjects o1, sysobjects o2,
  13419.         syscolumns c1, syscolumns c2,
  13420.         sysreferences r
  13421.     where    
  13422.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13423.     and    o1.name = @pk_table_name
  13424.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13425.     and    o1.id = r.rkeyid
  13426.     and    r.keycnt >= 8
  13427.     and    o1.id = c1.id
  13428.     and    c1.colid = r.rkey8
  13429.     and     r.fkeyid = o2.id
  13430.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13431.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13432.     and    o2.id = c2.id    
  13433.     and    c2.colid = r.fkey8
  13434.     union all
  13435.     select
  13436.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13437.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13438.         PK_TABLE_NAME         = o1.name,
  13439.         PK_COLUMN_NAME         = c1.name,
  13440.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13441.         PK_COLUMN_PROPID    = convert(int,null),
  13442.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13443.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13444.         FK_TABLE_NAME         = o2.name,
  13445.         FK_COLUMN_NAME         = c2.name,
  13446.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13447.         FK_COLUMN_PROPID    = convert(int,null),
  13448.         ORDINAL            = convert(int,9),
  13449.         UPDATE_RULE        = N'NO ACTION',
  13450.         DELETE_RULE         = N'NO ACTION'        
  13451.     from
  13452.         sysobjects o1, sysobjects o2,
  13453.         syscolumns c1, syscolumns c2,
  13454.         sysreferences r
  13455.     where    
  13456.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13457.     and    o1.name = @pk_table_name
  13458.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13459.     and    o1.id = r.rkeyid
  13460.     and    r.keycnt >= 9
  13461.     and    o1.id = c1.id
  13462.     and    c1.colid = r.rkey9
  13463.     and     r.fkeyid = o2.id
  13464.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13465.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13466.     and    o2.id = c2.id    
  13467.     and    c2.colid = r.fkey9
  13468.     union all
  13469.     select
  13470.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13471.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13472.         PK_TABLE_NAME         = o1.name,
  13473.         PK_COLUMN_NAME         = c1.name,
  13474.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13475.         PK_COLUMN_PROPID    = convert(int,null),
  13476.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13477.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13478.         FK_TABLE_NAME         = o2.name,
  13479.         FK_COLUMN_NAME         = c2.name,
  13480.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13481.         FK_COLUMN_PROPID    = convert(int,null),
  13482.         ORDINAL            = convert(int,10),
  13483.         UPDATE_RULE        = N'NO ACTION',
  13484.         DELETE_RULE         = N'NO ACTION'        
  13485.     from
  13486.         sysobjects o1, sysobjects o2,
  13487.         syscolumns c1, syscolumns c2,
  13488.         sysreferences r
  13489.     where    
  13490.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13491.     and    o1.name = @pk_table_name
  13492.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13493.     and    o1.id = r.rkeyid
  13494.     and    r.keycnt >= 10
  13495.     and    o1.id = c1.id
  13496.     and    c1.colid = r.rkey10
  13497.     and     r.fkeyid = o2.id
  13498.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13499.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13500.     and    o2.id = c2.id    
  13501.     and    c2.colid = r.fkey10
  13502.     union all
  13503.     select
  13504.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13505.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13506.         PK_TABLE_NAME         = o1.name,
  13507.         PK_COLUMN_NAME         = c1.name,
  13508.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13509.         PK_COLUMN_PROPID    = convert(int,null),
  13510.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13511.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13512.         FK_TABLE_NAME         = o2.name,
  13513.         FK_COLUMN_NAME         = c2.name,
  13514.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13515.         FK_COLUMN_PROPID    = convert(int,null),
  13516.         ORDINAL            = convert(int,11),
  13517.         UPDATE_RULE        = N'NO ACTION',
  13518.         DELETE_RULE         = N'NO ACTION'        
  13519.     from
  13520.         sysobjects o1, sysobjects o2,
  13521.         syscolumns c1, syscolumns c2,
  13522.         sysreferences r
  13523.     where    
  13524.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13525.     and    o1.name = @pk_table_name
  13526.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13527.     and    o1.id = r.rkeyid
  13528.     and    r.keycnt >= 11
  13529.     and    o1.id = c1.id
  13530.     and    c1.colid = r.rkey11
  13531.     and     r.fkeyid = o2.id
  13532.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13533.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13534.     and    o2.id = c2.id    
  13535.     and    c2.colid = r.fkey11
  13536.     union all
  13537.     select
  13538.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13539.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13540.         PK_TABLE_NAME         = o1.name,
  13541.         PK_COLUMN_NAME         = c1.name,
  13542.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13543.         PK_COLUMN_PROPID    = convert(int,null),
  13544.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13545.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13546.         FK_TABLE_NAME         = o2.name,
  13547.         FK_COLUMN_NAME         = c2.name,
  13548.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13549.         FK_COLUMN_PROPID    = convert(int,null),
  13550.         ORDINAL            = convert(int,12),
  13551.         UPDATE_RULE        = N'NO ACTION',
  13552.         DELETE_RULE         = N'NO ACTION'        
  13553.     from
  13554.         sysobjects o1, sysobjects o2,
  13555.         syscolumns c1, syscolumns c2,
  13556.         sysreferences r
  13557.     where    
  13558.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13559.     and    o1.name = @pk_table_name
  13560.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13561.     and    o1.id = r.rkeyid
  13562.     and    r.keycnt >= 12
  13563.     and    o1.id = c1.id
  13564.     and    c1.colid = r.rkey12
  13565.     and     r.fkeyid = o2.id
  13566.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13567.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13568.     and    o2.id = c2.id    
  13569.     and    c2.colid = r.fkey12
  13570.     union all
  13571.     select
  13572.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13573.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13574.         PK_TABLE_NAME         = o1.name,
  13575.         PK_COLUMN_NAME         = c1.name,
  13576.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13577.         PK_COLUMN_PROPID    = convert(int,null),
  13578.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13579.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13580.         FK_TABLE_NAME         = o2.name,
  13581.         FK_COLUMN_NAME         = c2.name,
  13582.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13583.         FK_COLUMN_PROPID    = convert(int,null),
  13584.         ORDINAL            = convert(int,13),
  13585.         UPDATE_RULE        = N'NO ACTION',
  13586.         DELETE_RULE         = N'NO ACTION'        
  13587.     from
  13588.         sysobjects o1, sysobjects o2,
  13589.         syscolumns c1, syscolumns c2,
  13590.         sysreferences r
  13591.     where    
  13592.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13593.     and    o1.name = @pk_table_name
  13594.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13595.     and    o1.id = r.rkeyid
  13596.     and    r.keycnt >= 13
  13597.     and    o1.id = c1.id
  13598.     and    c1.colid = r.rkey13
  13599.     and     r.fkeyid = o2.id
  13600.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13601.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13602.     and    o2.id = c2.id    
  13603.     and    c2.colid = r.fkey13
  13604.     union all
  13605.     select
  13606.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13607.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13608.         PK_TABLE_NAME         = o1.name,
  13609.         PK_COLUMN_NAME         = c1.name,
  13610.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13611.         PK_COLUMN_PROPID    = convert(int,null),
  13612.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13613.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13614.         FK_TABLE_NAME         = o2.name,
  13615.         FK_COLUMN_NAME         = c2.name,
  13616.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13617.         FK_COLUMN_PROPID    = convert(int,null),
  13618.         ORDINAL            = convert(int,14),
  13619.         UPDATE_RULE        = N'NO ACTION',
  13620.         DELETE_RULE         = N'NO ACTION'        
  13621.     from
  13622.         sysobjects o1, sysobjects o2,
  13623.         syscolumns c1, syscolumns c2,
  13624.         sysreferences r
  13625.     where    
  13626.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13627.     and    o1.name = @pk_table_name
  13628.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13629.     and    o1.id = r.rkeyid
  13630.     and    r.keycnt >= 14
  13631.     and    o1.id = c1.id
  13632.     and    c1.colid = r.rkey14
  13633.     and     r.fkeyid = o2.id
  13634.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13635.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13636.     and    o2.id = c2.id    
  13637.     and    c2.colid = r.fkey14
  13638.     union all
  13639.     select
  13640.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13641.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13642.         PK_TABLE_NAME         = o1.name,
  13643.         PK_COLUMN_NAME         = c1.name,
  13644.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13645.         PK_COLUMN_PROPID    = convert(int,null),
  13646.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13647.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13648.         FK_TABLE_NAME         = o2.name,
  13649.         FK_COLUMN_NAME         = c2.name,
  13650.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13651.         FK_COLUMN_PROPID    = convert(int,null),
  13652.         ORDINAL            = convert(int,15),
  13653.         UPDATE_RULE        = N'NO ACTION',
  13654.         DELETE_RULE         = N'NO ACTION'        
  13655.     from
  13656.         sysobjects o1, sysobjects o2,
  13657.         syscolumns c1, syscolumns c2,
  13658.         sysreferences r
  13659.     where    
  13660.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13661.     and    o1.name = @pk_table_name
  13662.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13663.     and    o1.id = r.rkeyid
  13664.     and    r.keycnt >= 15
  13665.     and    o1.id = c1.id
  13666.     and    c1.colid = r.rkey15
  13667.     and     r.fkeyid = o2.id
  13668.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13669.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13670.     and    o2.id = c2.id    
  13671.     and    c2.colid = r.fkey15
  13672.     union all
  13673.     select
  13674.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13675.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13676.         PK_TABLE_NAME         = o1.name,
  13677.         PK_COLUMN_NAME         = c1.name,
  13678.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13679.         PK_COLUMN_PROPID    = convert(int,null),
  13680.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13681.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13682.         FK_TABLE_NAME         = o2.name,
  13683.         FK_COLUMN_NAME         = c2.name,
  13684.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13685.         FK_COLUMN_PROPID    = convert(int,null),
  13686.         ORDINAL            = convert(int,16),
  13687.         UPDATE_RULE        = N'NO ACTION',
  13688.         DELETE_RULE         = N'NO ACTION'        
  13689.     from
  13690.         sysobjects o1, sysobjects o2,
  13691.         syscolumns c1, syscolumns c2,
  13692.         sysreferences r
  13693.     where    
  13694.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  13695.     and    o1.name = @pk_table_name
  13696.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13697.     and    o1.id = r.rkeyid
  13698.     and    r.keycnt >= 16
  13699.     and    o1.id = c1.id
  13700.     and    c1.colid = r.rkey16
  13701.     and     r.fkeyid = o2.id
  13702.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  13703.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13704.     and    o2.id = c2.id    
  13705.     and    c2.colid = r.fkey16
  13706.     order by 8,9,2,3,13
  13707. go
  13708. CREATE PROCEDURE sp_foreign_keys_rowset;2
  13709.     (
  13710.     @fk_table_name        sysname,
  13711.     @fk_table_schema    sysname = null,
  13712.     @pk_table_name        sysname = null,
  13713.     @pk_table_schema    sysname = null,
  13714.     @pk_table_catalog    sysname = null
  13715.     )
  13716. as
  13717.     select
  13718.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13719.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13720.         PK_TABLE_NAME         = o1.name,
  13721.         PK_COLUMN_NAME         = c1.name,
  13722.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13723.         PK_COLUMN_PROPID    = convert(int,null),
  13724.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13725.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13726.         FK_TABLE_NAME         = o2.name,
  13727.         FK_COLUMN_NAME         = c2.name,
  13728.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13729.         FK_COLUMN_PROPID    = convert(int,null),
  13730.         ORDINAL            = convert(int,1),
  13731.         UPDATE_RULE        = N'NO ACTION',
  13732.         DELETE_RULE         = N'NO ACTION'        
  13733.     from
  13734.         sysobjects o1, sysobjects o2,
  13735.         syscolumns c1, syscolumns c2,
  13736.         sysreferences r
  13737.     where    
  13738.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13739.     and    o2.name = @fk_table_name
  13740.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13741.     and    o2.id = r.fkeyid
  13742.     and    o2.id = c2.id
  13743.     and    c2.colid = r.fkey1
  13744.     and     r.rkeyid = o1.id
  13745.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13746.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13747.     and    o1.id = c1.id    
  13748.     and    c1.colid = r.rkey1
  13749.     union    all
  13750.     select
  13751.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13752.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13753.         PK_TABLE_NAME         = o1.name,
  13754.         PK_COLUMN_NAME         = c1.name,
  13755.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13756.         PK_COLUMN_PROPID    = convert(int,null),
  13757.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13758.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13759.         FK_TABLE_NAME         = o2.name,
  13760.         FK_COLUMN_NAME         = c2.name,
  13761.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13762.         FK_COLUMN_PROPID    = convert(int,null),
  13763.         ORDINAL            = convert(int,2),
  13764.         UPDATE_RULE        = N'NO ACTION',
  13765.         DELETE_RULE         = N'NO ACTION'        
  13766.     from
  13767.         sysobjects o1, sysobjects o2,
  13768.         syscolumns c1, syscolumns c2,
  13769.         sysreferences r
  13770.     where    
  13771.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13772.     and    o2.name = @fk_table_name
  13773.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13774.     and    o2.id = r.fkeyid
  13775.     and    r.keycnt >= 2
  13776.     and    o2.id = c2.id
  13777.     and    c2.colid = r.fkey2
  13778.     and     r.rkeyid = o1.id
  13779.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13780.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13781.     and    o1.id = c1.id    
  13782.     and    c1.colid = r.rkey2
  13783.     union    all
  13784.     select
  13785.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13786.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13787.         PK_TABLE_NAME         = o1.name,
  13788.         PK_COLUMN_NAME         = c1.name,
  13789.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13790.         PK_COLUMN_PROPID    = convert(int,null),
  13791.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13792.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13793.         FK_TABLE_NAME         = o2.name,
  13794.         FK_COLUMN_NAME         = c2.name,
  13795.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13796.         FK_COLUMN_PROPID    = convert(int,null),
  13797.         ORDINAL            = convert(int,3),
  13798.         UPDATE_RULE        = N'NO ACTION',
  13799.         DELETE_RULE         = N'NO ACTION'        
  13800.     from
  13801.         sysobjects o1, sysobjects o2,
  13802.         syscolumns c1, syscolumns c2,
  13803.         sysreferences r
  13804.     where    
  13805.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13806.     and    o2.name = @fk_table_name
  13807.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13808.     and    o2.id = r.fkeyid
  13809.     and    r.keycnt >= 3
  13810.     and    o2.id = c2.id
  13811.     and    c2.colid = r.fkey3
  13812.     and     r.rkeyid = o1.id
  13813.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13814.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13815.     and    o1.id = c1.id    
  13816.     and    c1.colid = r.rkey3
  13817.     union    all
  13818.     select
  13819.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13820.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13821.         PK_TABLE_NAME         = o1.name,
  13822.         PK_COLUMN_NAME         = c1.name,
  13823.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13824.         PK_COLUMN_PROPID    = convert(int,null),
  13825.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13826.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13827.         FK_TABLE_NAME         = o2.name,
  13828.         FK_COLUMN_NAME         = c2.name,
  13829.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13830.         FK_COLUMN_PROPID    = convert(int,null),
  13831.         ORDINAL            = convert(int,4),
  13832.         UPDATE_RULE        = N'NO ACTION',
  13833.         DELETE_RULE         = N'NO ACTION'        
  13834.     from
  13835.         sysobjects o1, sysobjects o2,
  13836.         syscolumns c1, syscolumns c2,
  13837.         sysreferences r
  13838.     where    
  13839.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13840.     and    o2.name = @fk_table_name
  13841.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13842.     and    o2.id = r.fkeyid
  13843.     and    r.keycnt >= 4
  13844.     and    o2.id = c2.id
  13845.     and    c2.colid = r.fkey4
  13846.     and     r.rkeyid = o1.id
  13847.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13848.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13849.     and    o1.id = c1.id    
  13850.     and    c1.colid = r.rkey4
  13851.     union    all
  13852.     select
  13853.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13854.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13855.         PK_TABLE_NAME         = o1.name,
  13856.         PK_COLUMN_NAME         = c1.name,
  13857.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13858.         PK_COLUMN_PROPID    = convert(int,null),
  13859.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13860.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13861.         FK_TABLE_NAME         = o2.name,
  13862.         FK_COLUMN_NAME         = c2.name,
  13863.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13864.         FK_COLUMN_PROPID    = convert(int,null),
  13865.         ORDINAL            = convert(int,5),
  13866.         UPDATE_RULE        = N'NO ACTION',
  13867.         DELETE_RULE         = N'NO ACTION'        
  13868.     from
  13869.         sysobjects o1, sysobjects o2,
  13870.         syscolumns c1, syscolumns c2,
  13871.         sysreferences r
  13872.     where    
  13873.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13874.     and    o2.name = @fk_table_name
  13875.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13876.     and    o2.id = r.fkeyid
  13877.     and    r.keycnt >= 5
  13878.     and    o2.id = c2.id
  13879.     and    c2.colid = r.fkey5
  13880.     and     r.rkeyid = o1.id
  13881.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13882.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13883.     and    o1.id = c1.id    
  13884.     and    c1.colid = r.rkey5
  13885.     union    all
  13886.     select
  13887.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13888.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13889.         PK_TABLE_NAME         = o1.name,
  13890.         PK_COLUMN_NAME         = c1.name,
  13891.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13892.         PK_COLUMN_PROPID    = convert(int,null),
  13893.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13894.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13895.         FK_TABLE_NAME         = o2.name,
  13896.         FK_COLUMN_NAME         = c2.name,
  13897.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13898.         FK_COLUMN_PROPID    = convert(int,null),
  13899.         ORDINAL            = convert(int,6),
  13900.         UPDATE_RULE        = N'NO ACTION',
  13901.         DELETE_RULE         = N'NO ACTION'        
  13902.     from
  13903.         sysobjects o1, sysobjects o2,
  13904.         syscolumns c1, syscolumns c2,
  13905.         sysreferences r
  13906.     where    
  13907.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13908.     and    o2.name = @fk_table_name
  13909.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13910.     and    o2.id = r.fkeyid
  13911.     and    r.keycnt >= 6
  13912.     and    o2.id = c2.id
  13913.     and    c2.colid = r.fkey6
  13914.     and     r.rkeyid = o1.id
  13915.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13916.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13917.     and    o1.id = c1.id    
  13918.     and    c1.colid = r.rkey6
  13919.     union    all
  13920.     select
  13921.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13922.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13923.         PK_TABLE_NAME         = o1.name,
  13924.         PK_COLUMN_NAME         = c1.name,
  13925.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13926.         PK_COLUMN_PROPID    = convert(int,null),
  13927.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13928.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  13929.         FK_TABLE_NAME         = o2.name,
  13930.         FK_COLUMN_NAME         = c2.name,
  13931.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13932.         FK_COLUMN_PROPID    = convert(int,null),
  13933.         ORDINAL            = convert(int,7),
  13934.         UPDATE_RULE        = N'NO ACTION',
  13935.         DELETE_RULE         = N'NO ACTION'        
  13936.     from
  13937.         sysobjects o1, sysobjects o2,
  13938.         syscolumns c1, syscolumns c2,
  13939.         sysreferences r
  13940.     where    
  13941.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13942.     and    o2.name = @fk_table_name
  13943.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13944.     and    o2.id = r.fkeyid
  13945.     and    r.keycnt >= 7
  13946.     and    o2.id = c2.id
  13947.     and    c2.colid = r.fkey7
  13948.     and     r.rkeyid = o1.id
  13949.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13950.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13951.     and    o1.id = c1.id    
  13952.     and    c1.colid = r.rkey7
  13953.     union    all
  13954.     select
  13955.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13956.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13957.         PK_TABLE_NAME         = o1.name,
  13958.         PK_COLUMN_NAME         = c1.name,
  13959.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13960.         PK_COLUMN_PROPID    = convert(int,null),
  13961.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13962.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13963.         FK_TABLE_NAME         = o2.name,
  13964.         FK_COLUMN_NAME         = c2.name,
  13965.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13966.         FK_COLUMN_PROPID    = convert(int,null),
  13967.         ORDINAL            = convert(int,8),
  13968.         UPDATE_RULE        = N'NO ACTION',
  13969.         DELETE_RULE         = N'NO ACTION'        
  13970.     from
  13971.         sysobjects o1, sysobjects o2,
  13972.         syscolumns c1, syscolumns c2,
  13973.         sysreferences r
  13974.     where    
  13975.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  13976.     and    o2.name = @fk_table_name
  13977.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  13978.     and    o2.id = r.fkeyid
  13979.     and    r.keycnt >= 8
  13980.     and    o2.id = c2.id
  13981.     and    c2.colid = r.fkey8
  13982.     and     r.rkeyid = o1.id
  13983.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  13984.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  13985.     and    o1.id = c1.id    
  13986.     and    c1.colid = r.rkey8
  13987.     union    all
  13988.     select
  13989.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  13990.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  13991.         PK_TABLE_NAME         = o1.name,
  13992.         PK_COLUMN_NAME         = c1.name,
  13993.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  13994.         PK_COLUMN_PROPID    = convert(int,null),
  13995.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  13996.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  13997.         FK_TABLE_NAME         = o2.name,
  13998.         FK_COLUMN_NAME         = c2.name,
  13999.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14000.         FK_COLUMN_PROPID    = convert(int,null),
  14001.         ORDINAL            = convert(int,9),
  14002.         UPDATE_RULE        = N'NO ACTION',
  14003.         DELETE_RULE         = N'NO ACTION'        
  14004.     from
  14005.         sysobjects o1, sysobjects o2,
  14006.         syscolumns c1, syscolumns c2,
  14007.         sysreferences r
  14008.     where    
  14009.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14010.     and    o2.name = @fk_table_name
  14011.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14012.     and    o2.id = r.fkeyid
  14013.     and    r.keycnt >= 9
  14014.     and    o2.id = c2.id
  14015.     and    c2.colid = r.fkey9
  14016.     and     r.rkeyid = o1.id
  14017.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14018.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14019.     and    o1.id = c1.id    
  14020.     and    c1.colid = r.rkey9
  14021.     union    all
  14022.     select
  14023.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14024.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14025.         PK_TABLE_NAME         = o1.name,
  14026.         PK_COLUMN_NAME         = c1.name,
  14027.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14028.         PK_COLUMN_PROPID    = convert(int,null),
  14029.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14030.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14031.         FK_TABLE_NAME         = o2.name,
  14032.         FK_COLUMN_NAME         = c2.name,
  14033.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14034.         FK_COLUMN_PROPID    = convert(int,null),
  14035.         ORDINAL            = convert(int,10),
  14036.         UPDATE_RULE        = N'NO ACTION',
  14037.         DELETE_RULE         = N'NO ACTION'        
  14038.     from
  14039.         sysobjects o1, sysobjects o2,
  14040.         syscolumns c1, syscolumns c2,
  14041.         sysreferences r
  14042.     where    
  14043.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14044.     and    o2.name = @fk_table_name
  14045.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14046.     and    o2.id = r.fkeyid
  14047.     and    r.keycnt >= 10
  14048.     and    o2.id = c2.id
  14049.     and    c2.colid = r.fkey10
  14050.     and     r.rkeyid = o1.id
  14051.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14052.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14053.     and    o1.id = c1.id    
  14054.     and    c1.colid = r.rkey10
  14055.     union    all
  14056.     select
  14057.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14058.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14059.         PK_TABLE_NAME         = o1.name,
  14060.         PK_COLUMN_NAME         = c1.name,
  14061.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14062.         PK_COLUMN_PROPID    = convert(int,null),
  14063.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14064.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  14065.         FK_TABLE_NAME         = o2.name,
  14066.         FK_COLUMN_NAME         = c2.name,
  14067.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14068.         FK_COLUMN_PROPID    = convert(int,null),
  14069.         ORDINAL            = convert(int,11),
  14070.         UPDATE_RULE        = N'NO ACTION',
  14071.         DELETE_RULE         = N'NO ACTION'        
  14072.     from
  14073.         sysobjects o1, sysobjects o2,
  14074.         syscolumns c1, syscolumns c2,
  14075.         sysreferences r
  14076.     where    
  14077.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14078.     and    o2.name = @fk_table_name
  14079.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14080.     and    o2.id = r.fkeyid
  14081.     and    r.keycnt >= 11
  14082.     and    o2.id = c2.id
  14083.     and    c2.colid = r.fkey11
  14084.     and     r.rkeyid = o1.id
  14085.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14086.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14087.     and    o1.id = c1.id    
  14088.     and    c1.colid = r.rkey11
  14089.     union    all
  14090.     select
  14091.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14092.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14093.         PK_TABLE_NAME         = o1.name,
  14094.         PK_COLUMN_NAME         = c1.name,
  14095.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14096.         PK_COLUMN_PROPID    = convert(int,null),
  14097.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14098.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14099.         FK_TABLE_NAME         = o2.name,
  14100.         FK_COLUMN_NAME         = c2.name,
  14101.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14102.         FK_COLUMN_PROPID    = convert(int,null),
  14103.         ORDINAL            = convert(int,12),
  14104.         UPDATE_RULE        = N'NO ACTION',
  14105.         DELETE_RULE         = N'NO ACTION'        
  14106.     from
  14107.         sysobjects o1, sysobjects o2,
  14108.         syscolumns c1, syscolumns c2,
  14109.         sysreferences r
  14110.     where    
  14111.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14112.     and    o2.name = @fk_table_name
  14113.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14114.     and    o2.id = r.fkeyid
  14115.     and    r.keycnt >= 12
  14116.     and    o2.id = c2.id
  14117.     and    c2.colid = r.fkey12
  14118.     and     r.rkeyid = o1.id
  14119.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14120.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14121.     and    o1.id = c1.id    
  14122.     and    c1.colid = r.rkey12
  14123.     union    all
  14124.     select
  14125.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14126.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14127.         PK_TABLE_NAME         = o1.name,
  14128.         PK_COLUMN_NAME         = c1.name,
  14129.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14130.         PK_COLUMN_PROPID    = convert(int,null),
  14131.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14132.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14133.         FK_TABLE_NAME         = o2.name,
  14134.         FK_COLUMN_NAME         = c2.name,
  14135.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14136.         FK_COLUMN_PROPID    = convert(int,null),
  14137.         ORDINAL            = convert(int,13),
  14138.         UPDATE_RULE        = N'NO ACTION',
  14139.         DELETE_RULE         = N'NO ACTION'        
  14140.     from
  14141.         sysobjects o1, sysobjects o2,
  14142.         syscolumns c1, syscolumns c2,
  14143.         sysreferences r
  14144.     where    
  14145.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14146.     and    o2.name = @fk_table_name
  14147.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14148.     and    o2.id = r.fkeyid
  14149.     and    r.keycnt >= 13
  14150.     and    o2.id = c2.id
  14151.     and    c2.colid = r.fkey13
  14152.     and     r.rkeyid = o1.id
  14153.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14154.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14155.     and    o1.id = c1.id    
  14156.     and    c1.colid = r.rkey13
  14157.     union    all
  14158.     select
  14159.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14160.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14161.         PK_TABLE_NAME         = o1.name,
  14162.         PK_COLUMN_NAME         = c1.name,
  14163.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14164.         PK_COLUMN_PROPID    = convert(int,null),
  14165.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14166.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14167.         FK_TABLE_NAME         = o2.name,
  14168.         FK_COLUMN_NAME         = c2.name,
  14169.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14170.         FK_COLUMN_PROPID    = convert(int,null),
  14171.         ORDINAL            = convert(int,14),
  14172.         UPDATE_RULE        = N'NO ACTION',
  14173.         DELETE_RULE         = N'NO ACTION'        
  14174.     from
  14175.         sysobjects o1, sysobjects o2,
  14176.         syscolumns c1, syscolumns c2,
  14177.         sysreferences r
  14178.     where    
  14179.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14180.     and    o2.name = @fk_table_name
  14181.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14182.     and    o2.id = r.fkeyid
  14183.     and    r.keycnt >= 14
  14184.     and    o2.id = c2.id
  14185.     and    c2.colid = r.fkey14
  14186.     and     r.rkeyid = o1.id
  14187.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14188.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14189.     and    o1.id = c1.id    
  14190.     and    c1.colid = r.rkey14
  14191.     union    all
  14192.     select
  14193.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14194.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14195.         PK_TABLE_NAME         = o1.name,
  14196.         PK_COLUMN_NAME         = c1.name,
  14197.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14198.         PK_COLUMN_PROPID    = convert(int,null),
  14199.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14200.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14201.         FK_TABLE_NAME         = o2.name,
  14202.         FK_COLUMN_NAME         = c2.name,
  14203.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14204.         FK_COLUMN_PROPID    = convert(int,null),
  14205.         ORDINAL            = convert(int,15),
  14206.         UPDATE_RULE        = N'NO ACTION',
  14207.         DELETE_RULE         = N'NO ACTION'        
  14208.     from
  14209.         sysobjects o1, sysobjects o2,
  14210.         syscolumns c1, syscolumns c2,
  14211.         sysreferences r
  14212.     where    
  14213.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14214.     and    o2.name = @fk_table_name
  14215.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14216.     and    o2.id = r.fkeyid
  14217.     and    r.keycnt >= 15
  14218.     and    o2.id = c2.id
  14219.     and    c2.colid = r.fkey15
  14220.     and     r.rkeyid = o1.id
  14221.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14222.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14223.     and    o1.id = c1.id    
  14224.     and    c1.colid = r.rkey15
  14225.     union    all
  14226.     select
  14227.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14228.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14229.         PK_TABLE_NAME         = o1.name,
  14230.         PK_COLUMN_NAME         = c1.name,
  14231.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14232.         PK_COLUMN_PROPID    = convert(int,null),
  14233.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14234.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14235.         FK_TABLE_NAME         = o2.name,
  14236.         FK_COLUMN_NAME         = c2.name,
  14237.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14238.         FK_COLUMN_PROPID    = convert(int,null),
  14239.         ORDINAL            = convert(int,16),
  14240.         UPDATE_RULE        = N'NO ACTION',
  14241.         DELETE_RULE         = N'NO ACTION'        
  14242.     from
  14243.         sysobjects o1, sysobjects o2,
  14244.         syscolumns c1, syscolumns c2,
  14245.         sysreferences r
  14246.     where    
  14247.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14248.     and    o2.name = @fk_table_name
  14249.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14250.     and    o2.id = r.fkeyid
  14251.     and    r.keycnt >= 16
  14252.     and    o2.id = c2.id
  14253.     and    c2.colid = r.fkey16
  14254.     and     r.rkeyid = o1.id
  14255.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  14256.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14257.     and    o1.id = c1.id    
  14258.     and    c1.colid = r.rkey16
  14259.     order by 8,9,2,3,13
  14260. go
  14261. CREATE PROCEDURE sp_foreign_keys_rowset;3
  14262.     (
  14263.     @pk_table_schema    sysname = null,
  14264.     @pk_table_catalog    sysname = null,
  14265.     @fk_table_schema    sysname = null,
  14266.     @fk_table_catalog    sysname = null
  14267.     )
  14268. as
  14269.     select
  14270.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14271.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14272.         PK_TABLE_NAME         = o1.name,
  14273.         PK_COLUMN_NAME         = c1.name,
  14274.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14275.         PK_COLUMN_PROPID    = convert(int,null),
  14276.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14277.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14278.         FK_TABLE_NAME         = o2.name,
  14279.         FK_COLUMN_NAME         = c2.name,
  14280.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14281.         FK_COLUMN_PROPID    = convert(int,null),
  14282.         ORDINAL            = convert(int,1),
  14283.         UPDATE_RULE        = N'NO ACTION',
  14284.         DELETE_RULE         = N'NO ACTION'        
  14285.     from
  14286.         sysobjects o1, sysobjects o2,
  14287.         syscolumns c1, syscolumns c2,
  14288.         sysreferences r
  14289.     where    
  14290.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14291.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14292.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14293.     and    o1.id = r.rkeyid
  14294.     and    o1.id = c1.id
  14295.     and    c1.colid = r.rkey1
  14296.     and     r.fkeyid = o2.id
  14297.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14298.     and    o2.id = c2.id    
  14299.     and    c2.colid = r.fkey1
  14300.     union all
  14301.     select
  14302.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14303.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14304.         PK_TABLE_NAME         = o1.name,
  14305.         PK_COLUMN_NAME         = c1.name,
  14306.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14307.         PK_COLUMN_PROPID    = convert(int,null),
  14308.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14309.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14310.         FK_TABLE_NAME         = o2.name,
  14311.         FK_COLUMN_NAME         = c2.name,
  14312.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14313.         FK_COLUMN_PROPID    = convert(int,null),
  14314.         ORDINAL            = convert(int,2),
  14315.         UPDATE_RULE        = N'NO ACTION',
  14316.         DELETE_RULE         = N'NO ACTION'        
  14317.     from
  14318.         sysobjects o1, sysobjects o2,
  14319.         syscolumns c1, syscolumns c2,
  14320.         sysreferences r
  14321.     where    
  14322.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14323.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14324.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14325.     and    o1.id = r.rkeyid
  14326.     and    r.keycnt >= 2
  14327.     and    o1.id = c1.id
  14328.     and    c1.colid = r.rkey2
  14329.     and     r.fkeyid = o2.id
  14330.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14331.     and    o2.id = c2.id    
  14332.     and    c2.colid = r.fkey2
  14333.     union all
  14334.     select
  14335.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14336.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14337.         PK_TABLE_NAME         = o1.name,
  14338.         PK_COLUMN_NAME         = c1.name,
  14339.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14340.         PK_COLUMN_PROPID    = convert(int,null),
  14341.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14342.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14343.         FK_TABLE_NAME         = o2.name,
  14344.         FK_COLUMN_NAME         = c2.name,
  14345.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14346.         FK_COLUMN_PROPID    = convert(int,null),
  14347.         ORDINAL            = convert(int,3),
  14348.         UPDATE_RULE        = N'NO ACTION',
  14349.         DELETE_RULE         = N'NO ACTION'        
  14350.     from
  14351.         sysobjects o1, sysobjects o2,
  14352.         syscolumns c1, syscolumns c2,
  14353.         sysreferences r
  14354.     where    
  14355.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14356.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14357.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14358.     and    o1.id = r.rkeyid
  14359.     and    r.keycnt >= 3
  14360.     and    o1.id = c1.id
  14361.     and    c1.colid = r.rkey3
  14362.     and     r.fkeyid = o2.id
  14363.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14364.     and    o2.id = c2.id    
  14365.     and    c2.colid = r.fkey3
  14366.     union all
  14367.     select
  14368.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14369.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14370.         PK_TABLE_NAME         = o1.name,
  14371.         PK_COLUMN_NAME         = c1.name,
  14372.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14373.         PK_COLUMN_PROPID    = convert(int,null),
  14374.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14375.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14376.         FK_TABLE_NAME         = o2.name,
  14377.         FK_COLUMN_NAME         = c2.name,
  14378.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14379.         FK_COLUMN_PROPID    = convert(int,null),
  14380.         ORDINAL            = convert(int,4),
  14381.         UPDATE_RULE        = N'NO ACTION',
  14382.         DELETE_RULE         = N'NO ACTION'        
  14383.     from
  14384.         sysobjects o1, sysobjects o2,
  14385.         syscolumns c1, syscolumns c2,
  14386.         sysreferences r
  14387.     where    
  14388.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14389.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14390.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14391.     and    o1.id = r.rkeyid
  14392.     and    r.keycnt >= 4
  14393.     and    o1.id = c1.id
  14394.     and    c1.colid = r.rkey4
  14395.     and     r.fkeyid = o2.id
  14396.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14397.     and    o2.id = c2.id    
  14398.     and    c2.colid = r.fkey4
  14399.     union all
  14400.     select
  14401.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14402.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14403.         PK_TABLE_NAME         = o1.name,
  14404.         PK_COLUMN_NAME         = c1.name,
  14405.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14406.         PK_COLUMN_PROPID    = convert(int,null),
  14407.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14408.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14409.         FK_TABLE_NAME         = o2.name,
  14410.         FK_COLUMN_NAME         = c2.name,
  14411.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14412.         FK_COLUMN_PROPID    = convert(int,null),
  14413.         ORDINAL            = convert(int,5),
  14414.         UPDATE_RULE        = N'NO ACTION',
  14415.         DELETE_RULE         = N'NO ACTION'        
  14416.     from
  14417.         sysobjects o1, sysobjects o2,
  14418.         syscolumns c1, syscolumns c2,
  14419.         sysreferences r
  14420.     where    
  14421.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14422.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14423.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14424.     and    o1.id = r.rkeyid
  14425.     and    r.keycnt >= 5
  14426.     and    o1.id = c1.id
  14427.     and    c1.colid = r.rkey5
  14428.     and     r.fkeyid = o2.id
  14429.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14430.     and    o2.id = c2.id    
  14431.     and    c2.colid = r.fkey5
  14432.     union all
  14433.     select
  14434.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14435.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14436.         PK_TABLE_NAME         = o1.name,
  14437.         PK_COLUMN_NAME         = c1.name,
  14438.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14439.         PK_COLUMN_PROPID    = convert(int,null),
  14440.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14441.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14442.         FK_TABLE_NAME         = o2.name,
  14443.         FK_COLUMN_NAME         = c2.name,
  14444.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14445.         FK_COLUMN_PROPID    = convert(int,null),
  14446.         ORDINAL            = convert(int,6),
  14447.         UPDATE_RULE        = N'NO ACTION',
  14448.         DELETE_RULE         = N'NO ACTION'        
  14449.     from
  14450.         sysobjects o1, sysobjects o2,
  14451.         syscolumns c1, syscolumns c2,
  14452.         sysreferences r
  14453.     where    
  14454.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14455.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14456.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14457.     and    o1.id = r.rkeyid
  14458.     and    r.keycnt >= 6
  14459.     and    o1.id = c1.id
  14460.     and    c1.colid = r.rkey6
  14461.     and     r.fkeyid = o2.id
  14462.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14463.     and    o2.id = c2.id    
  14464.     and    c2.colid = r.fkey6
  14465.     union all
  14466.     select
  14467.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14468.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14469.         PK_TABLE_NAME         = o1.name,
  14470.         PK_COLUMN_NAME         = c1.name,
  14471.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14472.         PK_COLUMN_PROPID    = convert(int,null),
  14473.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14474.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14475.         FK_TABLE_NAME         = o2.name,
  14476.         FK_COLUMN_NAME         = c2.name,
  14477.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14478.         FK_COLUMN_PROPID    = convert(int,null),
  14479.         ORDINAL            = convert(int,7),
  14480.         UPDATE_RULE        = N'NO ACTION',
  14481.         DELETE_RULE         = N'NO ACTION'        
  14482.     from
  14483.         sysobjects o1, sysobjects o2,
  14484.         syscolumns c1, syscolumns c2,
  14485.         sysreferences r
  14486.     where    
  14487.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14488.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14489.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14490.     and    o1.id = r.rkeyid
  14491.     and    r.keycnt >= 7
  14492.     and    o1.id = c1.id
  14493.     and    c1.colid = r.rkey7
  14494.     and     r.fkeyid = o2.id
  14495.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14496.     and    o2.id = c2.id    
  14497.     and    c2.colid = r.fkey7
  14498.     union all
  14499.     select
  14500.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14501.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14502.         PK_TABLE_NAME         = o1.name,
  14503.         PK_COLUMN_NAME         = c1.name,
  14504.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14505.         PK_COLUMN_PROPID    = convert(int,null),
  14506.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14507.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14508.         FK_TABLE_NAME         = o2.name,
  14509.         FK_COLUMN_NAME         = c2.name,
  14510.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14511.         FK_COLUMN_PROPID    = convert(int,null),
  14512.         ORDINAL            = convert(int,8),
  14513.         UPDATE_RULE        = N'NO ACTION',
  14514.         DELETE_RULE         = N'NO ACTION'        
  14515.     from
  14516.         sysobjects o1, sysobjects o2,
  14517.         syscolumns c1, syscolumns c2,
  14518.         sysreferences r
  14519.     where    
  14520.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14521.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14522.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14523.     and    o1.id = r.rkeyid
  14524.     and    r.keycnt >= 8
  14525.     and    o1.id = c1.id
  14526.     and    c1.colid = r.rkey8
  14527.     and     r.fkeyid = o2.id
  14528.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14529.     and    o2.id = c2.id    
  14530.     and    c2.colid = r.fkey8
  14531.     union all
  14532.     select
  14533.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14534.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14535.         PK_TABLE_NAME         = o1.name,
  14536.         PK_COLUMN_NAME         = c1.name,
  14537.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14538.         PK_COLUMN_PROPID    = convert(int,null),
  14539.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14540.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14541.         FK_TABLE_NAME         = o2.name,
  14542.         FK_COLUMN_NAME         = c2.name,
  14543.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14544.         FK_COLUMN_PROPID    = convert(int,null),
  14545.         ORDINAL            = convert(int,9),
  14546.         UPDATE_RULE        = N'NO ACTION',
  14547.         DELETE_RULE         = N'NO ACTION'        
  14548.     from
  14549.         sysobjects o1, sysobjects o2,
  14550.         syscolumns c1, syscolumns c2,
  14551.         sysreferences r
  14552.     where    
  14553.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14554.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14555.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14556.     and    o1.id = r.rkeyid
  14557.     and    r.keycnt >= 9
  14558.     and    o1.id = c1.id
  14559.     and    c1.colid = r.rkey9
  14560.     and     r.fkeyid = o2.id
  14561.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14562.     and    o2.id = c2.id    
  14563.     and    c2.colid = r.fkey9
  14564.     union all
  14565.     select
  14566.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14567.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14568.         PK_TABLE_NAME         = o1.name,
  14569.         PK_COLUMN_NAME         = c1.name,
  14570.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14571.         PK_COLUMN_PROPID    = convert(int,null),
  14572.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14573.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14574.         FK_TABLE_NAME         = o2.name,
  14575.         FK_COLUMN_NAME         = c2.name,
  14576.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14577.         FK_COLUMN_PROPID    = convert(int,null),
  14578.         ORDINAL            = convert(int,10),
  14579.         UPDATE_RULE        = N'NO ACTION',
  14580.         DELETE_RULE         = N'NO ACTION'        
  14581.     from
  14582.         sysobjects o1, sysobjects o2,
  14583.         syscolumns c1, syscolumns c2,
  14584.         sysreferences r
  14585.     where    
  14586.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14587.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14588.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14589.     and    o1.id = r.rkeyid
  14590.     and    r.keycnt >= 10
  14591.     and    o1.id = c1.id
  14592.     and    c1.colid = r.rkey10
  14593.     and     r.fkeyid = o2.id
  14594.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14595.     and    o2.id = c2.id    
  14596.     and    c2.colid = r.fkey10
  14597.     union all
  14598.     select
  14599.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14600.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14601.         PK_TABLE_NAME         = o1.name,
  14602.         PK_COLUMN_NAME         = c1.name,
  14603.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14604.         PK_COLUMN_PROPID    = convert(int,null),
  14605.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14606.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14607.         FK_TABLE_NAME         = o2.name,
  14608.         FK_COLUMN_NAME         = c2.name,
  14609.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14610.         FK_COLUMN_PROPID    = convert(int,null),
  14611.         ORDINAL            = convert(int,11),
  14612.         UPDATE_RULE        = N'NO ACTION',
  14613.         DELETE_RULE         = N'NO ACTION'        
  14614.     from
  14615.         sysobjects o1, sysobjects o2,
  14616.         syscolumns c1, syscolumns c2,
  14617.         sysreferences r
  14618.     where    
  14619.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14620.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14621.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14622.     and    o1.id = r.rkeyid
  14623.     and    r.keycnt >= 11
  14624.     and    o1.id = c1.id
  14625.     and    c1.colid = r.rkey11
  14626.     and     r.fkeyid = o2.id
  14627.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14628.     and    o2.id = c2.id    
  14629.     and    c2.colid = r.fkey11
  14630.     union all
  14631.     select
  14632.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14633.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14634.         PK_TABLE_NAME         = o1.name,
  14635.         PK_COLUMN_NAME         = c1.name,
  14636.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14637.         PK_COLUMN_PROPID    = convert(int,null),
  14638.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14639.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14640.         FK_TABLE_NAME         = o2.name,
  14641.         FK_COLUMN_NAME         = c2.name,
  14642.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14643.         FK_COLUMN_PROPID    = convert(int,null),
  14644.         ORDINAL            = convert(int,12),
  14645.         UPDATE_RULE        = N'NO ACTION',
  14646.         DELETE_RULE         = N'NO ACTION'        
  14647.     from
  14648.         sysobjects o1, sysobjects o2,
  14649.         syscolumns c1, syscolumns c2,
  14650.         sysreferences r
  14651.     where    
  14652.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14653.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14654.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14655.     and    o1.id = r.rkeyid
  14656.     and    r.keycnt >= 12
  14657.     and    o1.id = c1.id
  14658.     and    c1.colid = r.rkey12
  14659.     and     r.fkeyid = o2.id
  14660.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14661.     and    o2.id = c2.id    
  14662.     and    c2.colid = r.fkey12
  14663.     union all
  14664.     select
  14665.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14666.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14667.         PK_TABLE_NAME         = o1.name,
  14668.         PK_COLUMN_NAME         = c1.name,
  14669.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14670.         PK_COLUMN_PROPID    = convert(int,null),
  14671.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14672.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14673.         FK_TABLE_NAME         = o2.name,
  14674.         FK_COLUMN_NAME         = c2.name,
  14675.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14676.         FK_COLUMN_PROPID    = convert(int,null),
  14677.         ORDINAL            = convert(int,13),
  14678.         UPDATE_RULE        = N'NO ACTION',
  14679.         DELETE_RULE         = N'NO ACTION'        
  14680.     from
  14681.         sysobjects o1, sysobjects o2,
  14682.         syscolumns c1, syscolumns c2,
  14683.         sysreferences r
  14684.     where    
  14685.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14686.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14687.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14688.     and    o1.id = r.rkeyid
  14689.     and    r.keycnt >= 13
  14690.     and    o1.id = c1.id
  14691.     and    c1.colid = r.rkey13
  14692.     and     r.fkeyid = o2.id
  14693.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14694.     and    o2.id = c2.id    
  14695.     and    c2.colid = r.fkey13
  14696.     union all
  14697.     select
  14698.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14699.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14700.         PK_TABLE_NAME         = o1.name,
  14701.         PK_COLUMN_NAME         = c1.name,
  14702.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14703.         PK_COLUMN_PROPID    = convert(int,null),
  14704.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14705.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14706.         FK_TABLE_NAME         = o2.name,
  14707.         FK_COLUMN_NAME         = c2.name,
  14708.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14709.         FK_COLUMN_PROPID    = convert(int,null),
  14710.         ORDINAL            = convert(int,14),
  14711.         UPDATE_RULE        = N'NO ACTION',
  14712.         DELETE_RULE         = N'NO ACTION'        
  14713.     from
  14714.         sysobjects o1, sysobjects o2,
  14715.         syscolumns c1, syscolumns c2,
  14716.         sysreferences r
  14717.     where    
  14718.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14719.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14720.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14721.     and    o1.id = r.rkeyid
  14722.     and    r.keycnt >= 14
  14723.     and    o1.id = c1.id
  14724.     and    c1.colid = r.rkey14
  14725.     and     r.fkeyid = o2.id
  14726.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14727.     and    o2.id = c2.id    
  14728.     and    c2.colid = r.fkey14
  14729.     union all
  14730.     select
  14731.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14732.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14733.         PK_TABLE_NAME         = o1.name,
  14734.         PK_COLUMN_NAME         = c1.name,
  14735.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14736.         PK_COLUMN_PROPID    = convert(int,null),
  14737.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14738.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14739.         FK_TABLE_NAME         = o2.name,
  14740.         FK_COLUMN_NAME         = c2.name,
  14741.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14742.         FK_COLUMN_PROPID    = convert(int,null),
  14743.         ORDINAL            = convert(int,15),
  14744.         UPDATE_RULE        = N'NO ACTION',
  14745.         DELETE_RULE         = N'NO ACTION'        
  14746.     from
  14747.         sysobjects o1, sysobjects o2,
  14748.         syscolumns c1, syscolumns c2,
  14749.         sysreferences r
  14750.     where    
  14751.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14752.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14753.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14754.     and    o1.id = r.rkeyid
  14755.     and    r.keycnt >= 15
  14756.     and    o1.id = c1.id
  14757.     and    c1.colid = r.rkey15
  14758.     and     r.fkeyid = o2.id
  14759.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14760.     and    o2.id = c2.id    
  14761.     and    c2.colid = r.fkey15
  14762.     union all
  14763.     select
  14764.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14765.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14766.         PK_TABLE_NAME         = o1.name,
  14767.         PK_COLUMN_NAME         = c1.name,
  14768.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14769.         PK_COLUMN_PROPID    = convert(int,null),
  14770.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14771.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14772.         FK_TABLE_NAME         = o2.name,
  14773.         FK_COLUMN_NAME         = c2.name,
  14774.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14775.         FK_COLUMN_PROPID    = convert(int,null),
  14776.         ORDINAL            = convert(int,16),
  14777.         UPDATE_RULE        = N'NO ACTION',
  14778.         DELETE_RULE         = N'NO ACTION'        
  14779.     from
  14780.         sysobjects o1, sysobjects o2,
  14781.         syscolumns c1, syscolumns c2,
  14782.         sysreferences r
  14783.     where    
  14784.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14785.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14786.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14787.     and    o1.id = r.rkeyid
  14788.     and    o1.id = c1.id
  14789.     and    r.keycnt >= 16
  14790.     and    c1.colid = r.rkey16
  14791.     and     r.fkeyid = o2.id
  14792.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14793.     and    o2.id = c2.id    
  14794.     and    c2.colid = r.fkey16
  14795.     order by 8,9,2,3,13
  14796. go
  14797. CREATE PROCEDURE sp_foreign_keys_rowset;4
  14798.     (
  14799.     @pk_table_name        sysname = null,
  14800.     @pk_table_schema    sysname = null,
  14801.     @fk_table_name        sysname = null,
  14802.     @fk_table_schema    sysname = null
  14803.     )
  14804. as
  14805. IF @pk_table_name is not null
  14806.     BEGIN
  14807.     select
  14808.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14809.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14810.         PK_TABLE_NAME         = o1.name,
  14811.         PK_COLUMN_NAME         = c1.name,
  14812.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14813.         PK_COLUMN_PROPID    = convert(int,null),
  14814.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14815.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14816.         FK_TABLE_NAME         = o2.name,
  14817.         FK_COLUMN_NAME         = c2.name,
  14818.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14819.         FK_COLUMN_PROPID    = convert(int,null),
  14820.         ORDINAL            = convert(int,1),
  14821.         UPDATE_RULE        = N'NO ACTION',
  14822.         DELETE_RULE         = N'NO ACTION'        
  14823.     from
  14824.         sysobjects o1, sysobjects o2,
  14825.         syscolumns c1, syscolumns c2,
  14826.         sysreferences r
  14827.     where    
  14828.         o1.name = @pk_table_name
  14829.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14830.     and    o1.id = r.rkeyid
  14831.     and    o1.id = c1.id
  14832.     and    c1.colid = r.rkey1
  14833.     and     r.fkeyid = o2.id
  14834.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  14835.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14836.     and    o2.id = c2.id    
  14837.     and    c2.colid = r.fkey1
  14838.     union all
  14839.     select
  14840.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14841.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14842.         PK_TABLE_NAME         = o1.name,
  14843.         PK_COLUMN_NAME         = c1.name,
  14844.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14845.         PK_COLUMN_PROPID    = convert(int,null),
  14846.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14847.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14848.         FK_TABLE_NAME         = o2.name,
  14849.         FK_COLUMN_NAME         = c2.name,
  14850.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14851.         FK_COLUMN_PROPID    = convert(int,null),
  14852.         ORDINAL            = convert(int,2),
  14853.         UPDATE_RULE        = N'NO ACTION',
  14854.         DELETE_RULE         = N'NO ACTION'        
  14855.     from
  14856.         sysobjects o1, sysobjects o2,
  14857.         syscolumns c1, syscolumns c2,
  14858.         sysreferences r
  14859.     where    
  14860.         o1.name = @pk_table_name
  14861.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14862.     and    o1.id = r.rkeyid
  14863.     and    o1.id = c1.id
  14864.     and    c1.colid = r.rkey2
  14865.     and    r.keycnt >= 2
  14866.     and     r.fkeyid = o2.id
  14867.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  14868.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14869.     and    o2.id = c2.id    
  14870.     and    c2.colid = r.fkey2
  14871.     union all
  14872.     select
  14873.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14874.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14875.         PK_TABLE_NAME         = o1.name,
  14876.         PK_COLUMN_NAME         = c1.name,
  14877.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14878.         PK_COLUMN_PROPID    = convert(int,null),
  14879.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14880.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14881.         FK_TABLE_NAME         = o2.name,
  14882.         FK_COLUMN_NAME         = c2.name,
  14883.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14884.         FK_COLUMN_PROPID    = convert(int,null),
  14885.         ORDINAL            = convert(int,3),
  14886.         UPDATE_RULE        = N'NO ACTION',
  14887.         DELETE_RULE         = N'NO ACTION'        
  14888.     from
  14889.         sysobjects o1, sysobjects o2,
  14890.         syscolumns c1, syscolumns c2,
  14891.         sysreferences r
  14892.     where    
  14893.         o1.name = @pk_table_name
  14894.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14895.     and    o1.id = r.rkeyid
  14896.     and    o1.id = c1.id
  14897.     and    c1.colid = r.rkey3
  14898.     and    r.keycnt >= 3
  14899.     and     r.fkeyid = o2.id
  14900.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  14901.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14902.     and    o2.id = c2.id    
  14903.     and    c2.colid = r.fkey3
  14904.     union all
  14905.     select
  14906.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14907.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14908.         PK_TABLE_NAME         = o1.name,
  14909.         PK_COLUMN_NAME         = c1.name,
  14910.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14911.         PK_COLUMN_PROPID    = convert(int,null),
  14912.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14913.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14914.         FK_TABLE_NAME         = o2.name,
  14915.         FK_COLUMN_NAME         = c2.name,
  14916.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14917.         FK_COLUMN_PROPID    = convert(int,null),
  14918.         ORDINAL            = convert(int,4),
  14919.         UPDATE_RULE        = N'NO ACTION',
  14920.         DELETE_RULE         = N'NO ACTION'        
  14921.     from
  14922.         sysobjects o1, sysobjects o2,
  14923.         syscolumns c1, syscolumns c2,
  14924.         sysreferences r
  14925.     where    
  14926.         o1.name = @pk_table_name
  14927.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14928.     and    o1.id = r.rkeyid
  14929.     and    r.keycnt >= 4
  14930.     and    o1.id = c1.id
  14931.     and    c1.colid = r.rkey4
  14932.     and     r.fkeyid = o2.id
  14933.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  14934.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14935.     and    o2.id = c2.id    
  14936.     and    c2.colid = r.fkey4
  14937.     union all
  14938.     select
  14939.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14940.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14941.         PK_TABLE_NAME         = o1.name,
  14942.         PK_COLUMN_NAME         = c1.name,
  14943.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14944.         PK_COLUMN_PROPID    = convert(int,null),
  14945.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14946.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14947.         FK_TABLE_NAME         = o2.name,
  14948.         FK_COLUMN_NAME         = c2.name,
  14949.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14950.         FK_COLUMN_PROPID    = convert(int,null),
  14951.         ORDINAL            = convert(int,5),
  14952.         UPDATE_RULE        = N'NO ACTION',
  14953.         DELETE_RULE         = N'NO ACTION'        
  14954.     from
  14955.         sysobjects o1, sysobjects o2,
  14956.         syscolumns c1, syscolumns c2,
  14957.         sysreferences r
  14958.     where    
  14959.         o1.name = @pk_table_name
  14960.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14961.     and    o1.id = r.rkeyid
  14962.     and    r.keycnt >= 5
  14963.     and    o1.id = c1.id
  14964.     and    c1.colid = r.rkey5
  14965.     and     r.fkeyid = o2.id
  14966.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  14967.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14968.     and    o2.id = c2.id    
  14969.     and    c2.colid = r.fkey5
  14970.     union all
  14971.     select
  14972.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14973.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14974.         PK_TABLE_NAME         = o1.name,
  14975.         PK_COLUMN_NAME         = c1.name,
  14976.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14977.         PK_COLUMN_PROPID    = convert(int,null),
  14978.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14979.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14980.         FK_TABLE_NAME         = o2.name,
  14981.         FK_COLUMN_NAME         = c2.name,
  14982.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  14983.         FK_COLUMN_PROPID    = convert(int,null),
  14984.         ORDINAL            = convert(int,6),
  14985.         UPDATE_RULE        = N'NO ACTION',
  14986.         DELETE_RULE         = N'NO ACTION'        
  14987.     from
  14988.         sysobjects o1, sysobjects o2,
  14989.         syscolumns c1, syscolumns c2,
  14990.         sysreferences r
  14991.     where    
  14992.         o1.name = @pk_table_name
  14993.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14994.     and    o1.id = r.rkeyid
  14995.     and    r.keycnt >= 6
  14996.     and    o1.id = c1.id
  14997.     and    c1.colid = r.rkey6
  14998.     and     r.fkeyid = o2.id
  14999.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15000.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15001.     and    o2.id = c2.id    
  15002.     and    c2.colid = r.fkey6
  15003.     union all
  15004.     select
  15005.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15006.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15007.         PK_TABLE_NAME         = o1.name,
  15008.         PK_COLUMN_NAME         = c1.name,
  15009.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15010.         PK_COLUMN_PROPID    = convert(int,null),
  15011.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15012.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15013.         FK_TABLE_NAME         = o2.name,
  15014.         FK_COLUMN_NAME         = c2.name,
  15015.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15016.         FK_COLUMN_PROPID    = convert(int,null),
  15017.         ORDINAL            = convert(int,7),
  15018.         UPDATE_RULE        = N'NO ACTION',
  15019.         DELETE_RULE         = N'NO ACTION'        
  15020.     from
  15021.         sysobjects o1, sysobjects o2,
  15022.         syscolumns c1, syscolumns c2,
  15023.         sysreferences r
  15024.     where    
  15025.         o1.name = @pk_table_name
  15026.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15027.     and    o1.id = r.rkeyid
  15028.     and    r.keycnt >= 7
  15029.     and    o1.id = c1.id
  15030.     and    c1.colid = r.rkey7
  15031.     and     r.fkeyid = o2.id
  15032.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15033.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15034.     and    o2.id = c2.id    
  15035.     and    c2.colid = r.fkey7
  15036.     union all
  15037.     select
  15038.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15039.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15040.         PK_TABLE_NAME         = o1.name,
  15041.         PK_COLUMN_NAME         = c1.name,
  15042.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15043.         PK_COLUMN_PROPID    = convert(int,null),
  15044.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15045.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15046.         FK_TABLE_NAME         = o2.name,
  15047.         FK_COLUMN_NAME         = c2.name,
  15048.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15049.         FK_COLUMN_PROPID    = convert(int,null),
  15050.         ORDINAL            = convert(int,8),
  15051.         UPDATE_RULE        = N'NO ACTION',
  15052.         DELETE_RULE         = N'NO ACTION'        
  15053.     from
  15054.         sysobjects o1, sysobjects o2,
  15055.         syscolumns c1, syscolumns c2,
  15056.         sysreferences r
  15057.     where    
  15058.         o1.name = @pk_table_name
  15059.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15060.     and    o1.id = r.rkeyid
  15061.     and    r.keycnt >= 8
  15062.     and    o1.id = c1.id
  15063.     and    c1.colid = r.rkey8
  15064.     and     r.fkeyid = o2.id
  15065.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15066.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15067.     and    o2.id = c2.id    
  15068.     and    c2.colid = r.fkey8
  15069.     union all
  15070.     select
  15071.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15072.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15073.         PK_TABLE_NAME         = o1.name,
  15074.         PK_COLUMN_NAME         = c1.name,
  15075.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15076.         PK_COLUMN_PROPID    = convert(int,null),
  15077.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15078.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  15079.         FK_TABLE_NAME         = o2.name,
  15080.         FK_COLUMN_NAME         = c2.name,
  15081.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15082.         FK_COLUMN_PROPID    = convert(int,null),
  15083.         ORDINAL            = convert(int,9),
  15084.         UPDATE_RULE        = N'NO ACTION',
  15085.         DELETE_RULE         = N'NO ACTION'        
  15086.     from
  15087.         sysobjects o1, sysobjects o2,
  15088.         syscolumns c1, syscolumns c2,
  15089.         sysreferences r
  15090.     where    
  15091.         o1.name = @pk_table_name
  15092.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15093.     and    o1.id = r.rkeyid
  15094.     and    r.keycnt >= 9
  15095.     and    o1.id = c1.id
  15096.     and    c1.colid = r.rkey9
  15097.     and     r.fkeyid = o2.id
  15098.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15099.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15100.     and    o2.id = c2.id    
  15101.     and    c2.colid = r.fkey9
  15102.     union all
  15103.     select
  15104.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15105.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15106.         PK_TABLE_NAME         = o1.name,
  15107.         PK_COLUMN_NAME         = c1.name,
  15108.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15109.         PK_COLUMN_PROPID    = convert(int,null),
  15110.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15111.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15112.         FK_TABLE_NAME         = o2.name,
  15113.         FK_COLUMN_NAME         = c2.name,
  15114.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15115.         FK_COLUMN_PROPID    = convert(int,null),
  15116.         ORDINAL            = convert(int,10),
  15117.         UPDATE_RULE        = N'NO ACTION',
  15118.         DELETE_RULE         = N'NO ACTION'        
  15119.     from
  15120.         sysobjects o1, sysobjects o2,
  15121.         syscolumns c1, syscolumns c2,
  15122.         sysreferences r
  15123.     where    
  15124.         o1.name = @pk_table_name
  15125.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15126.     and    o1.id = r.rkeyid
  15127.     and    r.keycnt >= 10
  15128.     and    o1.id = c1.id
  15129.     and    c1.colid = r.rkey10
  15130.     and     r.fkeyid = o2.id
  15131.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15132.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15133.     and    o2.id = c2.id    
  15134.     and    c2.colid = r.fkey10
  15135.     union all
  15136.     select
  15137.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15138.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15139.         PK_TABLE_NAME         = o1.name,
  15140.         PK_COLUMN_NAME         = c1.name,
  15141.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15142.         PK_COLUMN_PROPID    = convert(int,null),
  15143.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15144.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15145.         FK_TABLE_NAME         = o2.name,
  15146.         FK_COLUMN_NAME         = c2.name,
  15147.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15148.         FK_COLUMN_PROPID    = convert(int,null),
  15149.         ORDINAL            = convert(int,11),
  15150.         UPDATE_RULE        = N'NO ACTION',
  15151.         DELETE_RULE         = N'NO ACTION'        
  15152.     from
  15153.         sysobjects o1, sysobjects o2,
  15154.         syscolumns c1, syscolumns c2,
  15155.         sysreferences r
  15156.     where    
  15157.         o1.name = @pk_table_name
  15158.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15159.     and    o1.id = r.rkeyid
  15160.     and    r.keycnt >= 11
  15161.     and    o1.id = c1.id
  15162.     and    c1.colid = r.rkey11
  15163.     and     r.fkeyid = o2.id
  15164.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15165.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15166.     and    o2.id = c2.id    
  15167.     and    c2.colid = r.fkey11
  15168.     union all
  15169.     select
  15170.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15171.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15172.         PK_TABLE_NAME         = o1.name,
  15173.         PK_COLUMN_NAME         = c1.name,
  15174.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15175.         PK_COLUMN_PROPID    = convert(int,null),
  15176.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15177.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15178.         FK_TABLE_NAME         = o2.name,
  15179.         FK_COLUMN_NAME         = c2.name,
  15180.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15181.         FK_COLUMN_PROPID    = convert(int,null),
  15182.         ORDINAL            = convert(int,12),
  15183.         UPDATE_RULE        = N'NO ACTION',
  15184.         DELETE_RULE         = N'NO ACTION'        
  15185.     from
  15186.         sysobjects o1, sysobjects o2,
  15187.         syscolumns c1, syscolumns c2,
  15188.         sysreferences r
  15189.     where    
  15190.         o1.name = @pk_table_name
  15191.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15192.     and    o1.id = r.rkeyid
  15193.     and    r.keycnt >= 12
  15194.     and    o1.id = c1.id
  15195.     and    c1.colid = r.rkey12
  15196.     and     r.fkeyid = o2.id
  15197.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15198.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15199.     and    o2.id = c2.id    
  15200.     and    c2.colid = r.fkey12
  15201.     union all
  15202.     select
  15203.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15204.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15205.         PK_TABLE_NAME         = o1.name,
  15206.         PK_COLUMN_NAME         = c1.name,
  15207.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15208.         PK_COLUMN_PROPID    = convert(int,null),
  15209.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15210.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15211.         FK_TABLE_NAME         = o2.name,
  15212.         FK_COLUMN_NAME         = c2.name,
  15213.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15214.         FK_COLUMN_PROPID    = convert(int,null),
  15215.         ORDINAL            = convert(int,13),
  15216.         UPDATE_RULE        = N'NO ACTION',
  15217.         DELETE_RULE         = N'NO ACTION'        
  15218.     from
  15219.         sysobjects o1, sysobjects o2,
  15220.         syscolumns c1, syscolumns c2,
  15221.         sysreferences r
  15222.     where    
  15223.         o1.name = @pk_table_name
  15224.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15225.     and    o1.id = r.rkeyid
  15226.     and    r.keycnt >= 13
  15227.     and    o1.id = c1.id
  15228.     and    c1.colid = r.rkey13
  15229.     and     r.fkeyid = o2.id
  15230.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15231.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15232.     and    o2.id = c2.id    
  15233.     and    c2.colid = r.fkey13
  15234.     union all
  15235.     select
  15236.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15237.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15238.         PK_TABLE_NAME         = o1.name,
  15239.         PK_COLUMN_NAME         = c1.name,
  15240.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15241.         PK_COLUMN_PROPID    = convert(int,null),
  15242.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15243.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15244.         FK_TABLE_NAME         = o2.name,
  15245.         FK_COLUMN_NAME         = c2.name,
  15246.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15247.         FK_COLUMN_PROPID    = convert(int,null),
  15248.         ORDINAL            = convert(int,14),
  15249.         UPDATE_RULE        = N'NO ACTION',
  15250.         DELETE_RULE         = N'NO ACTION'        
  15251.     from
  15252.         sysobjects o1, sysobjects o2,
  15253.         syscolumns c1, syscolumns c2,
  15254.         sysreferences r
  15255.     where    
  15256.         o1.name = @pk_table_name
  15257.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15258.     and    o1.id = r.rkeyid
  15259.     and    r.keycnt >= 14
  15260.     and    o1.id = c1.id
  15261.     and    c1.colid = r.rkey14
  15262.     and     r.fkeyid = o2.id
  15263.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15264.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15265.     and    o2.id = c2.id    
  15266.     and    c2.colid = r.fkey14
  15267.     union all
  15268.     select
  15269.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15270.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15271.         PK_TABLE_NAME         = o1.name,
  15272.         PK_COLUMN_NAME         = c1.name,
  15273.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15274.         PK_COLUMN_PROPID    = convert(int,null),
  15275.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15276.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15277.         FK_TABLE_NAME         = o2.name,
  15278.         FK_COLUMN_NAME         = c2.name,
  15279.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15280.         FK_COLUMN_PROPID    = convert(int,null),
  15281.         ORDINAL            = convert(int,15),
  15282.         UPDATE_RULE        = N'NO ACTION',
  15283.         DELETE_RULE         = N'NO ACTION'        
  15284.     from
  15285.         sysobjects o1, sysobjects o2,
  15286.         syscolumns c1, syscolumns c2,
  15287.         sysreferences r
  15288.     where    
  15289.         o1.name = @pk_table_name
  15290.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15291.     and    o1.id = r.rkeyid
  15292.     and    r.keycnt >= 15
  15293.     and    o1.id = c1.id
  15294.     and    c1.colid = r.rkey15
  15295.     and     r.fkeyid = o2.id
  15296.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15297.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15298.     and    o2.id = c2.id    
  15299.     and    c2.colid = r.fkey15
  15300.     union all
  15301.     select
  15302.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15303.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15304.         PK_TABLE_NAME         = o1.name,
  15305.         PK_COLUMN_NAME         = c1.name,
  15306.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15307.         PK_COLUMN_PROPID    = convert(int,null),
  15308.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15309.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15310.         FK_TABLE_NAME         = o2.name,
  15311.         FK_COLUMN_NAME         = c2.name,
  15312.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15313.         FK_COLUMN_PROPID    = convert(int,null),
  15314.         ORDINAL            = convert(int,16),
  15315.         UPDATE_RULE        = N'NO ACTION',
  15316.         DELETE_RULE         = N'NO ACTION'        
  15317.     from
  15318.         sysobjects o1, sysobjects o2,
  15319.         syscolumns c1, syscolumns c2,
  15320.         sysreferences r
  15321.     where    
  15322.         o1.name = @pk_table_name
  15323.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15324.     and    o1.id = r.rkeyid
  15325.     and    r.keycnt >= 16
  15326.     and    o1.id = c1.id
  15327.     and    c1.colid = r.rkey16
  15328.     and     r.fkeyid = o2.id
  15329.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  15330.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15331.     and    o2.id = c2.id    
  15332.     and    c2.colid = r.fkey16
  15333.     END
  15334. ELSE IF @fk_table_name is not null
  15335.     BEGIN
  15336.     select
  15337.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15338.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15339.         PK_TABLE_NAME         = o1.name,
  15340.         PK_COLUMN_NAME         = c1.name,
  15341.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15342.         PK_COLUMN_PROPID    = convert(int,null),
  15343.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15344.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15345.         FK_TABLE_NAME         = o2.name,
  15346.         FK_COLUMN_NAME         = c2.name,
  15347.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15348.         FK_COLUMN_PROPID    = convert(int,null),
  15349.         ORDINAL            = convert(int,1),
  15350.         UPDATE_RULE        = N'NO ACTION',
  15351.         DELETE_RULE         = N'NO ACTION'        
  15352.     from
  15353.         sysobjects o1, sysobjects o2,
  15354.         syscolumns c1, syscolumns c2,
  15355.         sysreferences r
  15356.     where    
  15357.         o2.name = @fk_table_name
  15358.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15359.     and    o2.id = r.fkeyid
  15360.     and    o2.id = c2.id
  15361.     and    c2.colid = r.fkey1
  15362.     and     r.rkeyid = o1.id
  15363.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15364.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15365.     and    o1.id = c1.id    
  15366.     and    c1.colid = r.rkey1
  15367.     union    all
  15368.     select
  15369.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15370.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15371.         PK_TABLE_NAME         = o1.name,
  15372.         PK_COLUMN_NAME         = c1.name,
  15373.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15374.         PK_COLUMN_PROPID    = convert(int,null),
  15375.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15376.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15377.         FK_TABLE_NAME         = o2.name,
  15378.         FK_COLUMN_NAME         = c2.name,
  15379.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15380.         FK_COLUMN_PROPID    = convert(int,null),
  15381.         ORDINAL            = convert(int,2),
  15382.         UPDATE_RULE        = N'NO ACTION',
  15383.         DELETE_RULE         = N'NO ACTION'        
  15384.     from
  15385.         sysobjects o1, sysobjects o2,
  15386.         syscolumns c1, syscolumns c2,
  15387.         sysreferences r
  15388.     where    
  15389.         o2.name = @fk_table_name
  15390.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15391.     and    o2.id = r.fkeyid
  15392.     and    r.keycnt >= 2
  15393.     and    o2.id = c2.id
  15394.     and    c2.colid = r.fkey2
  15395.     and     r.rkeyid = o1.id
  15396.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15397.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15398.     and    o1.id = c1.id    
  15399.     and    c1.colid = r.rkey2
  15400.     union    all
  15401.     select
  15402.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15403.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15404.         PK_TABLE_NAME         = o1.name,
  15405.         PK_COLUMN_NAME         = c1.name,
  15406.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15407.         PK_COLUMN_PROPID    = convert(int,null),
  15408.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15409.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15410.         FK_TABLE_NAME         = o2.name,
  15411.         FK_COLUMN_NAME         = c2.name,
  15412.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15413.         FK_COLUMN_PROPID    = convert(int,null),
  15414.         ORDINAL            = convert(int,3),
  15415.         UPDATE_RULE        = N'NO ACTION',
  15416.         DELETE_RULE         = N'NO ACTION'        
  15417.     from
  15418.         sysobjects o1, sysobjects o2,
  15419.         syscolumns c1, syscolumns c2,
  15420.         sysreferences r
  15421.     where    
  15422.         o2.name = @fk_table_name
  15423.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15424.     and    o2.id = r.fkeyid
  15425.     and    r.keycnt >= 3
  15426.     and    o2.id = c2.id
  15427.     and    c2.colid = r.fkey3
  15428.     and     r.rkeyid = o1.id
  15429.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15430.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15431.     and    o1.id = c1.id    
  15432.     and    c1.colid = r.rkey3
  15433.     union    all
  15434.     select
  15435.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15436.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15437.         PK_TABLE_NAME         = o1.name,
  15438.         PK_COLUMN_NAME         = c1.name,
  15439.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15440.         PK_COLUMN_PROPID    = convert(int,null),
  15441.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15442.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15443.         FK_TABLE_NAME         = o2.name,
  15444.         FK_COLUMN_NAME         = c2.name,
  15445.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15446.         FK_COLUMN_PROPID    = convert(int,null),
  15447.         ORDINAL            = convert(int,4),
  15448.         UPDATE_RULE        = N'NO ACTION',
  15449.         DELETE_RULE         = N'NO ACTION'        
  15450.     from
  15451.         sysobjects o1, sysobjects o2,
  15452.         syscolumns c1, syscolumns c2,
  15453.         sysreferences r
  15454.     where    
  15455.         o2.name = @fk_table_name
  15456.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15457.     and    o2.id = r.fkeyid
  15458.     and    r.keycnt >= 4
  15459.     and    o2.id = c2.id
  15460.     and    c2.colid = r.fkey4
  15461.     and     r.rkeyid = o1.id
  15462.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15463.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15464.     and    o1.id = c1.id    
  15465.     and    c1.colid = r.rkey4
  15466.     union    all
  15467.     select
  15468.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15469.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15470.         PK_TABLE_NAME         = o1.name,
  15471.         PK_COLUMN_NAME         = c1.name,
  15472.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15473.         PK_COLUMN_PROPID    = convert(int,null),
  15474.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15475.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15476.         FK_TABLE_NAME         = o2.name,
  15477.         FK_COLUMN_NAME         = c2.name,
  15478.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15479.         FK_COLUMN_PROPID    = convert(int,null),
  15480.         ORDINAL            = convert(int,5),
  15481.         UPDATE_RULE        = N'NO ACTION',
  15482.         DELETE_RULE         = N'NO ACTION'        
  15483.     from
  15484.         sysobjects o1, sysobjects o2,
  15485.         syscolumns c1, syscolumns c2,
  15486.         sysreferences r
  15487.     where    
  15488.         o2.name = @fk_table_name
  15489.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15490.     and    o2.id = r.fkeyid
  15491.     and    r.keycnt >= 5
  15492.     and    o2.id = c2.id
  15493.     and    c2.colid = r.fkey5
  15494.     and     r.rkeyid = o1.id
  15495.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15496.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15497.     and    o1.id = c1.id    
  15498.     and    c1.colid = r.rkey5
  15499.     union    all
  15500.     select
  15501.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15502.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15503.         PK_TABLE_NAME         = o1.name,
  15504.         PK_COLUMN_NAME         = c1.name,
  15505.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15506.         PK_COLUMN_PROPID    = convert(int,null),
  15507.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15508.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15509.         FK_TABLE_NAME         = o2.name,
  15510.         FK_COLUMN_NAME         = c2.name,
  15511.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15512.         FK_COLUMN_PROPID    = convert(int,null),
  15513.         ORDINAL            = convert(int,6),
  15514.         UPDATE_RULE        = N'NO ACTION',
  15515.         DELETE_RULE         = N'NO ACTION'        
  15516.     from
  15517.         sysobjects o1, sysobjects o2,
  15518.         syscolumns c1, syscolumns c2,
  15519.         sysreferences r
  15520.     where    
  15521.         o2.name = @fk_table_name
  15522.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15523.     and    o2.id = r.fkeyid
  15524.     and    r.keycnt >= 6
  15525.     and    o2.id = c2.id
  15526.     and    c2.colid = r.fkey6
  15527.     and     r.rkeyid = o1.id
  15528.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15529.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15530.     and    o1.id = c1.id    
  15531.     and    c1.colid = r.rkey6
  15532.     union    all
  15533.     select
  15534.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15535.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15536.         PK_TABLE_NAME         = o1.name,
  15537.         PK_COLUMN_NAME         = c1.name,
  15538.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15539.         PK_COLUMN_PROPID    = convert(int,null),
  15540.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15541.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15542.         FK_TABLE_NAME         = o2.name,
  15543.         FK_COLUMN_NAME         = c2.name,
  15544.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15545.         FK_COLUMN_PROPID    = convert(int,null),
  15546.         ORDINAL            = convert(int,7),
  15547.         UPDATE_RULE        = N'NO ACTION',
  15548.         DELETE_RULE         = N'NO ACTION'        
  15549.     from
  15550.         sysobjects o1, sysobjects o2,
  15551.         syscolumns c1, syscolumns c2,
  15552.         sysreferences r
  15553.     where    
  15554.         o2.name = @fk_table_name
  15555.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15556.     and    o2.id = r.fkeyid
  15557.     and    r.keycnt >= 7
  15558.     and    o2.id = c2.id
  15559.     and    c2.colid = r.fkey7
  15560.     and     r.rkeyid = o1.id
  15561.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15562.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15563.     and    o1.id = c1.id    
  15564.     and    c1.colid = r.rkey7
  15565.     union    all
  15566.     select
  15567.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15568.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15569.         PK_TABLE_NAME         = o1.name,
  15570.         PK_COLUMN_NAME         = c1.name,
  15571.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15572.         PK_COLUMN_PROPID    = convert(int,null),
  15573.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15574.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15575.         FK_TABLE_NAME         = o2.name,
  15576.         FK_COLUMN_NAME         = c2.name,
  15577.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15578.         FK_COLUMN_PROPID    = convert(int,null),
  15579.         ORDINAL            = convert(int,8),
  15580.         UPDATE_RULE        = N'NO ACTION',
  15581.         DELETE_RULE         = N'NO ACTION'        
  15582.     from
  15583.         sysobjects o1, sysobjects o2,
  15584.         syscolumns c1, syscolumns c2,
  15585.         sysreferences r
  15586.     where    
  15587.         o2.name = @fk_table_name
  15588.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15589.     and    o2.id = r.fkeyid
  15590.     and    r.keycnt >= 8
  15591.     and    o2.id = c2.id
  15592.     and    c2.colid = r.fkey8
  15593.     and     r.rkeyid = o1.id
  15594.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15595.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15596.     and    o1.id = c1.id    
  15597.     and    c1.colid = r.rkey8
  15598.     union    all
  15599.     select
  15600.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15601.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15602.         PK_TABLE_NAME         = o1.name,
  15603.         PK_COLUMN_NAME         = c1.name,
  15604.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15605.         PK_COLUMN_PROPID    = convert(int,null),
  15606.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15607.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15608.         FK_TABLE_NAME         = o2.name,
  15609.         FK_COLUMN_NAME         = c2.name,
  15610.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15611.         FK_COLUMN_PROPID    = convert(int,null),
  15612.         ORDINAL            = convert(int,9),
  15613.         UPDATE_RULE        = N'NO ACTION',
  15614.         DELETE_RULE         = N'NO ACTION'        
  15615.     from
  15616.         sysobjects o1, sysobjects o2,
  15617.         syscolumns c1, syscolumns c2,
  15618.         sysreferences r
  15619.     where    
  15620.         o2.name = @fk_table_name
  15621.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15622.     and    o2.id = r.fkeyid
  15623.     and    r.keycnt >= 9
  15624.     and    o2.id = c2.id
  15625.     and    c2.colid = r.fkey9
  15626.     and     r.rkeyid = o1.id
  15627.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15628.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15629.     and    o1.id = c1.id    
  15630.     and    c1.colid = r.rkey9
  15631.     union    all
  15632.     select
  15633.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15634.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15635.         PK_TABLE_NAME         = o1.name,
  15636.         PK_COLUMN_NAME         = c1.name,
  15637.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15638.         PK_COLUMN_PROPID    = convert(int,null),
  15639.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15640.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15641.         FK_TABLE_NAME         = o2.name,
  15642.         FK_COLUMN_NAME         = c2.name,
  15643.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15644.         FK_COLUMN_PROPID    = convert(int,null),
  15645.         ORDINAL            = convert(int,10),
  15646.         UPDATE_RULE        = N'NO ACTION',
  15647.         DELETE_RULE         = N'NO ACTION'        
  15648.     from
  15649.         sysobjects o1, sysobjects o2,
  15650.         syscolumns c1, syscolumns c2,
  15651.         sysreferences r
  15652.     where    
  15653.         o2.name = @fk_table_name
  15654.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15655.     and    o2.id = r.fkeyid
  15656.     and    r.keycnt >= 10
  15657.     and    o2.id = c2.id
  15658.     and    c2.colid = r.fkey10
  15659.     and     r.rkeyid = o1.id
  15660.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15661.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15662.     and    o1.id = c1.id    
  15663.     and    c1.colid = r.rkey10
  15664.     union    all
  15665.     select
  15666.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15667.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15668.         PK_TABLE_NAME         = o1.name,
  15669.         PK_COLUMN_NAME         = c1.name,
  15670.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15671.         PK_COLUMN_PROPID    = convert(int,null),
  15672.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15673.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15674.         FK_TABLE_NAME         = o2.name,
  15675.         FK_COLUMN_NAME         = c2.name,
  15676.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15677.         FK_COLUMN_PROPID    = convert(int,null),
  15678.         ORDINAL            = convert(int,11),
  15679.         UPDATE_RULE        = N'NO ACTION',
  15680.         DELETE_RULE         = N'NO ACTION'        
  15681.     from
  15682.         sysobjects o1, sysobjects o2,
  15683.         syscolumns c1, syscolumns c2,
  15684.         sysreferences r
  15685.     where    
  15686.         o2.name = @fk_table_name
  15687.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15688.     and    o2.id = r.fkeyid
  15689.     and    r.keycnt >= 11
  15690.     and    o2.id = c2.id
  15691.     and    c2.colid = r.fkey11
  15692.     and     r.rkeyid = o1.id
  15693.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15694.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15695.     and    o1.id = c1.id    
  15696.     and    c1.colid = r.rkey11
  15697.     union    all
  15698.     select
  15699.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15700.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15701.         PK_TABLE_NAME         = o1.name,
  15702.         PK_COLUMN_NAME         = c1.name,
  15703.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15704.         PK_COLUMN_PROPID    = convert(int,null),
  15705.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15706.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15707.         FK_TABLE_NAME         = o2.name,
  15708.         FK_COLUMN_NAME         = c2.name,
  15709.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15710.         FK_COLUMN_PROPID    = convert(int,null),
  15711.         ORDINAL            = convert(int,12),
  15712.         UPDATE_RULE        = N'NO ACTION',
  15713.         DELETE_RULE         = N'NO ACTION'        
  15714.     from
  15715.         sysobjects o1, sysobjects o2,
  15716.         syscolumns c1, syscolumns c2,
  15717.         sysreferences r
  15718.     where    
  15719.         o2.name = @fk_table_name
  15720.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15721.     and    o2.id = r.fkeyid
  15722.     and    r.keycnt >= 12
  15723.     and    o2.id = c2.id
  15724.     and    c2.colid = r.fkey12
  15725.     and     r.rkeyid = o1.id
  15726.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15727.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15728.     and    o1.id = c1.id    
  15729.     and    c1.colid = r.rkey12
  15730.     union    all
  15731.     select
  15732.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15733.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15734.         PK_TABLE_NAME         = o1.name,
  15735.         PK_COLUMN_NAME         = c1.name,
  15736.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15737.         PK_COLUMN_PROPID    = convert(int,null),
  15738.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15739.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15740.         FK_TABLE_NAME         = o2.name,
  15741.         FK_COLUMN_NAME         = c2.name,
  15742.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15743.         FK_COLUMN_PROPID    = convert(int,null),
  15744.         ORDINAL            = convert(int,13),
  15745.         UPDATE_RULE        = N'NO ACTION',
  15746.         DELETE_RULE         = N'NO ACTION'        
  15747.     from
  15748.         sysobjects o1, sysobjects o2,
  15749.         syscolumns c1, syscolumns c2,
  15750.         sysreferences r
  15751.     where    
  15752.         o2.name = @fk_table_name
  15753.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15754.     and    o2.id = r.fkeyid
  15755.     and    r.keycnt >= 13
  15756.     and    o2.id = c2.id
  15757.     and    c2.colid = r.fkey13
  15758.     and     r.rkeyid = o1.id
  15759.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15760.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15761.     and    o1.id = c1.id    
  15762.     and    c1.colid = r.rkey13
  15763.     union    all
  15764.     select
  15765.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15766.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15767.         PK_TABLE_NAME         = o1.name,
  15768.         PK_COLUMN_NAME         = c1.name,
  15769.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15770.         PK_COLUMN_PROPID    = convert(int,null),
  15771.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15772.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15773.         FK_TABLE_NAME         = o2.name,
  15774.         FK_COLUMN_NAME         = c2.name,
  15775.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15776.         FK_COLUMN_PROPID    = convert(int,null),
  15777.         ORDINAL            = convert(int,14),
  15778.         UPDATE_RULE        = N'NO ACTION',
  15779.         DELETE_RULE         = N'NO ACTION'        
  15780.     from
  15781.         sysobjects o1, sysobjects o2,
  15782.         syscolumns c1, syscolumns c2,
  15783.         sysreferences r
  15784.     where    
  15785.         o2.name = @fk_table_name
  15786.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15787.     and    o2.id = r.fkeyid
  15788.     and    r.keycnt >= 14
  15789.     and    o2.id = c2.id
  15790.     and    c2.colid = r.fkey14
  15791.     and     r.rkeyid = o1.id
  15792.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15793.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15794.     and    o1.id = c1.id    
  15795.     and    c1.colid = r.rkey14
  15796.     union    all
  15797.     select
  15798.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15799.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15800.         PK_TABLE_NAME         = o1.name,
  15801.         PK_COLUMN_NAME         = c1.name,
  15802.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15803.         PK_COLUMN_PROPID    = convert(int,null),
  15804.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15805.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15806.         FK_TABLE_NAME         = o2.name,
  15807.         FK_COLUMN_NAME         = c2.name,
  15808.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15809.         FK_COLUMN_PROPID    = convert(int,null),
  15810.         ORDINAL            = convert(int,15),
  15811.         UPDATE_RULE        = N'NO ACTION',
  15812.         DELETE_RULE         = N'NO ACTION'        
  15813.     from
  15814.         sysobjects o1, sysobjects o2,
  15815.         syscolumns c1, syscolumns c2,
  15816.         sysreferences r
  15817.     where    
  15818.         o2.name = @fk_table_name
  15819.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15820.     and    o2.id = r.fkeyid
  15821.     and    r.keycnt >= 15
  15822.     and    o2.id = c2.id
  15823.     and    c2.colid = r.fkey15
  15824.     and     r.rkeyid = o1.id
  15825.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15826.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15827.     and    o1.id = c1.id    
  15828.     and    c1.colid = r.rkey15
  15829.     union    all
  15830.     select
  15831.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15832.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15833.         PK_TABLE_NAME         = o1.name,
  15834.         PK_COLUMN_NAME         = c1.name,
  15835.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15836.         PK_COLUMN_PROPID    = convert(int,null),
  15837.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15838.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15839.         FK_TABLE_NAME         = o2.name,
  15840.         FK_COLUMN_NAME         = c2.name,
  15841.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15842.         FK_COLUMN_PROPID    = convert(int,null),
  15843.         ORDINAL            = convert(int,16),
  15844.         UPDATE_RULE        = N'NO ACTION',
  15845.         DELETE_RULE         = N'NO ACTION'        
  15846.     from
  15847.         sysobjects o1, sysobjects o2,
  15848.         syscolumns c1, syscolumns c2,
  15849.         sysreferences r
  15850.     where    
  15851.         o2.name = @fk_table_name
  15852.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15853.     and    o2.id = r.fkeyid
  15854.     and    r.keycnt >= 16
  15855.     and    o2.id = c2.id
  15856.     and    c2.colid = r.fkey16
  15857.     and     r.rkeyid = o1.id
  15858.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  15859.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15860.     and    o1.id = c1.id    
  15861.     and    c1.colid = r.rkey16
  15862.     END
  15863. ELSE
  15864.     BEGIN
  15865.     select
  15866.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15867.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15868.         PK_TABLE_NAME         = o1.name,
  15869.         PK_COLUMN_NAME         = c1.name,
  15870.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15871.         PK_COLUMN_PROPID    = convert(int,null),
  15872.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15873.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15874.         FK_TABLE_NAME         = o2.name,
  15875.         FK_COLUMN_NAME         = c2.name,
  15876.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15877.         FK_COLUMN_PROPID    = convert(int,null),
  15878.         ORDINAL            = convert(int,1),
  15879.         UPDATE_RULE        = N'NO ACTION',
  15880.         DELETE_RULE         = N'NO ACTION'        
  15881.     from
  15882.         sysobjects o1, sysobjects o2,
  15883.         syscolumns c1, syscolumns c2,
  15884.         sysreferences r
  15885.     where    
  15886.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15887.     and    o1.id = r.rkeyid
  15888.     and    o1.id = c1.id
  15889.     and    c1.colid = r.rkey1
  15890.     and     r.fkeyid = o2.id
  15891.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15892.     and    o2.id = c2.id    
  15893.     and    c2.colid = r.fkey1
  15894.     union all
  15895.     select
  15896.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15897.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15898.         PK_TABLE_NAME         = o1.name,
  15899.         PK_COLUMN_NAME         = c1.name,
  15900.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15901.         PK_COLUMN_PROPID    = convert(int,null),
  15902.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15903.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15904.         FK_TABLE_NAME         = o2.name,
  15905.         FK_COLUMN_NAME         = c2.name,
  15906.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15907.         FK_COLUMN_PROPID    = convert(int,null),
  15908.         ORDINAL            = convert(int,2),
  15909.         UPDATE_RULE        = N'NO ACTION',
  15910.         DELETE_RULE         = N'NO ACTION'        
  15911.     from
  15912.         sysobjects o1, sysobjects o2,
  15913.         syscolumns c1, syscolumns c2,
  15914.         sysreferences r
  15915.     where    
  15916.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15917.     and    o1.id = r.rkeyid
  15918.     and    r.keycnt >= 2
  15919.     and    o1.id = c1.id
  15920.     and    c1.colid = r.rkey2
  15921.     and     r.fkeyid = o2.id
  15922.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15923.     and    o2.id = c2.id    
  15924.     and    c2.colid = r.fkey2
  15925.     union all
  15926.     select
  15927.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15928.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15929.         PK_TABLE_NAME         = o1.name,
  15930.         PK_COLUMN_NAME         = c1.name,
  15931.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15932.         PK_COLUMN_PROPID    = convert(int,null),
  15933.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15934.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  15935.         FK_TABLE_NAME         = o2.name,
  15936.         FK_COLUMN_NAME         = c2.name,
  15937.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15938.         FK_COLUMN_PROPID    = convert(int,null),
  15939.         ORDINAL            = convert(int,3),
  15940.         UPDATE_RULE        = N'NO ACTION',
  15941.         DELETE_RULE         = N'NO ACTION'        
  15942.     from
  15943.         sysobjects o1, sysobjects o2,
  15944.         syscolumns c1, syscolumns c2,
  15945.         sysreferences r
  15946.     where    
  15947.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15948.     and    o1.id = r.rkeyid
  15949.     and    r.keycnt >= 3
  15950.     and    o1.id = c1.id
  15951.     and    c1.colid = r.rkey3
  15952.     and     r.fkeyid = o2.id
  15953.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15954.     and    o2.id = c2.id    
  15955.     and    c2.colid = r.fkey3
  15956.     union all
  15957.     select
  15958.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15959.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15960.         PK_TABLE_NAME         = o1.name,
  15961.         PK_COLUMN_NAME         = c1.name,
  15962.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15963.         PK_COLUMN_PROPID    = convert(int,null),
  15964.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15965.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15966.         FK_TABLE_NAME         = o2.name,
  15967.         FK_COLUMN_NAME         = c2.name,
  15968.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15969.         FK_COLUMN_PROPID    = convert(int,null),
  15970.         ORDINAL            = convert(int,4),
  15971.         UPDATE_RULE        = N'NO ACTION',
  15972.         DELETE_RULE         = N'NO ACTION'        
  15973.     from
  15974.         sysobjects o1, sysobjects o2,
  15975.         syscolumns c1, syscolumns c2,
  15976.         sysreferences r
  15977.     where    
  15978.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15979.     and    o1.id = r.rkeyid
  15980.     and    r.keycnt >= 4
  15981.     and    o1.id = c1.id
  15982.     and    c1.colid = r.rkey4
  15983.     and     r.fkeyid = o2.id
  15984.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15985.     and    o2.id = c2.id    
  15986.     and    c2.colid = r.fkey4
  15987.     union all
  15988.     select
  15989.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  15990.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  15991.         PK_TABLE_NAME         = o1.name,
  15992.         PK_COLUMN_NAME         = c1.name,
  15993.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  15994.         PK_COLUMN_PROPID    = convert(int,null),
  15995.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  15996.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  15997.         FK_TABLE_NAME         = o2.name,
  15998.         FK_COLUMN_NAME         = c2.name,
  15999.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16000.         FK_COLUMN_PROPID    = convert(int,null),
  16001.         ORDINAL            = convert(int,5),
  16002.         UPDATE_RULE        = N'NO ACTION',
  16003.         DELETE_RULE         = N'NO ACTION'        
  16004.     from
  16005.         sysobjects o1, sysobjects o2,
  16006.         syscolumns c1, syscolumns c2,
  16007.         sysreferences r
  16008.     where    
  16009.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16010.     and    o1.id = r.rkeyid
  16011.     and    r.keycnt >= 5
  16012.     and    o1.id = c1.id
  16013.     and    c1.colid = r.rkey5
  16014.     and     r.fkeyid = o2.id
  16015.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16016.     and    o2.id = c2.id    
  16017.     and    c2.colid = r.fkey5
  16018.     union all
  16019.     select
  16020.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16021.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16022.         PK_TABLE_NAME         = o1.name,
  16023.         PK_COLUMN_NAME         = c1.name,
  16024.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16025.         PK_COLUMN_PROPID    = convert(int,null),
  16026.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16027.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16028.         FK_TABLE_NAME         = o2.name,
  16029.         FK_COLUMN_NAME         = c2.name,
  16030.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16031.         FK_COLUMN_PROPID    = convert(int,null),
  16032.         ORDINAL            = convert(int,6),
  16033.         UPDATE_RULE        = N'NO ACTION',
  16034.         DELETE_RULE         = N'NO ACTION'        
  16035.     from
  16036.         sysobjects o1, sysobjects o2,
  16037.         syscolumns c1, syscolumns c2,
  16038.         sysreferences r
  16039.     where    
  16040.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16041.     and    o1.id = r.rkeyid
  16042.     and    r.keycnt >= 6
  16043.     and    o1.id = c1.id
  16044.     and    c1.colid = r.rkey6
  16045.     and     r.fkeyid = o2.id
  16046.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16047.     and    o2.id = c2.id    
  16048.     and    c2.colid = r.fkey6
  16049.     union all
  16050.     select
  16051.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16052.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16053.         PK_TABLE_NAME         = o1.name,
  16054.         PK_COLUMN_NAME         = c1.name,
  16055.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16056.         PK_COLUMN_PROPID    = convert(int,null),
  16057.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16058.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16059.         FK_TABLE_NAME         = o2.name,
  16060.         FK_COLUMN_NAME         = c2.name,
  16061.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16062.         FK_COLUMN_PROPID    = convert(int,null),
  16063.         ORDINAL            = convert(int,7),
  16064.         UPDATE_RULE        = N'NO ACTION',
  16065.         DELETE_RULE         = N'NO ACTION'        
  16066.     from
  16067.         sysobjects o1, sysobjects o2,
  16068.         syscolumns c1, syscolumns c2,
  16069.         sysreferences r
  16070.     where    
  16071.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16072.     and    o1.id = r.rkeyid
  16073.     and    r.keycnt >= 7
  16074.     and    o1.id = c1.id
  16075.     and    c1.colid = r.rkey7
  16076.     and     r.fkeyid = o2.id
  16077.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16078.     and    o2.id = c2.id    
  16079.     and    c2.colid = r.fkey7
  16080.     union all
  16081.     select
  16082.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16083.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16084.         PK_TABLE_NAME         = o1.name,
  16085.         PK_COLUMN_NAME         = c1.name,
  16086.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16087.         PK_COLUMN_PROPID    = convert(int,null),
  16088.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16089.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16090.         FK_TABLE_NAME         = o2.name,
  16091.         FK_COLUMN_NAME         = c2.name,
  16092.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16093.         FK_COLUMN_PROPID    = convert(int,null),
  16094.         ORDINAL            = convert(int,8),
  16095.         UPDATE_RULE        = N'NO ACTION',
  16096.         DELETE_RULE         = N'NO ACTION'        
  16097.     from
  16098.         sysobjects o1, sysobjects o2,
  16099.         syscolumns c1, syscolumns c2,
  16100.         sysreferences r
  16101.     where    
  16102.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16103.     and    o1.id = r.rkeyid
  16104.     and    r.keycnt >= 8
  16105.     and    o1.id = c1.id
  16106.     and    c1.colid = r.rkey8
  16107.     and     r.fkeyid = o2.id
  16108.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16109.     and    o2.id = c2.id    
  16110.     and    c2.colid = r.fkey8
  16111.     union all
  16112.     select
  16113.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16114.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16115.         PK_TABLE_NAME         = o1.name,
  16116.         PK_COLUMN_NAME         = c1.name,
  16117.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16118.         PK_COLUMN_PROPID    = convert(int,null),
  16119.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16120.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16121.         FK_TABLE_NAME         = o2.name,
  16122.         FK_COLUMN_NAME         = c2.name,
  16123.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16124.         FK_COLUMN_PROPID    = convert(int,null),
  16125.         ORDINAL            = convert(int,9),
  16126.         UPDATE_RULE        = N'NO ACTION',
  16127.         DELETE_RULE         = N'NO ACTION'        
  16128.     from
  16129.         sysobjects o1, sysobjects o2,
  16130.         syscolumns c1, syscolumns c2,
  16131.         sysreferences r
  16132.     where    
  16133.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16134.     and    o1.id = r.rkeyid
  16135.     and    r.keycnt >= 9
  16136.     and    o1.id = c1.id
  16137.     and    c1.colid = r.rkey9
  16138.     and     r.fkeyid = o2.id
  16139.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16140.     and    o2.id = c2.id    
  16141.     and    c2.colid = r.fkey9
  16142.     union all
  16143.     select
  16144.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16145.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16146.         PK_TABLE_NAME         = o1.name,
  16147.         PK_COLUMN_NAME         = c1.name,
  16148.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16149.         PK_COLUMN_PROPID    = convert(int,null),
  16150.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16151.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16152.         FK_TABLE_NAME         = o2.name,
  16153.         FK_COLUMN_NAME         = c2.name,
  16154.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16155.         FK_COLUMN_PROPID    = convert(int,null),
  16156.         ORDINAL            = convert(int,10),
  16157.         UPDATE_RULE        = N'NO ACTION',
  16158.         DELETE_RULE         = N'NO ACTION'        
  16159.     from
  16160.         sysobjects o1, sysobjects o2,
  16161.         syscolumns c1, syscolumns c2,
  16162.         sysreferences r
  16163.     where    
  16164.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16165.     and    o1.id = r.rkeyid
  16166.     and    r.keycnt >= 10
  16167.     and    o1.id = c1.id
  16168.     and    c1.colid = r.rkey10
  16169.     and     r.fkeyid = o2.id
  16170.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16171.     and    o2.id = c2.id    
  16172.     and    c2.colid = r.fkey10
  16173.     union all
  16174.     select
  16175.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16176.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16177.         PK_TABLE_NAME         = o1.name,
  16178.         PK_COLUMN_NAME         = c1.name,
  16179.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16180.         PK_COLUMN_PROPID    = convert(int,null),
  16181.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16182.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16183.         FK_TABLE_NAME         = o2.name,
  16184.         FK_COLUMN_NAME         = c2.name,
  16185.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16186.         FK_COLUMN_PROPID    = convert(int,null),
  16187.         ORDINAL            = convert(int,11),
  16188.         UPDATE_RULE        = N'NO ACTION',
  16189.         DELETE_RULE         = N'NO ACTION'        
  16190.     from
  16191.         sysobjects o1, sysobjects o2,
  16192.         syscolumns c1, syscolumns c2,
  16193.         sysreferences r
  16194.     where    
  16195.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16196.     and    o1.id = r.rkeyid
  16197.     and    r.keycnt >= 11
  16198.     and    o1.id = c1.id
  16199.     and    c1.colid = r.rkey11
  16200.     and     r.fkeyid = o2.id
  16201.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16202.     and    o2.id = c2.id    
  16203.     and    c2.colid = r.fkey11
  16204.     union all
  16205.     select
  16206.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16207.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16208.         PK_TABLE_NAME         = o1.name,
  16209.         PK_COLUMN_NAME         = c1.name,
  16210.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16211.         PK_COLUMN_PROPID    = convert(int,null),
  16212.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16213.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16214.         FK_TABLE_NAME         = o2.name,
  16215.         FK_COLUMN_NAME         = c2.name,
  16216.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16217.         FK_COLUMN_PROPID    = convert(int,null),
  16218.         ORDINAL            = convert(int,12),
  16219.         UPDATE_RULE        = N'NO ACTION',
  16220.         DELETE_RULE         = N'NO ACTION'        
  16221.     from
  16222.         sysobjects o1, sysobjects o2,
  16223.         syscolumns c1, syscolumns c2,
  16224.         sysreferences r
  16225.     where    
  16226.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16227.     and    o1.id = r.rkeyid
  16228.     and    r.keycnt >= 12
  16229.     and    o1.id = c1.id
  16230.     and    c1.colid = r.rkey12
  16231.     and     r.fkeyid = o2.id
  16232.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16233.     and    o2.id = c2.id    
  16234.     and    c2.colid = r.fkey12
  16235.     union all
  16236.     select
  16237.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16238.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16239.         PK_TABLE_NAME         = o1.name,
  16240.         PK_COLUMN_NAME         = c1.name,
  16241.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16242.         PK_COLUMN_PROPID    = convert(int,null),
  16243.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16244.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16245.         FK_TABLE_NAME         = o2.name,
  16246.         FK_COLUMN_NAME         = c2.name,
  16247.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16248.         FK_COLUMN_PROPID    = convert(int,null),
  16249.         ORDINAL            = convert(int,13),
  16250.         UPDATE_RULE        = N'NO ACTION',
  16251.         DELETE_RULE         = N'NO ACTION'        
  16252.     from
  16253.         sysobjects o1, sysobjects o2,
  16254.         syscolumns c1, syscolumns c2,
  16255.         sysreferences r
  16256.     where    
  16257.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16258.     and    o1.id = r.rkeyid
  16259.     and    r.keycnt >= 13
  16260.     and    o1.id = c1.id
  16261.     and    c1.colid = r.rkey13
  16262.     and     r.fkeyid = o2.id
  16263.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16264.     and    o2.id = c2.id    
  16265.     and    c2.colid = r.fkey13
  16266.     union all
  16267.     select
  16268.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16269.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16270.         PK_TABLE_NAME         = o1.name,
  16271.         PK_COLUMN_NAME         = c1.name,
  16272.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16273.         PK_COLUMN_PROPID    = convert(int,null),
  16274.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16275.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16276.         FK_TABLE_NAME         = o2.name,
  16277.         FK_COLUMN_NAME         = c2.name,
  16278.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16279.         FK_COLUMN_PROPID    = convert(int,null),
  16280.         ORDINAL            = convert(int,14),
  16281.         UPDATE_RULE        = N'NO ACTION',
  16282.         DELETE_RULE         = N'NO ACTION'        
  16283.     from
  16284.         sysobjects o1, sysobjects o2,
  16285.         syscolumns c1, syscolumns c2,
  16286.         sysreferences r
  16287.     where    
  16288.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16289.     and    o1.id = r.rkeyid
  16290.     and    r.keycnt >= 14
  16291.     and    o1.id = c1.id
  16292.     and    c1.colid = r.rkey14
  16293.     and     r.fkeyid = o2.id
  16294.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16295.     and    o2.id = c2.id    
  16296.     and    c2.colid = r.fkey14
  16297.     union all
  16298.     select
  16299.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16300.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16301.         PK_TABLE_NAME         = o1.name,
  16302.         PK_COLUMN_NAME         = c1.name,
  16303.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16304.         PK_COLUMN_PROPID    = convert(int,null),
  16305.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16306.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16307.         FK_TABLE_NAME         = o2.name,
  16308.         FK_COLUMN_NAME         = c2.name,
  16309.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16310.         FK_COLUMN_PROPID    = convert(int,null),
  16311.         ORDINAL            = convert(int,15),
  16312.         UPDATE_RULE        = N'NO ACTION',
  16313.         DELETE_RULE         = N'NO ACTION'        
  16314.     from
  16315.         sysobjects o1, sysobjects o2,
  16316.         syscolumns c1, syscolumns c2,
  16317.         sysreferences r
  16318.     where    
  16319.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16320.     and    o1.id = r.rkeyid
  16321.     and    r.keycnt >= 15
  16322.     and    o1.id = c1.id
  16323.     and    c1.colid = r.rkey15
  16324.     and     r.fkeyid = o2.id
  16325.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16326.     and    o2.id = c2.id    
  16327.     and    c2.colid = r.fkey15
  16328.     union all
  16329.     select
  16330.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16331.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16332.         PK_TABLE_NAME         = o1.name,
  16333.         PK_COLUMN_NAME         = c1.name,
  16334.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16335.         PK_COLUMN_PROPID    = convert(int,null),
  16336.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16337.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16338.         FK_TABLE_NAME         = o2.name,
  16339.         FK_COLUMN_NAME         = c2.name,
  16340.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16341.         FK_COLUMN_PROPID    = convert(int,null),
  16342.         ORDINAL            = convert(int,16),
  16343.         UPDATE_RULE        = N'NO ACTION',
  16344.         DELETE_RULE         = N'NO ACTION'        
  16345.     from
  16346.         sysobjects o1, sysobjects o2,
  16347.         syscolumns c1, syscolumns c2,
  16348.         sysreferences r
  16349.     where    
  16350.         (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16351.     and    o1.id = r.rkeyid
  16352.     and    o1.id = c1.id
  16353.     and    r.keycnt >= 16
  16354.     and    c1.colid = r.rkey16
  16355.     and     r.fkeyid = o2.id
  16356.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16357.     and    o2.id = c2.id    
  16358.     and    c2.colid = r.fkey16
  16359.     END
  16360. go
  16361.  
  16362.  
  16363. create procedure sp_foreign_keys_rowset;5
  16364.     (
  16365.        @handle        int output,
  16366.        @scrollopt    int output,
  16367.     @ccopt        int output,
  16368.     @rows        int output,
  16369.     @cmd        nvarchar(1200)
  16370.     )
  16371. as
  16372.     declare @ret int
  16373.     declare @database_name sysname
  16374.     declare @SQL nvarchar(1500)
  16375.  
  16376.     create table #spfkeysrowset
  16377.         (
  16378.         PK_TABLE_CATALOG    sysname not null,
  16379.         PK_TABLE_SCHEMA        sysname not null,
  16380.         PK_TABLE_NAME         sysname not null,
  16381.         PK_COLUMN_NAME         sysname not null,
  16382.         PK_COLUMN_GUID        uniqueidentifier null,
  16383.         PK_COLUMN_PROPID    int null,
  16384.         FK_TABLE_CATALOG    sysname not null,
  16385.         FK_TABLE_SCHEMA     sysname not null,
  16386.         FK_TABLE_NAME         sysname not null,
  16387.         FK_COLUMN_NAME         sysname not null,
  16388.         FK_COLUMN_GUID        uniqueidentifier null,
  16389.         FK_COLUMN_PROPID    int null,
  16390.         ORDINAL            int not null,
  16391.         UPDATE_RULE        nvarchar(30) not null,
  16392.         DELETE_RULE         nvarchar(30) not null        
  16393.         )
  16394.  
  16395.     declare sysdatabases_cursor insensitive cursor for 
  16396.         select name from master.dbo.sysdatabases
  16397.   
  16398.     set nocount on
  16399.     open sysdatabases_cursor
  16400.       fetch next from sysdatabases_cursor into @database_name 
  16401.     while @@fetch_status = 0
  16402.         begin
  16403.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spfkeysrowset '+@cmd
  16404.         exec(@SQL)
  16405.         fetch next from sysdatabases_cursor into @database_name 
  16406.         end
  16407.       close sysdatabases_cursor
  16408.     deallocate sysdatabases_cursor
  16409.  
  16410.     if @scrollopt is null
  16411.         begin
  16412.         select * from #spfkeysrowset order by 7,8,9,1,2,3,13
  16413.         end
  16414.     else
  16415.         begin
  16416.         exec @ret = sp_cursoropen @handle output,
  16417.             'select * from #spfkeysrowset order by 7,8,9,1,2,3,13',
  16418.                 @scrollopt output, @ccopt output, @rows output
  16419.         end
  16420.     drop table #spfkeysrowset
  16421.     return isnull(@ret,0)
  16422. go
  16423. create procedure sp_foreign_keys_rowset;6
  16424.     (
  16425.     @server_name        sysname,
  16426.     @pk_catalog_name    sysname = null,
  16427.     @fk_catalog_name    sysname = null,
  16428.     @pk_table_name        sysname = null,
  16429.     @pk_table_schema    sysname = null,
  16430.     @fk_table_name        sysname = null,
  16431.     @fk_table_schema    sysname = null
  16432.     )
  16433. as
  16434.     select
  16435.         PK_TABLE_CATALOG,
  16436.         PK_TABLE_SCHEMA,    
  16437.         PK_TABLE_NAME,     
  16438.         PK_COLUMN_NAME,     
  16439.         PK_COLUMN_GUID,    
  16440.         PK_COLUMN_PROPID,
  16441.         FK_TABLE_CATALOG,
  16442.         FK_TABLE_SCHEMA, 
  16443.         FK_TABLE_NAME,     
  16444.         FK_COLUMN_NAME,     
  16445.         FK_COLUMN_GUID,    
  16446.         FK_COLUMN_PROPID,
  16447.         ORDINAL,        
  16448.         UPDATE_RULE,    
  16449.         DELETE_RULE     
  16450.     from master.dbo.SYSREMOTE_FOREIGN_KEYS <
  16451.                 @server_name,
  16452.                 @pk_catalog_name,
  16453.                 @pk_table_schema,
  16454.                 @pk_table_name,
  16455.                 @fk_catalog_name,
  16456.                 @fk_table_schema,
  16457.                 @fk_table_name >
  16458.     order by 7,8,9,1,2,3,13
  16459. go
  16460.  
  16461. grant execute on sp_foreign_keys_rowset to public
  16462. go
  16463.  
  16464. dump tran master with no_log
  16465. go
  16466.  
  16467. print ''
  16468. print 'creating sp_indexes_rowset'
  16469. go
  16470.  
  16471. /*    6.0 and 6.5 version */
  16472. create procedure sp_indexes_rowset
  16473.     (
  16474.     @table_name    varchar(255), 
  16475.     @index_name    varchar(255) = null,
  16476.     @table_schema    varchar(255) = null     
  16477.     )
  16478. as
  16479.     select    TABLE_CATALOG        = db_name(),
  16480.         TABLE_SCHEMA        = user_name(o.uid),
  16481.         TABLE_NAME        = o.name,
  16482.         INDEX_CATALOG        = db_name(),        
  16483.         INDEX_SCHEMA        = user_name(o.uid),
  16484.         INDEX_NAME        = x.name,
  16485.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16486.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16487.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16488.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16489.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16490.         INITIAL_SIZE        = convert(int,null),
  16491.         NULLS            = convert(int,null),
  16492.         SORT_BOOKMARKS        = convert(bit,0),
  16493.         AUTO_UPDATE        = convert(bit,1),
  16494.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16495.         ORDINAL_POSITION    = convert(int,c.colid),
  16496.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16497.         COLUMN_GUID        = convert(binary(16),null),
  16498.         COLUMN_PROPID        = convert(int,null),
  16499.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16500.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16501.         PAGES            = convert(int, x.dpages),
  16502.         FILTER_CONDITION    = convert(varchar(1),null) 
  16503.         
  16504.     from    sysobjects o, sysindexes x, syscolumns c, sysusers u
  16505.     where    o.type in ('U')
  16506.     and     o.name = @table_name
  16507.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16508.     and    (@index_name is null or @index_name = x.name)
  16509.     and     x.id = o.id
  16510.     and     x.id = c.id
  16511.     and      c.colid < x.keycnt+(x.status&16)/16
  16512.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  16513.     and     (
  16514.         suser_id() = 1     /* User is the System Administrator */
  16515.         or o.uid = user_id()     /* User created the object */
  16516.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16517.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16518.             from sysprotects p
  16519.             where p.id = o.id
  16520.             /* get rows for public,current user,user's group */
  16521.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16522.             /* check for SELECT,EXECUTE privilege */
  16523.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16524.             ) = 1    /* final magic...compare Grants      */
  16525.            )
  16526.     order by 8 desc, 4, 5, 6, 17
  16527. go
  16528. create procedure sp_indexes_rowset;2
  16529.     (
  16530.     @index_name    varchar(255) = null,
  16531.     @table_schema    varchar(255) = null     
  16532.     )
  16533. as
  16534.     select    TABLE_CATALOG        = db_name(),
  16535.         TABLE_SCHEMA        = user_name(o.uid),
  16536.         TABLE_NAME        = o.name,
  16537.         INDEX_CATALOG        = db_name(),        
  16538.         INDEX_SCHEMA        = user_name(o.uid),
  16539.         INDEX_NAME        = x.name,
  16540.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16541.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16542.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16543.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16544.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16545.         INITIAL_SIZE        = convert(int,null),
  16546.         NULLS            = convert(int,null),
  16547.         SORT_BOOKMARKS        = convert(bit,0),
  16548.         AUTO_UPDATE        = convert(bit,1),
  16549.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16550.         ORDINAL_POSITION    = convert(int,c.colid),
  16551.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16552.         COLUMN_GUID        = convert(binary(16),null),
  16553.         COLUMN_PROPID        = convert(int,null),
  16554.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16555.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16556.         PAGES            = convert(int, x.dpages),
  16557.         FILTER_CONDITION    = convert(varchar(1),null) 
  16558.         
  16559.     from    sysobjects o, sysindexes x, syscolumns c, sysusers u
  16560.     where    o.type in ('U')
  16561.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16562.     and    (@index_name is null or @index_name = x.name)
  16563.     and     x.id = o.id
  16564.     and     x.id = c.id
  16565.     and      c.colid < x.keycnt+(x.status&16)/16
  16566.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  16567.     and     (
  16568.         suser_id() = 1     /* User is the System Administrator */
  16569.         or o.uid = user_id()     /* User created the object */
  16570.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16571.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16572.             from sysprotects p
  16573.             where p.id = o.id
  16574.             /* get rows for public,current user,user's group */
  16575.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16576.             /* check for SELECT,EXECUTE privilege */
  16577.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16578.             ) = 1    /* final magic...compare Grants      */
  16579.            )
  16580.     order by 8 desc, 4, 5, 6, 17
  16581. go
  16582.  
  16583.  
  16584. if (charindex('7.00', @@version) > 0)
  16585.     drop procedure sp_indexes_rowset
  16586. else
  16587. begin
  16588.     print ''
  16589.     print ''
  16590.     print 'Warning:'
  16591.     print 'you are installing the stored procedures '
  16592.     print 'on a pre 7.0 SQL Server.'
  16593.     print 'Ignore the following errors.'
  16594. end
  16595. go
  16596.  
  16597. /*     7.0 version */
  16598. create procedure sp_indexes_rowset
  16599.     (
  16600.     @table_name    sysname, 
  16601.     @index_name    sysname = null,
  16602.     @table_schema    sysname = null     
  16603.     )
  16604. as
  16605.     select    TABLE_CATALOG        = db_name(),
  16606.         TABLE_SCHEMA        = user_name(o.uid),
  16607.         TABLE_NAME        = o.name,
  16608.         INDEX_CATALOG        = db_name(),        
  16609.         INDEX_SCHEMA        = user_name(o.uid),
  16610.         INDEX_NAME        = x.name,
  16611.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16612.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16613.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16614.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16615.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16616.         INITIAL_SIZE        = convert(int,null),
  16617.         NULLS            = convert(int,null),
  16618.         SORT_BOOKMARKS        = convert(bit,0),
  16619.         AUTO_UPDATE        = convert(bit,1),
  16620.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16621.         ORDINAL_POSITION    = convert(int,c.colid),
  16622.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16623.         COLUMN_GUID        = convert(uniqueidentifier,null),
  16624.         COLUMN_PROPID        = convert(int,null),
  16625.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16626.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16627.         PAGES            = convert(int, x.dpages),
  16628.         FILTER_CONDITION    = convert(nvarchar(1),null) 
  16629.         
  16630.     from    sysobjects o, sysindexes x, syscolumns c
  16631.     where    o.type in ('U')
  16632.     and     o.name = @table_name
  16633.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16634.     and    (@index_name is null or @index_name = x.name)
  16635.     and     x.id = o.id
  16636.     and     x.id = c.id
  16637.     and      c.colid < x.keycnt+(x.status&16)/16
  16638.     and    index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid) is not null
  16639.     and     permissions(o.id) <> 0
  16640.     order by 8 desc, 4, 5, 6, 17
  16641. go
  16642. create procedure sp_indexes_rowset;2
  16643.     (
  16644.     @index_name    sysname = null,
  16645.     @table_schema    sysname = null     
  16646.     )
  16647. as
  16648.     select    TABLE_CATALOG        = db_name(),
  16649.         TABLE_SCHEMA        = user_name(o.uid),
  16650.         TABLE_NAME        = o.name,
  16651.         INDEX_CATALOG        = db_name(),        
  16652.         INDEX_SCHEMA        = user_name(o.uid),
  16653.         INDEX_NAME        = x.name,
  16654.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16655.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16656.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16657.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16658.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16659.         INITIAL_SIZE        = convert(int,null),
  16660.         NULLS            = convert(int,null),
  16661.         SORT_BOOKMARKS        = convert(bit,0),
  16662.         AUTO_UPDATE        = convert(bit,1),
  16663.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16664.         ORDINAL_POSITION    = convert(int,c.colid),
  16665.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16666.         COLUMN_GUID        = convert(uniqueidentifier,null),
  16667.         COLUMN_PROPID        = convert(int,null),
  16668.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16669.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16670.         PAGES            = convert(int, x.dpages),
  16671.         FILTER_CONDITION    = convert(nvarchar(1),null) 
  16672.         
  16673.     from    sysobjects o, sysindexes x, syscolumns c
  16674.     where    o.type in ('U')
  16675.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16676.     and    (@index_name is null or @index_name = x.name)
  16677.     and     x.id = o.id
  16678.     and     x.id = c.id
  16679.     and      c.colid < x.keycnt+(x.status&16)/16
  16680.     and    index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid) is not null
  16681.     and     permissions(o.id) <> 0
  16682.     order by 8 desc, 4, 5, 6, 17
  16683. go
  16684. create procedure sp_indexes_rowset;3
  16685.     (
  16686.     @table_name    sysname = null, 
  16687.     @index_name    sysname = null,
  16688.     @table_schema    sysname = null     
  16689.     )
  16690. as
  16691. IF @table_name is not null
  16692.     BEGIN
  16693.     select    TABLE_CATALOG        = db_name(),
  16694.         TABLE_SCHEMA        = user_name(o.uid),
  16695.         TABLE_NAME        = o.name,
  16696.         INDEX_CATALOG        = db_name(),        
  16697.         INDEX_SCHEMA        = user_name(o.uid),
  16698.         INDEX_NAME        = x.name,
  16699.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16700.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16701.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16702.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16703.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16704.         INITIAL_SIZE        = convert(int,null),
  16705.         NULLS            = convert(int,null),
  16706.         SORT_BOOKMARKS        = convert(bit,0),
  16707.         AUTO_UPDATE        = convert(bit,1),
  16708.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16709.         ORDINAL_POSITION    = convert(int,c.colid),
  16710.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16711.         COLUMN_GUID        = convert(uniqueidentifier,null),
  16712.         COLUMN_PROPID        = convert(int,null),
  16713.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16714.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16715.         PAGES            = convert(int, x.dpages),
  16716.         FILTER_CONDITION    = convert(nvarchar(1),null) 
  16717.         
  16718.     from    sysobjects o, sysindexes x, syscolumns c
  16719.     where    o.type in ('U')
  16720.     and     o.name = @table_name
  16721.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16722.     and    (@index_name is null or @index_name = x.name)
  16723.     and     x.id = o.id
  16724.     and     x.id = c.id
  16725.     and      c.colid < x.keycnt+(x.status&16)/16
  16726.     and    index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid) is not null
  16727.     and     permissions(o.id) <> 0
  16728.     END
  16729. ELSE
  16730.     BEGIN
  16731.     select    TABLE_CATALOG        = db_name(),
  16732.         TABLE_SCHEMA        = user_name(o.uid),
  16733.         TABLE_NAME        = o.name,
  16734.         INDEX_CATALOG        = db_name(),        
  16735.         INDEX_SCHEMA        = user_name(o.uid),
  16736.         INDEX_NAME        = x.name,
  16737.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  16738.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  16739.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  16740.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  16741.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  16742.         INITIAL_SIZE        = convert(int,null),
  16743.         NULLS            = convert(int,null),
  16744.         SORT_BOOKMARKS        = convert(bit,0),
  16745.         AUTO_UPDATE        = convert(bit,1),
  16746.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  16747.         ORDINAL_POSITION    = convert(int,c.colid),
  16748.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  16749.         COLUMN_GUID        = convert(uniqueidentifier,null),
  16750.         COLUMN_PROPID        = convert(int,null),
  16751.         COLLATION        = convert(smallint, 1 /*DB_COLLATION_ASC*/),
  16752.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  16753.         PAGES            = convert(int, x.dpages),
  16754.         FILTER_CONDITION    = convert(nvarchar(1),null) 
  16755.         
  16756.     from    sysobjects o, sysindexes x, syscolumns c
  16757.     where    o.type in ('U')
  16758.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16759.     and    (@index_name is null or @index_name = x.name)
  16760.     and     x.id = o.id
  16761.     and     x.id = c.id
  16762.     and      c.colid < x.keycnt+(x.status&16)/16
  16763.     and    index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid) is not null
  16764.     and     permissions(o.id) <> 0
  16765.     END
  16766. go
  16767.  
  16768. create procedure sp_indexes_rowset;4
  16769.     (
  16770.  
  16771.        @handle        int output,
  16772.        @scrollopt    int output,
  16773.     @ccopt        int output,
  16774.     @rows        int output,
  16775.     @cmd        nvarchar(1200)
  16776.     )
  16777. as
  16778.     declare @ret int
  16779.     declare @database_name sysname
  16780.     declare @SQL nvarchar(1500)
  16781.  
  16782.     create table #sppindxrowset
  16783.         (
  16784.         TABLE_CATALOG        sysname not null,
  16785.         TABLE_SCHEMA        sysname not null,
  16786.         TABLE_NAME        sysname not null,
  16787.         INDEX_CATALOG        sysname not null,        
  16788.         INDEX_SCHEMA        sysname not null,
  16789.         INDEX_NAME        sysname not null,
  16790.         PRIMARY_KEY        bit not null,
  16791.         "UNIQUE"        bit not null,
  16792.         "CLUSTERED"        bit not null,
  16793.         "TYPE"            smallint not null,
  16794.         FILL_FACTOR        int not null,
  16795.         INITIAL_SIZE        int null,
  16796.         NULLS            int null,
  16797.         SORT_BOOKMARKS        bit not null,
  16798.         AUTO_UPDATE        bit not null,
  16799.         NULL_COLLATION        int not null,
  16800.         ORDINAL_POSITION    int not null,
  16801.         COLUMN_NAME        sysname not null,
  16802.         COLUMN_GUID        uniqueidentifier null,
  16803.         COLUMN_PROPID        int null,
  16804.         COLLATION        smallint not null,
  16805.         CARDINALITY        int null,
  16806.         PAGES            int not null,
  16807.         FILTER_CONDITION    nvarchar(1) null         
  16808.         )
  16809.  
  16810.     declare sysdatabases_cursor insensitive cursor for 
  16811.         select name from master.dbo.sysdatabases
  16812.   
  16813.     set nocount on
  16814.     open sysdatabases_cursor
  16815.       fetch next from sysdatabases_cursor into @database_name 
  16816.     while @@fetch_status = 0
  16817.         begin
  16818.         select @SQL = N'use '+quotename(@database_name)+N' insert into #sppindxrowset '+@cmd
  16819.         exec(@SQL)
  16820.         fetch next from sysdatabases_cursor into @database_name 
  16821.         end
  16822.       close sysdatabases_cursor
  16823.     deallocate sysdatabases_cursor
  16824.  
  16825.     if @scrollopt is null
  16826.         begin
  16827.         select * from #sppindxrowset order by 8 desc, 4, 5, 6, 17
  16828.         end
  16829.     else
  16830.         begin
  16831.         exec @ret = sp_cursoropen @handle output,
  16832.             'select * from #sppindxrowset order by 8 desc, 4, 5, 6, 17',
  16833.                 @scrollopt output, @ccopt output, @rows output
  16834.         end
  16835.     drop table #sppindxrowset
  16836.     return isnull(@ret,0)
  16837. go
  16838. create procedure sp_indexes_rowset;5
  16839.     (
  16840.     @table_server        sysname,
  16841.     @table_catalog        sysname = null,
  16842.     @table_name        sysname = null,
  16843.     @index_name        sysname = null,
  16844.     @table_schema        sysname = null
  16845.     )
  16846. as
  16847.     select
  16848.         TABLE_CATALOG,    
  16849.         TABLE_SCHEMA,    
  16850.         TABLE_NAME,    
  16851.         INDEX_CATALOG,        
  16852.         INDEX_SCHEMA,    
  16853.         INDEX_NAME,    
  16854.         PRIMARY_KEY,    
  16855.         "UNIQUE",    
  16856.         "CLUSTERED",    
  16857.         "TYPE",        
  16858.         FILL_FACTOR,    
  16859.         INITIAL_SIZE,    
  16860.         NULLS,        
  16861.         SORT_BOOKMARKS,    
  16862.         AUTO_UPDATE,    
  16863.         NULL_COLLATION,    
  16864.         ORDINAL_POSITION,
  16865.         COLUMN_NAME,    
  16866.         COLUMN_GUID,    
  16867.         COLUMN_PROPID,    
  16868.         COLLATION,    
  16869.         CARDINALITY,    
  16870.         PAGES,        
  16871.         FILTER_CONDITION    
  16872.     from master.dbo.SYSREMOTE_INDEXES <
  16873.                 @table_server,
  16874.                 @table_catalog,
  16875.                 @table_schema,
  16876.                         @index_name,
  16877.                 NULL,            /* TYPE (index type) */
  16878.                 @table_name >
  16879.     order by 8 desc, 4, 5, 6, 17
  16880. go
  16881.  
  16882. grant execute on sp_indexes_rowset to public
  16883. go
  16884.  
  16885. dump tran master with no_log
  16886. go
  16887.  
  16888. print ''
  16889. print 'creating sp_primary_keys_rowset'
  16890. go
  16891.  
  16892. /*    Procedure for 6.0 and 6.5 servers */
  16893. create procedure sp_primary_keys_rowset
  16894.     (
  16895.        @table_name        varchar(255),
  16896.     @table_schema         varchar(244) = null
  16897.     )
  16898. as
  16899.     select    TABLE_CATALOG    = db_name(),
  16900.         TABLE_SCHEMA    = user_name(o.uid),
  16901.         TABLE_NAME    = o.name,    
  16902.         COLUMN_NAME    = c.name,
  16903.         COLUMN_GUID    = convert(binary(16),null),
  16904.         COLUMN_PROPID    = convert(int,null),
  16905.         ORDINAL        = convert(int,c1.colid)
  16906.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1, sysusers u
  16907.     where    o.type in ('U')
  16908.     and     o.name = @table_name
  16909.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16910.     and     o.id = c.id
  16911.     and     o.id = i.id
  16912.     and     (i.status & 0x800) = 0x800
  16913.     and     c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  16914.     and     c1.id = c.id
  16915.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  16916.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  16917.     and     (
  16918.         suser_id() = 1     /* User is the System Administrator */
  16919.         or o.uid = user_id()     /* User created the object */
  16920.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16921.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16922.             from sysprotects p
  16923.             where p.id = o.id
  16924.             /* get rows for public,current user,user's group */
  16925.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16926.             /* check for SELECT,EXECUTE privilege */
  16927.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16928.             ) = 1    /* final magic...compare Grants      */
  16929.            )
  16930.     order by 2, 3
  16931. go
  16932. create procedure sp_primary_keys_rowset;2
  16933.     (
  16934.      @table_schema         varchar(244) = null
  16935.     )
  16936. as
  16937.     select    TABLE_CATALOG    = db_name(),
  16938.         TABLE_SCHEMA    = user_name(o.uid),
  16939.         TABLE_NAME    = o.name,    
  16940.         COLUMN_NAME    = c.name,
  16941.         COLUMN_GUID    = convert(binary(16),null),
  16942.         COLUMN_PROPID    = convert(int,null),
  16943.         ORDINAL        = convert(int,c1.colid)
  16944.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1, sysusers u
  16945.     where    o.type in ('U')
  16946.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  16947.     and     o.id = c.id
  16948.     and     o.id = i.id
  16949.     and     (i.status & 0x800) = 0x800
  16950.     and     c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  16951.     and     c1.id = c.id
  16952.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  16953.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  16954.     and     (
  16955.         suser_id() = 1     /* User is the System Administrator */
  16956.         or o.uid = user_id()     /* User created the object */
  16957.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16958.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16959.             from sysprotects p
  16960.             where p.id = o.id
  16961.             /* get rows for public,current user,user's group */
  16962.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16963.             /* check for SELECT,EXECUTE privilege */
  16964.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16965.             ) = 1    /* final magic...compare Grants      */
  16966.            )
  16967.     order by 2, 3
  16968. go
  16969.  
  16970. if (charindex('7.00', @@version) = 0)
  16971. begin
  16972.     print ''
  16973.     print ''
  16974.     print 'Warning:'
  16975.     print 'you are installing the stored procedures '
  16976.     print 'on a pre 7.0 SQL Server.'
  16977.     print 'Ignore the following errors.'
  16978. end
  16979. else
  16980.     drop proc sp_primary_keys_rowset
  16981. go
  16982.  
  16983. /*    Procedure for 7.0 servers */
  16984. create procedure sp_primary_keys_rowset
  16985.     (
  16986.        @table_name        sysname,
  16987.     @table_schema         sysname = null
  16988.     )
  16989. as
  16990.     select    TABLE_CATALOG    = db_name(),
  16991.         TABLE_SCHEMA    = user_name(o.uid),
  16992.         TABLE_NAME    = o.name,    
  16993.         COLUMN_NAME    = c.name,
  16994.         COLUMN_GUID    = convert(uniqueidentifier,null),
  16995.         COLUMN_PROPID    = convert(int,null),
  16996.         ORDINAL        = convert(int,c1.colid)
  16997.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  16998.     where    o.type in ('U')
  16999.     and     o.name = @table_name
  17000.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  17001.     and     o.id = c.id
  17002.     and     o.id = i.id
  17003.     and     (i.status & 0x800) = 0x800
  17004.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  17005.     and     c1.id = c.id
  17006.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  17007.     and    permissions(o.id) <> 0
  17008.     order by 2, 3
  17009. go
  17010. create procedure sp_primary_keys_rowset;2
  17011.     (
  17012.      @table_schema     sysname = null
  17013.     )
  17014. as
  17015.     select    TABLE_CATALOG    = db_name(),
  17016.         TABLE_SCHEMA    = user_name(o.uid),
  17017.         TABLE_NAME    = o.name,    
  17018.         COLUMN_NAME    = c.name,
  17019.         COLUMN_GUID    = convert(uniqueidentifier,null),
  17020.         COLUMN_PROPID    = convert(int,null),
  17021.         ORDINAL        = convert(int,c1.colid)
  17022.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  17023.     where    o.type in ('U')
  17024.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  17025.     and     o.id = c.id
  17026.     and     o.id = i.id
  17027.     and     (i.status & 0x800) = 0x800
  17028.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  17029.     and     c1.id = c.id
  17030.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  17031.     and    permissions(o.id) <> 0
  17032.     order by 2, 3
  17033. go
  17034. create procedure sp_primary_keys_rowset;3
  17035.     (
  17036.        @table_name        sysname = null,
  17037.     @table_schema         sysname = null
  17038.     )
  17039. as
  17040. IF @table_name is not NULL
  17041.     BEGIN
  17042.     select    TABLE_CATALOG    = db_name(),
  17043.         TABLE_SCHEMA    = user_name(o.uid),
  17044.         TABLE_NAME    = o.name,    
  17045.         COLUMN_NAME    = c.name,
  17046.         COLUMN_GUID    = convert(uniqueidentifier,null),
  17047.         COLUMN_PROPID    = convert(int,null),
  17048.         ORDINAL        = convert(int,c1.colid)
  17049.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  17050.     where    o.type in ('U')
  17051.     and     o.name = @table_name
  17052.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  17053.     and     o.id = c.id
  17054.     and     o.id = i.id
  17055.     and     (i.status & 0x800) = 0x800
  17056.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  17057.     and     c1.id = c.id
  17058.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  17059.     and    permissions(o.id) <> 0
  17060.     END
  17061. ELSE
  17062.     BEGIN
  17063.     select    TABLE_CATALOG    = db_name(),
  17064.         TABLE_SCHEMA    = user_name(o.uid),
  17065.         TABLE_NAME    = o.name,    
  17066.         COLUMN_NAME    = c.name,
  17067.         COLUMN_GUID    = convert(uniqueidentifier,null),
  17068.         COLUMN_PROPID    = convert(int,null),
  17069.         ORDINAL        = convert(int,c1.colid)
  17070.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  17071.     where    o.type in ('U')
  17072.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  17073.     and     o.id = c.id
  17074.     and     o.id = i.id
  17075.     and     (i.status & 0x800) = 0x800
  17076.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  17077.     and     c1.id = c.id
  17078.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  17079.     and    permissions(o.id) <> 0
  17080.     END
  17081. go
  17082.  
  17083.  
  17084. create procedure sp_primary_keys_rowset;4
  17085.     (
  17086.  
  17087.        @handle        int output,
  17088.        @scrollopt    int output,
  17089.     @ccopt        int output,
  17090.     @rows        int output,
  17091.     @cmd        nvarchar(1200)
  17092.     )
  17093. as
  17094.     declare @ret int
  17095.     declare @database_name sysname
  17096.     declare @SQL nvarchar(1500)
  17097.  
  17098.     create table #sppkeysrowset
  17099.         (
  17100.         TABLE_CATALOG        sysname not null,
  17101.         TABLE_SCHEMA        sysname not null,
  17102.         TABLE_NAME        sysname not null,
  17103.         COLUMN_NAME        sysname not null,
  17104.         COLUMN_GUID        uniqueidentifier null,
  17105.         COLUMN_PROPID        int null,
  17106.         ORDINAL            int null
  17107.         )
  17108.  
  17109.     declare sysdatabases_cursor insensitive cursor for 
  17110.         select name from master.dbo.sysdatabases
  17111.   
  17112.     set nocount on
  17113.     open sysdatabases_cursor
  17114.       fetch next from sysdatabases_cursor into @database_name 
  17115.     while @@fetch_status = 0
  17116.         begin
  17117.         select @SQL = N'use '+quotename(@database_name)+N' insert into #sppkeysrowset '+@cmd
  17118.         exec(@SQL)
  17119.         fetch next from sysdatabases_cursor into @database_name 
  17120.         end
  17121.       close sysdatabases_cursor
  17122.     deallocate sysdatabases_cursor
  17123.  
  17124.     if @scrollopt is null
  17125.         begin
  17126.         select * from #sppkeysrowset order by 1,2,3
  17127.         end
  17128.     else
  17129.         begin
  17130.         exec @ret = sp_cursoropen @handle output,
  17131.             'select * from #sppkeysrowset order by 1,2,3',
  17132.                 @scrollopt output, @ccopt output, @rows output
  17133.         end
  17134.     drop table #sppkeysrowset
  17135.     return isnull(@ret,0)
  17136. go
  17137. create procedure sp_primary_keys_rowset;5
  17138.     (
  17139.     @table_server        sysname,
  17140.     @table_catalog        sysname = null,
  17141.     @table_name        sysname = null,
  17142.     @table_schema        sysname = null
  17143.     )
  17144. as
  17145.     select
  17146.         TABLE_CATALOG,    
  17147.         TABLE_SCHEMA,    
  17148.         TABLE_NAME,    
  17149.         COLUMN_NAME,    
  17150.         COLUMN_GUID,    
  17151.         COLUMN_PROPID,    
  17152.         ORDINAL        
  17153.     from master.dbo.SYSREMOTE_PRIMARY_KEYS <
  17154.                 @table_server,
  17155.                 @table_catalog,
  17156.                 @table_schema,
  17157.                 @table_name >
  17158.     order by 1,2,3
  17159. go
  17160.  
  17161. grant execute on sp_primary_keys_rowset to public
  17162. go
  17163.  
  17164. dump tran master with no_log
  17165. go
  17166.  
  17167. print ''
  17168. print 'creating sp_provider_types_rowset'
  17169. go
  17170.  
  17171. /*    Procedure for 6.0 and 6.50 servers */
  17172. create proc sp_provider_types_rowset
  17173.     (
  17174.     @data_type     smallint = null,
  17175.     @best_match    tinyint  = null
  17176.     )
  17177. as
  17178.     select
  17179.         TYPE_NAME         = case    when t.usertype = 80 then t.name 
  17180.                         else d.type_name 
  17181.                         end,
  17182.         DATA_TYPE         = d.oledb_data_type,                            
  17183.         COLUMN_SIZE        = coalesce(d.column_size,d.data_precision,t.prec),
  17184.         LITERAL_PREFIX         = d.literal_prefix,
  17185.         LITERAL_SUFFIX         = d.literal_suffix,
  17186.         CREATE_PARAMS         = convert(varchar(32),e.CREATE_PARAMS),
  17187.         IS_NULLABLE        = t.allownulls,
  17188.         CASE_SENSITIVE        = d.case_sensitive,
  17189.         SEARCHABLE         = d.searchable,
  17190.         UNSIGNED_ATTRIBUTE    = d.unsigned_attribute,
  17191.         FIXED_PREC_SCALE    = d.fixed_prec_scale,
  17192.         AUTO_UNIQUE_VALUE    = d.auto_unique_value, 
  17193.         LOCAL_TYPE_NAME        = case    when t.usertype = 80 then t.name 
  17194.                         else d.local_type_name
  17195.                         end,
  17196.         MINIMUM_SCALE        = convert(smallint,
  17197.                         case 
  17198.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0 
  17199.                         else null 
  17200.                         end),
  17201.         MAXIMUM_SCALE        = convert(smallint,
  17202.                         case 
  17203.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  17204.                         then d.data_precision 
  17205.                         else null 
  17206.                         end),
  17207.         GUID            = convert(binary(16),null),
  17208.         TYPELIB            = convert(varchar(1),null),
  17209.         VERSION            = convert(varchar(1),null),
  17210.         IS_LONG            = d.is_long,
  17211.         BEST_MATCH        = case when t.usertype = 80
  17212.                         then convert(bit,0)
  17213.                         else d.best_match
  17214.                         end 
  17215.     from     master.dbo.spt_provider_types d, master.dbo.spt_datatype_info_ext e, systypes t
  17216.     where    d.ss_dtype = t.type 
  17217.     and    t.usertype <= 100
  17218.     and    t.usertype <> 18 /* sysname */
  17219.     and    (case when t.usertype = 80 /* TIMESTAMP */ then 1 else 0 end 
  17220.             = case when d.type_name = 'timestamp' then 1 else 0 end)
  17221.     and     t.usertype *= e.user_type 
  17222.     and     e.AUTO_INCREMENT = 0
  17223.     and     t.type not in (111,109,38,110,55,63)    /* get rid of nullable types */
  17224.     and    (@data_type is null or d.oledb_data_type = @data_type)
  17225.     and    (@best_match is null or d.best_match = @best_match)
  17226.     order by 2
  17227. go
  17228.  
  17229. if (charindex('7.00', @@version) = 0)
  17230. begin
  17231.     print ''
  17232.     print ''
  17233.     print 'Warning:'
  17234.     print 'you are installing the stored procedures '
  17235.     print 'on a pre 7.0 SQL Server.'
  17236.     print 'Ignore the following errors.'
  17237. end
  17238. else
  17239.     drop proc sp_provider_types_rowset
  17240. go
  17241.  
  17242. /*    Procedure for 7.0 server */
  17243. create proc sp_provider_types_rowset
  17244.     (
  17245.     @data_type     smallint = null,
  17246.     @best_match    tinyint  = null
  17247.     )
  17248. as
  17249.     select
  17250.         TYPE_NAME         = case    when t.usertype = 80 then t.name 
  17251.                         else d.type_name 
  17252.                         end,
  17253.         DATA_TYPE         = d.oledb_data_type,                            
  17254.         COLUMN_SIZE        = coalesce(d.column_size,d.data_precision,t.prec),
  17255.         LITERAL_PREFIX         = d.literal_prefix,
  17256.         LITERAL_SUFFIX         = d.literal_suffix,
  17257.         CREATE_PARAMS         = convert(nvarchar(32),e.CREATE_PARAMS),
  17258.         IS_NULLABLE        = t.allownulls,
  17259.         CASE_SENSITIVE        = d.case_sensitive,
  17260.         SEARCHABLE         = d.searchable,
  17261.         UNSIGNED_ATTRIBUTE    = d.unsigned_attribute,
  17262.         FIXED_PREC_SCALE    = d.fixed_prec_scale,
  17263.         AUTO_UNIQUE_VALUE    = d.auto_unique_value, 
  17264.         LOCAL_TYPE_NAME        = case    when t.usertype = 80 then t.name 
  17265.                         else d.local_type_name
  17266.                         end,
  17267.         MINIMUM_SCALE        = convert(smallint,
  17268.                         case 
  17269.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0 
  17270.                         else null 
  17271.                         end),
  17272.         MAXIMUM_SCALE        = convert(smallint,
  17273.                         case 
  17274.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  17275.                         then d.data_precision 
  17276.                         else null 
  17277.                         end),
  17278.         GUID            = convert(uniqueidentifier,null),
  17279.         TYPELIB            = convert(nvarchar(1),null),
  17280.         VERSION            = convert(nvarchar(1),null),
  17281.         IS_LONG            = d.is_long,
  17282.         BEST_MATCH        = case    when t.usertype = 80
  17283.                         then convert(bit,0)
  17284.                         else d.best_match
  17285.                         end 
  17286.     from master.dbo.spt_provider_types d
  17287.         INNER JOIN model.dbo.systypes t on d.ss_dtype = t.xtype
  17288.         LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
  17289.             t.xusertype = e.user_type
  17290.             and e.AUTO_INCREMENT = 0
  17291.     where    (@data_type is null or d.oledb_data_type = @data_type)
  17292.     and    (@best_match is null or d.best_match = @best_match)    
  17293.     and    t.usertype <= 255
  17294.     and    t.usertype <> 18 /* sysname */
  17295.     order by 2
  17296. go
  17297.  
  17298. grant execute on sp_provider_types_rowset to public
  17299. go
  17300.  
  17301. dump tran master with no_log
  17302. go
  17303.  
  17304. print ''
  17305. print 'creating sp_procedure_params_rowset'
  17306. go
  17307.  
  17308. /*    Procedure for 6.0 and 6.50 servers */
  17309. create procedure sp_procedure_params_rowset
  17310.     (
  17311.        @procedure_name        varchar(255) = null,
  17312.     @group_number        int = null,
  17313.     @procedure_schema     varchar(255) = null,
  17314.     @parameter_name        varchar(255) = null
  17315.     )
  17316. as
  17317. IF @procedure_name is not null
  17318.     BEGIN
  17319.     select
  17320.         PROCEDURE_CATALOG     = db_name(),
  17321.         PROCEDURE_SCHEMA     = user_name(),
  17322.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17323.         PARAMETER_NAME         = c.name,
  17324.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17325.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  17326.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17327.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17328.         IS_NULLABLE        = convert(bit,c.status&8),
  17329.         DATA_TYPE        = d.oledb_data_type,
  17330.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17331.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17332.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17333.                         then coalesce(d.column_size,c.length)
  17334.                         else null 
  17335.                         end),
  17336.         CHARACTER_OCTET_LENGTH    = convert(int,
  17337.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17338.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17339.                         then coalesce(d.column_size,c.length)
  17340.                         else null 
  17341.                         end),
  17342.         NUMERIC_PRECISION    = convert(smallint,
  17343.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17344.         NUMERIC_SCALE        = convert(smallint, 
  17345.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17346.         DESCRIPTION        = convert(varchar(1),null)
  17347.     
  17348.     from
  17349.         syscolumns c,
  17350.         sysobjects o,
  17351.         master.dbo.spt_provider_types d,
  17352.         systypes t,
  17353.         sysusers u
  17354.     where
  17355.         o.name = @procedure_name
  17356.     and    o.type = 'P'                            /* Just Procedures */
  17357.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17358.     and    o.id = c.id
  17359.     and    c.number = @group_number
  17360.     and    c.type = d.ss_dtype
  17361.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17362.     and    c.usertype = t.usertype
  17363.     and    (@parameter_name is null or @parameter_name = c.name)
  17364.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17365.     and     (    suser_id() = 1     /* User is the System Administrator */
  17366.         or     o.uid = user_id()    /* User created the object */
  17367.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17368.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17369.              from sysprotects p
  17370.              where p.id = o.id
  17371.                  /*  get rows for public,current user,user's group */
  17372.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17373.                  /* check for SELECT,EXECUTE privilege */
  17374.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17375.             ) = 1     /* final magic...compare Grants    */
  17376.         )
  17377.     UNION ALL
  17378.     SELECT           /* return value row*/
  17379.         PROCEDURE_CATALOG     = db_name(),
  17380.         PROCEDURE_SCHEMA     = user_name(),
  17381.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17382.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17383.         ORDINAL_POSITION     = convert(smallint,0),
  17384.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17385.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17386.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17387.         IS_NULLABLE        = convert(bit,0),
  17388.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17389.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17390.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17391.         NUMERIC_PRECISION    = convert(smallint,null),
  17392.         NUMERIC_SCALE        = convert(smallint,null),
  17393.         DESCRIPTION        = convert(varchar(1),null)
  17394.     from
  17395.         syscomments c,
  17396.         sysobjects o,
  17397.         sysusers u
  17398.     where
  17399.         o.name = @procedure_name
  17400.     and    o.type = 'P'                        /* Just Procedures */
  17401.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17402.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17403.     and    c.id = o.id
  17404.     and     c.colid = 1
  17405.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17406.     and     (    suser_id() = 1     /* User is the System Administrator */
  17407.         or     o.uid = user_id()    /* User created the object */
  17408.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17409.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17410.              from sysprotects p
  17411.              where p.id = o.id
  17412.                  /*  get rows for public,current user,user's group */
  17413.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17414.                  /* check for SELECT,EXECUTE privilege */
  17415.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17416.             ) = 1     /* final magic...compare Grants    */
  17417.         )
  17418.     order by 2, 3, 5
  17419.     END
  17420. ELSE
  17421.     BEGIN
  17422.     select
  17423.         PROCEDURE_CATALOG     = db_name(),
  17424.         PROCEDURE_SCHEMA     = user_name(),
  17425.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17426.         PARAMETER_NAME         = c.name,
  17427.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17428.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  17429.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17430.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17431.         IS_NULLABLE        = convert(bit,c.status&8),
  17432.         DATA_TYPE        = d.oledb_data_type,
  17433.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17434.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17435.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17436.                         then coalesce(d.column_size,c.length)
  17437.                         else null 
  17438.                         end),
  17439.         CHARACTER_OCTET_LENGTH    = convert(int,
  17440.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17441.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17442.                         then coalesce(d.column_size,c.length)
  17443.                         else null 
  17444.                         end),
  17445.         NUMERIC_PRECISION    = convert(smallint,
  17446.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17447.         NUMERIC_SCALE        = convert(smallint, 
  17448.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17449.         DESCRIPTION        = convert(varchar(1),null)
  17450.     
  17451.     from
  17452.         syscolumns c,
  17453.         sysobjects o,
  17454.         master.dbo.spt_provider_types d,
  17455.         systypes t,
  17456.         sysusers u
  17457.     where
  17458.         o.type = 'P'                            /* Just Procedures */
  17459.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17460.     and    o.id = c.id
  17461.     and    c.type = d.ss_dtype
  17462.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17463.     and    c.usertype = t.usertype
  17464.     and    (@parameter_name is null or @parameter_name = c.name)
  17465.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17466.     and     (    suser_id() = 1     /* User is the System Administrator */
  17467.         or     o.uid = user_id()    /* User created the object */
  17468.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17469.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17470.              from sysprotects p
  17471.              where p.id = o.id
  17472.                  /*  get rows for public,current user,user's group */
  17473.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17474.                  /* check for SELECT,EXECUTE privilege */
  17475.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17476.             ) = 1     /* final magic...compare Grants    */
  17477.         )
  17478.     UNION ALL
  17479.     SELECT           /* return value row*/
  17480.         PROCEDURE_CATALOG     = db_name(),
  17481.         PROCEDURE_SCHEMA     = user_name(),
  17482.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17483.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17484.         ORDINAL_POSITION     = convert(smallint,0),
  17485.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17486.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17487.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17488.         IS_NULLABLE        = convert(bit,0),
  17489.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17490.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17491.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17492.         NUMERIC_PRECISION    = convert(smallint,null),
  17493.         NUMERIC_SCALE        = convert(smallint,null),
  17494.         DESCRIPTION        = convert(varchar(1),null)
  17495.     from
  17496.         syscomments c,
  17497.         sysobjects o,
  17498.         sysusers u
  17499.     where
  17500.         o.type = 'P'                        /* Just Procedures */
  17501.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17502.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17503.     and    c.id = o.id
  17504.     and     c.colid = 1
  17505.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17506.     and     (    suser_id() = 1     /* User is the System Administrator */
  17507.         or     o.uid = user_id()    /* User created the object */
  17508.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17509.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17510.              from sysprotects p
  17511.              where p.id = o.id
  17512.                  /*  get rows for public,current user,user's group */
  17513.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17514.                  /* check for SELECT,EXECUTE privilege */
  17515.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17516.             ) = 1     /* final magic...compare Grants    */
  17517.         )
  17518.     order by 2, 3, 5
  17519.     END
  17520. go
  17521. create procedure sp_procedure_params_rowset;2
  17522.     (
  17523.       @handle            int output,
  17524.        @scrollopt        int output,
  17525.     @ccopt            int output,
  17526.     @rows            int output,
  17527.        @procedure_name        varchar(255) = null,
  17528.     @group_number        int = null,
  17529.     @procedure_schema     varchar(255) = null,
  17530.     @parameter_name        varchar(255) = null
  17531.     )
  17532. as
  17533.     declare @ret int
  17534.  
  17535.  
  17536.     create table #spprocparamrowset1
  17537.         (
  17538.         PROCEDURE_CATALOG     sysname not null,
  17539.         PROCEDURE_SCHEMA     sysname not null,
  17540.         PROCEDURE_NAME         varchar(35) not null,
  17541.         PARAMETER_NAME         sysname not null,
  17542.         ORDINAL_POSITION     smallint not null,
  17543.         PARAMETER_TYPE         smallint null,
  17544.         PARAMETER_HASDEFAULT    tinyint null,
  17545.         PARAMETER_DEFAULT    varchar(255) null,
  17546.         IS_NULLABLE        bit not null,
  17547.         DATA_TYPE        smallint null,
  17548.         CHARACTER_MAXIMUM_LENGTH int null,
  17549.         CHARACTER_OCTET_LENGTH    int null,
  17550.         NUMERIC_PRECISION    smallint null,
  17551.         NUMERIC_SCALE        smallint null,
  17552.         DESCRIPTION        varchar(1) null
  17553.         )
  17554.  
  17555. IF @procedure_name is not null
  17556.     BEGIN
  17557.     insert into #spprocparamrowset1
  17558.     select
  17559.         PROCEDURE_CATALOG     = db_name(),
  17560.         PROCEDURE_SCHEMA     = user_name(),
  17561.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17562.         PARAMETER_NAME         = c.name,
  17563.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17564.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  17565.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17566.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17567.         IS_NULLABLE        = convert(bit,c.status&8),
  17568.         DATA_TYPE        = d.oledb_data_type,
  17569.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17570.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17571.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17572.                         then coalesce(d.column_size,c.length)
  17573.                         else null 
  17574.                         end),
  17575.         CHARACTER_OCTET_LENGTH    = convert(int,
  17576.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17577.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17578.                         then coalesce(d.column_size,c.length)
  17579.                         else null 
  17580.                         end),
  17581.         NUMERIC_PRECISION    = convert(smallint,
  17582.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17583.         NUMERIC_SCALE        = convert(smallint, 
  17584.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17585.         DESCRIPTION        = convert(varchar(1),null)
  17586.     
  17587.     from
  17588.         syscolumns c,
  17589.         sysobjects o,
  17590.         master.dbo.spt_provider_types d,
  17591.         systypes t,
  17592.         sysusers u
  17593.     where
  17594.         o.name = @procedure_name
  17595.     and    o.type = 'P'                            /* Just Procedures */
  17596.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17597.     and    o.id = c.id
  17598.     and    c.number = @group_number
  17599.     and    c.type = d.ss_dtype
  17600.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17601.     and    c.usertype = t.usertype
  17602.     and    (@parameter_name is null or @parameter_name = c.name)
  17603.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17604.     and     (    suser_id() = 1     /* User is the System Administrator */
  17605.         or     o.uid = user_id()    /* User created the object */
  17606.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17607.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17608.              from sysprotects p
  17609.              where p.id = o.id
  17610.                  /*  get rows for public,current user,user's group */
  17611.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17612.                  /* check for SELECT,EXECUTE privilege */
  17613.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17614.             ) = 1     /* final magic...compare Grants    */
  17615.         )
  17616.     UNION ALL
  17617.     SELECT           /* return value row*/
  17618.         PROCEDURE_CATALOG     = db_name(),
  17619.         PROCEDURE_SCHEMA     = user_name(),
  17620.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17621.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17622.         ORDINAL_POSITION     = convert(smallint,0),
  17623.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17624.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17625.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17626.         IS_NULLABLE        = convert(bit,0),
  17627.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17628.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17629.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17630.         NUMERIC_PRECISION    = convert(smallint,null),
  17631.         NUMERIC_SCALE        = convert(smallint,null),
  17632.         DESCRIPTION        = convert(varchar(1),null)
  17633.     from
  17634.         syscomments c,
  17635.         sysobjects o,
  17636.         sysusers u
  17637.     where
  17638.         o.name = @procedure_name
  17639.     and    o.type = 'P'                        /* Just Procedures */
  17640.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17641.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17642.     and    c.id = o.id
  17643.     and     c.colid = 1
  17644.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17645.     and     (    suser_id() = 1     /* User is the System Administrator */
  17646.         or     o.uid = user_id()    /* User created the object */
  17647.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17648.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17649.              from sysprotects p
  17650.              where p.id = o.id
  17651.                  /*  get rows for public,current user,user's group */
  17652.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17653.                  /* check for SELECT,EXECUTE privilege */
  17654.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17655.             ) = 1     /* final magic...compare Grants    */
  17656.         )
  17657.     order by 2, 3, 5
  17658.     END
  17659. ELSE
  17660.     BEGIN
  17661.     insert into #spprocparamrowset1
  17662.     select
  17663.         PROCEDURE_CATALOG     = db_name(),
  17664.         PROCEDURE_SCHEMA     = user_name(),
  17665.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17666.         PARAMETER_NAME         = c.name,
  17667.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17668.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  17669.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17670.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17671.         IS_NULLABLE        = convert(bit,c.status&8),
  17672.         DATA_TYPE        = d.oledb_data_type,
  17673.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17674.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17675.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17676.                         then coalesce(d.column_size,c.length)
  17677.                         else null 
  17678.                         end),
  17679.         CHARACTER_OCTET_LENGTH    = convert(int,
  17680.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17681.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17682.                         then coalesce(d.column_size,c.length)
  17683.                         else null 
  17684.                         end),
  17685.         NUMERIC_PRECISION    = convert(smallint,
  17686.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17687.         NUMERIC_SCALE        = convert(smallint, 
  17688.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17689.         DESCRIPTION        = convert(varchar(1),null)
  17690.     
  17691.     from
  17692.         syscolumns c,
  17693.         sysobjects o,
  17694.         master.dbo.spt_provider_types d,
  17695.         systypes t,
  17696.         sysusers u
  17697.     where
  17698.         o.type = 'P'                            /* Just Procedures */
  17699.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17700.     and    o.id = c.id
  17701.     and    c.type = d.ss_dtype
  17702.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17703.     and    c.usertype = t.usertype
  17704.     and    (@parameter_name is null or @parameter_name = c.name)
  17705.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17706.     and     (    suser_id() = 1     /* User is the System Administrator */
  17707.         or     o.uid = user_id()    /* User created the object */
  17708.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17709.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17710.              from sysprotects p
  17711.              where p.id = o.id
  17712.                  /*  get rows for public,current user,user's group */
  17713.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17714.                  /* check for SELECT,EXECUTE privilege */
  17715.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17716.             ) = 1     /* final magic...compare Grants    */
  17717.         )
  17718.     UNION ALL
  17719.     SELECT           /* return value row*/
  17720.         PROCEDURE_CATALOG     = db_name(),
  17721.         PROCEDURE_SCHEMA     = user_name(),
  17722.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  17723.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17724.         ORDINAL_POSITION     = convert(smallint,0),
  17725.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17726.         PARAMETER_HASDEFAULT    = convert(tinyint,null),
  17727.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  17728.         IS_NULLABLE        = convert(bit,0),
  17729.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17730.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17731.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17732.         NUMERIC_PRECISION    = convert(smallint,null),
  17733.         NUMERIC_SCALE        = convert(smallint,null),
  17734.         DESCRIPTION        = convert(varchar(1),null)
  17735.     from
  17736.         syscomments c,
  17737.         sysobjects o,
  17738.         sysusers u
  17739.     where
  17740.         o.type = 'P'                        /* Just Procedures */
  17741.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17742.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17743.     and    c.id = o.id
  17744.     and     c.colid = 1
  17745.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  17746.     and     (    suser_id() = 1     /* User is the System Administrator */
  17747.         or     o.uid = user_id()    /* User created the object */
  17748.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  17749.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  17750.              from sysprotects p
  17751.              where p.id = o.id
  17752.                  /*  get rows for public,current user,user's group */
  17753.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  17754.                  /* check for SELECT,EXECUTE privilege */
  17755.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  17756.             ) = 1     /* final magic...compare Grants    */
  17757.         )
  17758.     order by 2, 3, 5
  17759.     END
  17760.  
  17761.     exec @ret = sp_cursoropen @handle output, 'select * from #spprocparamrowset1',
  17762.         @scrollopt output, @ccopt output, @rows output
  17763.  
  17764.     drop table #spprocparamrowset1
  17765.        return isnull(@ret,0)
  17766. go
  17767.  
  17768.  
  17769.  
  17770. if (charindex('7.00', @@version) > 0)
  17771.     drop procedure sp_procedure_params_rowset
  17772. else
  17773. begin
  17774.     print ''
  17775.     print ''
  17776.     print 'Warning:'
  17777.     print 'you are installing the stored procedures '
  17778.     print 'on a pre 7.0 SQL Server.'
  17779.     print 'Ignore the following errors.'
  17780. end
  17781. go
  17782.  
  17783. /*    Procedure for 7.0 servers */
  17784. create procedure sp_procedure_params_rowset
  17785.     (
  17786.        @procedure_name        sysname,
  17787.     @group_number        int = 1,
  17788.     @procedure_schema     sysname = null,
  17789.     @parameter_name        sysname = null
  17790.     )
  17791. as
  17792.     select
  17793.         PROCEDURE_CATALOG     = db_name(),
  17794.         PROCEDURE_SCHEMA     = user_name(),
  17795.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  17796.         PARAMETER_NAME         = c.name,
  17797.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17798.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  17799.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17800.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  17801.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  17802.         DATA_TYPE        = d.oledb_data_type,
  17803.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17804.                         case 
  17805.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17806.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17807.                         then coalesce(d.column_size,c.length)
  17808.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17809.                         then coalesce(d.column_size,c.length/2)
  17810.                         else null 
  17811.                         end),
  17812.         CHARACTER_OCTET_LENGTH    = convert(int,
  17813.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17814.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17815.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17816.                         then coalesce(d.column_size,c.length)
  17817.                         else null 
  17818.                         end),
  17819.         NUMERIC_PRECISION    = convert(smallint,
  17820.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17821.         NUMERIC_SCALE        = convert(smallint, 
  17822.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17823.         DESCRIPTION        = convert(nvarchar(1),null)
  17824.     
  17825.     from
  17826.         sysobjects o,
  17827.         syscolumns c,
  17828.         master.dbo.spt_provider_types d,
  17829.         systypes t
  17830.     where
  17831.         o.name = @procedure_name
  17832.     and    o.type = 'P'                            /* Just Procedures */
  17833.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17834.     and    o.id = c.id
  17835.     and    c.number = @group_number
  17836.     and    c.xtype = d.ss_dtype
  17837.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17838.     and    c.xusertype = t.xusertype
  17839.     and    (@parameter_name is null or @parameter_name = c.name)
  17840.     and     permissions(o.id) <> 0
  17841.     UNION ALL
  17842.     SELECT           /* return value row*/
  17843.         PROCEDURE_CATALOG     = db_name(),
  17844.         PROCEDURE_SCHEMA     = user_name(),
  17845.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  17846.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17847.         ORDINAL_POSITION     = convert(smallint,0),
  17848.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17849.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17850.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  17851.         IS_NULLABLE        = convert(bit,0),
  17852.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17853.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17854.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17855.         NUMERIC_PRECISION    = convert(smallint,null),
  17856.         NUMERIC_SCALE        = convert(smallint,null),
  17857.         DESCRIPTION        = convert(nvarchar(1),null)
  17858.     from
  17859.         sysobjects o,
  17860.         syscomments c
  17861.     where
  17862.         o.name = @procedure_name
  17863.     and    o.id = c.id 
  17864.     and    c.colid = 1
  17865.     and    o.type = 'P'                        /* Just Procedures */
  17866.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17867.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17868.     and    permissions(o.id) <> 1
  17869.     order by 2, 3, 5
  17870. go
  17871. create procedure sp_procedure_params_rowset;2
  17872.     (
  17873.     @procedure_schema     sysname = null,
  17874.     @parameter_name        sysname = null
  17875.     )
  17876. as
  17877.     select
  17878.         PROCEDURE_CATALOG     = db_name(),
  17879.         PROCEDURE_SCHEMA     = user_name(),
  17880.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  17881.         PARAMETER_NAME         = c.name,
  17882.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17883.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  17884.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17885.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  17886.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  17887.         DATA_TYPE        = d.oledb_data_type,
  17888.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17889.                         case 
  17890.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17891.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17892.                         then coalesce(d.column_size,c.length)
  17893.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17894.                         then coalesce(d.column_size,c.length/2)
  17895.                         else null 
  17896.                         end),
  17897.         CHARACTER_OCTET_LENGTH    = convert(int,
  17898.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17899.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17900.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17901.                         then coalesce(d.column_size,c.length)
  17902.                         else null 
  17903.                         end),
  17904.         NUMERIC_PRECISION    = convert(smallint,
  17905.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17906.         NUMERIC_SCALE        = convert(smallint, 
  17907.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17908.         DESCRIPTION        = convert(nvarchar(1),null)
  17909.     
  17910.     from
  17911.         sysobjects o,
  17912.         syscolumns c,
  17913.         master.dbo.spt_provider_types d,
  17914.         systypes t
  17915.     where
  17916.         o.type = 'P'                            /* Just Procedures */
  17917.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17918.     and    o.id = c.id
  17919.     and    c.xtype = d.ss_dtype
  17920.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  17921.     and    c.xusertype = t.xusertype
  17922.     and    (@parameter_name is null or @parameter_name = c.name)
  17923.     and     permissions(o.id) <> 0
  17924.     UNION ALL
  17925.     SELECT           /* return value row*/
  17926.         PROCEDURE_CATALOG     = db_name(),
  17927.         PROCEDURE_SCHEMA     = user_name(),
  17928.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  17929.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  17930.         ORDINAL_POSITION     = convert(smallint,0),
  17931.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  17932.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17933.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  17934.         IS_NULLABLE        = convert(bit,0),
  17935.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  17936.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  17937.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  17938.         NUMERIC_PRECISION    = convert(smallint,null),
  17939.         NUMERIC_SCALE        = convert(smallint,null),
  17940.         DESCRIPTION        = convert(nvarchar(1),null)
  17941.     from
  17942.         sysobjects o,
  17943.         syscomments c
  17944.     where
  17945.         o.type = 'P'        /* Just Procedures */
  17946.     and    o.id = c.id 
  17947.     and    c.colid = 1
  17948.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  17949.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  17950.     and    permissions(o.id) <> 1
  17951.     order by 2, 3, 5
  17952. go
  17953. create procedure sp_procedure_params_rowset;3
  17954.     (
  17955.        @procedure_name        sysname = null,
  17956.     @group_number        int = null,
  17957.     @procedure_schema     sysname = null,
  17958.     @parameter_name        sysname = null
  17959.     )
  17960. as
  17961. IF @procedure_name is not null 
  17962.     BEGIN
  17963.     select
  17964.         PROCEDURE_CATALOG     = db_name(),
  17965.         PROCEDURE_SCHEMA     = user_name(),
  17966.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  17967.         PARAMETER_NAME         = c.name,
  17968.         ORDINAL_POSITION     = convert(smallint,c.colid),
  17969.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  17970.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  17971.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  17972.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  17973.         DATA_TYPE        = d.oledb_data_type,
  17974.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  17975.                         case 
  17976.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17977.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17978.                         then coalesce(d.column_size,c.length)
  17979.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17980.                         then coalesce(d.column_size,c.length/2)
  17981.                         else null 
  17982.                         end),
  17983.         CHARACTER_OCTET_LENGTH    = convert(int,
  17984.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  17985.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  17986.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  17987.                         then coalesce(d.column_size,c.length*2)
  17988.                         else null 
  17989.                         end),
  17990.         NUMERIC_PRECISION    = convert(smallint,
  17991.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  17992.         NUMERIC_SCALE        = convert(smallint, 
  17993.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  17994.         DESCRIPTION        = convert(nvarchar(1),null)
  17995.     
  17996.     from
  17997.         sysobjects o,
  17998.         syscolumns c,
  17999.         master.dbo.spt_provider_types d,
  18000.         systypes t
  18001.     where
  18002.         o.name = @procedure_name
  18003.     and    o.type = 'P'                            /* Just Procedures */
  18004.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18005.     and    o.id = c.id
  18006.     and    c.number = @group_number
  18007.     and    c.xtype = d.ss_dtype
  18008.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  18009.     and    c.xusertype = t.xusertype
  18010.     and    (@parameter_name is null or @parameter_name = c.name)
  18011.     and     permissions(o.id) <> 0
  18012.     UNION ALL
  18013.     SELECT           /* return value row*/
  18014.         PROCEDURE_CATALOG     = db_name(),
  18015.         PROCEDURE_SCHEMA     = user_name(),
  18016.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  18017.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  18018.         ORDINAL_POSITION     = convert(smallint,0),
  18019.         PARAMETER_TYPE         = convert(smallint,4 /*DBPARAMTYPE_RETURNVALUE*/),
  18020.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  18021.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  18022.         IS_NULLABLE        = convert(bit,0),
  18023.         DATA_TYPE        = convert(smallint,3 /*DBTYPE_I4*/),
  18024.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  18025.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  18026.         NUMERIC_PRECISION    = convert(smallint,null),
  18027.         NUMERIC_SCALE        = convert(smallint,null),
  18028.         DESCRIPTION        = convert(nvarchar(1),null)
  18029.     from
  18030.         sysobjects o,
  18031.         syscomments c
  18032.     where
  18033.         o.name = @procedure_name
  18034.     and    o.type = 'P'        /* Just Procedures */
  18035.     and    o.id = c.id 
  18036.     and    c.colid = 1
  18037.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18038.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  18039.     and    permissions(o.id) <> 1
  18040.     END
  18041. ELSE
  18042.     BEGIN
  18043.     select
  18044.         PROCEDURE_CATALOG     = db_name(),
  18045.         PROCEDURE_SCHEMA     = user_name(),
  18046.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  18047.         PARAMETER_NAME         = c.name,
  18048.         ORDINAL_POSITION     = convert(smallint,c.colid),
  18049.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  18050.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  18051.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  18052.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  18053.         DATA_TYPE        = d.oledb_data_type,
  18054.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  18055.                         case 
  18056.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  18057.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  18058.                         then coalesce(d.column_size,c.length)
  18059.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  18060.                         then coalesce(d.column_size,c.length/2)
  18061.                         else null 
  18062.                         end),
  18063.         CHARACTER_OCTET_LENGTH    = convert(int,
  18064.                         case 
  18065.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  18066.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  18067.                             or d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  18068.                         then coalesce(d.column_size,c.length)
  18069.                         else null 
  18070.                         end),
  18071.         NUMERIC_PRECISION    = convert(smallint,
  18072.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec else null end),
  18073.         NUMERIC_SCALE        = convert(smallint, 
  18074.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  18075.         DESCRIPTION        = convert(nvarchar(1),null)
  18076.     
  18077.     from
  18078.         sysobjects o,
  18079.         syscolumns c,
  18080.         master.dbo.spt_provider_types d,
  18081.         systypes t
  18082.     where
  18083.         o.type = 'P'        /* Just Procedures */
  18084.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18085.     and    o.id = c.id
  18086.     and    c.xtype = d.ss_dtype
  18087.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  18088.     and    c.xusertype = t.xusertype
  18089.     and    (@parameter_name is null or @parameter_name = c.name)
  18090.     and     permissions(o.id) <> 0
  18091.     UNION ALL
  18092.     SELECT           /* return value row*/
  18093.         PROCEDURE_CATALOG     = db_name(),
  18094.         PROCEDURE_SCHEMA     = user_name(),
  18095.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  18096.         PARAMETER_NAME         = convert(sysname,'RETURN_VALUE'),
  18097.         ORDINAL_POSITION     = convert(smallint,0),
  18098.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  18099.         PARAMETER_HASDEFAULT    = convert(tinyint, null),
  18100.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  18101.         IS_NULLABLE        = convert(bit,0),
  18102.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  18103.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  18104.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  18105.         NUMERIC_PRECISION    = convert(smallint,null),
  18106.         NUMERIC_SCALE        = convert(smallint,null),
  18107.         DESCRIPTION        = convert(nvarchar(1),null)
  18108.     from
  18109.         sysobjects o,
  18110.         syscomments c
  18111.     where
  18112.         o.type = 'P'        /* Just Procedures */
  18113.     and    o.id = c.id 
  18114.     and    c.colid = 1
  18115.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18116.     and    (@parameter_name is null or @parameter_name = 'RETURN_VALUE')
  18117.     and    permissions(o.id) <> 1
  18118.     END
  18119. go
  18120.  
  18121.  
  18122. create procedure sp_procedure_params_rowset;4
  18123.     (
  18124.        @handle        int output,
  18125.        @scrollopt    int output,
  18126.     @ccopt        int output,
  18127.     @rows        int output,
  18128.     @cmd        nvarchar(1200)
  18129.     )
  18130. as
  18131.     declare @ret int
  18132.     declare @database_name sysname
  18133.     declare @SQL nvarchar(1500)
  18134.  
  18135.     create table #spsprocparamrowset
  18136.         (
  18137.         PROCEDURE_CATALOG     sysname not null,
  18138.         PROCEDURE_SCHEMA     sysname not null,
  18139.         PROCEDURE_NAME         nvarchar(134) not null,
  18140.         PARAMETER_NAME         sysname not null,
  18141.         ORDINAL_POSITION     smallint not null,
  18142.         PARAMETER_TYPE         smallint null,
  18143.         PARAMETER_HASDEFAULT    tinyint null,
  18144.         PARAMETER_DEFAULT    nvarchar(255) null,
  18145.         IS_NULLABLE        bit not null,
  18146.         DATA_TYPE        smallint null,
  18147.         CHARACTER_MAXIMUM_LENGTH int null,
  18148.         CHARACTER_OCTET_LENGTH    int null,
  18149.         NUMERIC_PRECISION    smallint null,
  18150.         NUMERIC_SCALE        smallint null,
  18151.         DESCRIPTION        nvarchar(1) null
  18152.         )
  18153.  
  18154.     declare sysdatabases_cursor insensitive cursor for 
  18155.         select name from master.dbo.sysdatabases
  18156.   
  18157.     set nocount on
  18158.     open sysdatabases_cursor
  18159.       fetch next from sysdatabases_cursor into @database_name 
  18160.     while @@fetch_status = 0
  18161.         begin
  18162.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spsprocparamrowset '+@cmd
  18163.         exec(@SQL)
  18164.         fetch next from sysdatabases_cursor into @database_name 
  18165.         end
  18166.       close sysdatabases_cursor
  18167.     deallocate sysdatabases_cursor
  18168.  
  18169.     if @scrollopt is null
  18170.         begin
  18171.         select * from #spsprocparamrowset order by 1,2,3
  18172.         end
  18173.     else
  18174.         begin
  18175.         exec @ret = sp_cursoropen @handle output,
  18176.             'select * from #spsprocparamrowset order by 1,2,3,5',
  18177.                 @scrollopt output, @ccopt output, @rows output
  18178.         end
  18179.     drop table #spsprocparamrowset
  18180.     return isnull(@ret,0)
  18181. go
  18182.  
  18183.  
  18184. grant execute on sp_procedure_params_rowset to public
  18185. go
  18186.  
  18187. dump tran master with no_log
  18188. go
  18189.  
  18190. print ''
  18191. print 'creating sp_procedures_rowset'
  18192. go
  18193.  
  18194.  
  18195. /* pre 7.00 version */
  18196. create procedure sp_procedures_rowset
  18197.     (
  18198.     @procedure_name        varchar(255), 
  18199.     @group_number        int = 1,
  18200.     @procedure_schema    varchar(255) = null
  18201.     )        
  18202. as
  18203.     select
  18204.         PROCEDURE_CATALOG    = db_name(),
  18205.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18206.         PROCEDURE_NAME        = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
  18207.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18208.         PROCEDURE_DEFINITION    = convert(varchar(1),null),
  18209.         DESCRIPTION        = convert(varchar(1),null)
  18210.     from     
  18211.         sysobjects o, 
  18212.         syscomments p,
  18213.         sysusers u
  18214.     where
  18215.             o.name = @procedure_name
  18216.         and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18217.     and     o.type = 'P'        /* Object type of Procedure */
  18218.     and     p.colid = 1
  18219.     and     p.id = o.id
  18220.     and    p.number = @group_number
  18221.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  18222.     and     (    suser_id() = 1     /* User is the System Administrator */
  18223.         or     o.uid = user_id()    /* User created the object */
  18224.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18225.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18226.              from sysprotects p
  18227.              where p.id = o.id
  18228.                  /*  get rows for public,current user,user's group */
  18229.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18230.                  /* check for SELECT,EXECUTE privilege */
  18231.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  18232.             ) = 1     /* final magic...compare Grants    */
  18233.         )
  18234.     order by 2, 3
  18235. go
  18236. create procedure sp_procedures_rowset;2
  18237.     (
  18238.     @procedure_schema    varchar(255) = null
  18239.     )        
  18240. as
  18241.     select
  18242.         PROCEDURE_CATALOG    = db_name(),
  18243.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18244.         PROCEDURE_NAME        = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
  18245.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18246.         PROCEDURE_DEFINITION    = convert(varchar(1),null),
  18247.         DESCRIPTION        = convert(varchar(1),null)
  18248.     from     
  18249.         sysobjects o, 
  18250.         syscomments p,
  18251.         sysusers u
  18252.     where
  18253.             (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18254.     and     o.type = 'P'        /* Object type of Procedure */
  18255.     and     p.colid = 1
  18256.     and     p.id = o.id
  18257.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  18258.     and     (    suser_id() = 1     /* User is the System Administrator */
  18259.         or     o.uid = user_id()    /* User created the object */
  18260.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18261.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18262.              from sysprotects p
  18263.              where p.id = o.id
  18264.                  /*  get rows for public,current user,user's group */
  18265.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18266.                  /* check for SELECT,EXECUTE privilege */
  18267.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  18268.             ) = 1     /* final magic...compare Grants    */
  18269.         )
  18270.     order by 2, 3
  18271. go
  18272.  
  18273. if (charindex('7.00', @@version) > 0)
  18274.     drop procedure sp_procedures_rowset
  18275. else
  18276. begin
  18277.     print ''
  18278.     print ''
  18279.     print 'Warning:'
  18280.     print 'you are installing the stored procedures '
  18281.     print 'on a pre 7.0 SQL Server.'
  18282.     print 'Ignore the following errors.'
  18283. end
  18284. go
  18285.  
  18286. /* 7.00 version */
  18287. create procedure sp_procedures_rowset
  18288.     (
  18289.     @procedure_name        sysname, 
  18290.     @group_number        int = 1,
  18291.     @procedure_schema    sysname = null
  18292.     )        
  18293. as
  18294.     select
  18295.         PROCEDURE_CATALOG    = db_name(),
  18296.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18297.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  18298.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18299.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  18300.         DESCRIPTION        = convert(nvarchar(1),null)
  18301.     from     
  18302.         sysobjects o, 
  18303.         syscomments p
  18304.     where
  18305.         permissions(o.id) <> 0
  18306.     and    o.name = @procedure_name
  18307.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18308.     and     o.type = 'P'        /* Object type of Procedure */
  18309.     and     p.colid = 1
  18310.     and     p.id = o.id
  18311.     and    p.number = @group_number
  18312.     order by 2, 3
  18313. go
  18314. create procedure sp_procedures_rowset;2
  18315.     (
  18316.     @procedure_schema    sysname = null
  18317.     )        
  18318. as
  18319.     select
  18320.         PROCEDURE_CATALOG    = db_name(),
  18321.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18322.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  18323.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18324.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  18325.         DESCRIPTION        = convert(nvarchar(1),null)
  18326.     from     sysobjects o, syscomments p
  18327.     where
  18328.         permissions(o.id) <> 0
  18329.     and        (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18330.     and     o.type = 'P'        /* Object type of Procedure */
  18331.     and p.colid = 1
  18332.     and p.id = o.id
  18333.     order by 2, 3
  18334. go
  18335. create procedure sp_procedures_rowset;3
  18336.     (
  18337.     @procedure_name        sysname = null, 
  18338.     @group_number        int = null,
  18339.     @procedure_schema    sysname = null
  18340.     )        
  18341. as
  18342. IF @procedure_name is not null
  18343.     BEGIN
  18344.     select
  18345.         PROCEDURE_CATALOG    = db_name(),
  18346.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18347.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  18348.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18349.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  18350.         DESCRIPTION        = convert(nvarchar(1),null)
  18351.     from     
  18352.         sysobjects o, 
  18353.         syscomments p
  18354.     where
  18355.         permissions(o.id) <> 0
  18356.     and    o.name = @procedure_name
  18357.      and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18358.     and     o.type = 'P'        /* Object type of Procedure */
  18359.     and     p.colid = 1
  18360.     and     p.id = o.id
  18361.     and    p.number = @group_number
  18362.     END
  18363. ELSE
  18364.     BEGIN
  18365.     select
  18366.         PROCEDURE_CATALOG    = db_name(),
  18367.         PROCEDURE_SCHEMA    = user_name(o.uid),
  18368.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  18369.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  18370.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  18371.         DESCRIPTION        = convert(nvarchar(1),null)
  18372.     from     
  18373.         sysobjects o, 
  18374.         syscomments p
  18375.     where
  18376.         permissions(o.id) <> 0
  18377.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  18378.     and    o.type = 'P'        /* Object type of Procedure */
  18379.     and     p.colid = 1
  18380.         and     p.id = o.id
  18381.     END
  18382. go
  18383.  
  18384. create procedure sp_procedures_rowset;4
  18385.     (
  18386.  
  18387.        @handle        int output,
  18388.        @scrollopt    int output,
  18389.     @ccopt        int output,
  18390.     @rows        int output,
  18391.     @cmd        nvarchar(1200)
  18392.     )
  18393. as
  18394.     declare @ret int
  18395.     declare @database_name sysname
  18396.     declare @SQL nvarchar(1500)
  18397.  
  18398.     create table #spsprocrowset
  18399.         (
  18400.         PROCEDURE_CATALOG        sysname not null,
  18401.         PROCEDURE_SCHEMA        sysname not null,
  18402.         PROCEDURE_NAME            nvarchar(134) not null,
  18403.         PROCEDURE_TYPE            smallint not null,
  18404.         PROCEDURE_DEFINITION        nvarchar(1) null,
  18405.         DESCRIPTION            nvarchar(1) null
  18406.         )
  18407.  
  18408.     declare sysdatabases_cursor insensitive cursor for 
  18409.         select name from master.dbo.sysdatabases
  18410.   
  18411.     set nocount on
  18412.     open sysdatabases_cursor
  18413.       fetch next from sysdatabases_cursor into @database_name 
  18414.     while @@fetch_status = 0
  18415.         begin
  18416.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spsprocrowset '+@cmd
  18417.         exec(@SQL)
  18418.         fetch next from sysdatabases_cursor into @database_name 
  18419.         end
  18420.       close sysdatabases_cursor
  18421.     deallocate sysdatabases_cursor
  18422.  
  18423.     if @scrollopt is null
  18424.         begin
  18425.         select * from #spsprocrowset order by 1,2,3
  18426.         end
  18427.     else
  18428.         begin
  18429.         exec @ret = sp_cursoropen @handle output,
  18430.             'select * from #spsprocrowset order by 1,2,3',
  18431.                 @scrollopt output, @ccopt output, @rows output
  18432.         end
  18433.     drop table #spsprocrowset
  18434.     return isnull(@ret,0)
  18435. go
  18436.  
  18437. grant execute on sp_procedures_rowset to public
  18438. go
  18439.  
  18440. dump tran master with no_log
  18441. go
  18442.  
  18443. print ''
  18444. print 'creating sp_schemata_rowset'
  18445. go
  18446.  
  18447. /*    6.0 and 6.5 version */
  18448. create procedure sp_schemata_rowset
  18449.     (
  18450.     @schema_name    varchar(90) = null, 
  18451.     @schema_owner    varchar(90) = null
  18452.     )        
  18453. as
  18454.     select    distinct
  18455.         CATALOG_NAME            = db_name(),
  18456.         SCHEMA_NAME            = user_name(o.uid),    
  18457.         SCHEMA_OWNER            = user_name(o.uid),    
  18458.         DEFAULT_CHARACTER_SET_CATALOG    = convert(sysname,'master'),
  18459.         DEFAULT_CHARACTER_SET_SCHEMA    = convert(sysname,'dbo'),
  18460.         DEFAULT_CHARACTER_SET_NAME    = convert(sysname,a_cha.name)
  18461.     from    
  18462.         sysobjects o,
  18463.         master.dbo.sysconfigures    cfg,
  18464.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder */
  18465.         master.dbo.syscharsets        b_cha  /* sortorder/2001, not charset */
  18466.     where   
  18467.         (@schema_name is null or @schema_name = user_name(o.uid))
  18468.     and     (@schema_owner is null or @schema_owner = user_name(o.uid))
  18469.     and    a_cha.type = 1001 /* type is charset */
  18470.     and     b_cha.type = 2001 /* type is sortorder */
  18471.     and     a_cha.id = b_cha.csid
  18472.     and     b_cha.id = cfg.value
  18473.     order by 2
  18474. go
  18475.  
  18476. if (charindex('7.00', @@version) > 0)
  18477.     drop procedure sp_schemata_rowset
  18478. else
  18479. begin
  18480.     print ''
  18481.     print ''
  18482.     print 'Warning:'
  18483.     print 'you are installing the stored procedures '
  18484.     print 'on a pre 7.0 SQL Server.'
  18485.     print 'Ignore the following errors.'
  18486. end
  18487. go
  18488.  
  18489. /* 7.00 version */
  18490. create procedure sp_schemata_rowset
  18491.     (
  18492.     @schema_name    sysname = null, 
  18493.     @schema_owner    sysname = null
  18494.     )        
  18495. as
  18496.     select    distinct
  18497.         CATALOG_NAME            = db_name(),
  18498.         SCHEMA_NAME            = user_name(o.uid),    
  18499.         SCHEMA_OWNER            = user_name(o.uid),    
  18500.         DEFAULT_CHARACTER_SET_CATALOG    = convert(sysname,N'master'),
  18501.         DEFAULT_CHARACTER_SET_SCHEMA    = convert(sysname,N'dbo'),
  18502.         DEFAULT_CHARACTER_SET_NAME    = convert(sysname,a_cha.name)
  18503.     from    
  18504.         sysobjects o,
  18505.         master.dbo.sysconfigures    cfg,
  18506.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder */
  18507.         master.dbo.syscharsets        b_cha  /* sortorder/2001, not charset */
  18508.     where   
  18509.         (@schema_name is null or @schema_name = user_name(o.uid))
  18510.     and     (@schema_owner is null or @schema_owner = user_name(o.uid))
  18511.     and    a_cha.type = 1001 /* type is charset */
  18512.     and     b_cha.type = 2001 /* type is sortorder */
  18513.     and     a_cha.id = b_cha.csid
  18514.     and     b_cha.id = cfg.value
  18515.     order by 2
  18516. go
  18517. create procedure sp_schemata_rowset;2
  18518.     (
  18519.  
  18520.        @handle        int output,
  18521.        @scrollopt    int output,
  18522.     @ccopt        int output,
  18523.     @rows        int output,
  18524.     @cmd        nvarchar(1200)
  18525.     )
  18526. as
  18527.     declare @ret int
  18528.     declare @database_name sysname
  18529.     declare @SQL nvarchar(1500)
  18530.  
  18531.     create table #spschematarowset
  18532.         (
  18533.         CATALOG_NAME            sysname not null,
  18534.         SCHEMA_NAME            sysname not null,
  18535.         SCHEMA_OWNER            sysname not null,
  18536.         DEFAULT_CHARACTER_SET_CATALOG    sysname null,
  18537.         DEFAULT_CHARACTER_SET_SCHEMA    sysname null,
  18538.         DEFAULT_CHARACTER_SET_NAME    sysname null
  18539.         )
  18540.  
  18541.     declare sysdatabases_cursor insensitive cursor for 
  18542.         select name from master.dbo.sysdatabases
  18543.   
  18544.     set nocount on
  18545.     open sysdatabases_cursor
  18546.       fetch next from sysdatabases_cursor into @database_name 
  18547.     while @@fetch_status = 0
  18548.         begin
  18549.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spschematarowset '+@cmd
  18550.         exec(@SQL)
  18551.         fetch next from sysdatabases_cursor into @database_name 
  18552.         end
  18553.       close sysdatabases_cursor
  18554.     deallocate sysdatabases_cursor
  18555.  
  18556.     if @scrollopt is null
  18557.         begin
  18558.         select * from #spschematarowset order by 1,2,3
  18559.         end
  18560.     else
  18561.         begin
  18562.         exec @ret = sp_cursoropen @handle output,
  18563.             'select * from #spschematarowset order by 1,2,3',
  18564.                 @scrollopt output, @ccopt output, @rows output
  18565.         end
  18566.     drop table #spschematarowset 
  18567.     return isnull(@ret,0)
  18568. go
  18569. grant execute on sp_schemata_rowset to public
  18570. go
  18571.  
  18572. dump tran master with no_log
  18573. go
  18574.  
  18575. print ''
  18576. print 'creating sp_statistics_rowset'
  18577. go
  18578.  
  18579.  
  18580. /*    6.0 and 6.5 version */
  18581. create procedure sp_statistics_rowset
  18582.     (
  18583.     @table_name    varchar(255),
  18584.     @table_schema    varchar(255) = null     
  18585.     )
  18586. as
  18587.     select    db_name()                as TABLE_CATALOG,        
  18588.         user_name(o.uid)            as TABLE_SCHEMA,
  18589.         o.name                    as TABLE_NAME,
  18590.         x.rows                    as CARDINALITY
  18591.     from    sysobjects o, sysindexes x, sysusers u
  18592.     where    o.type in ('U')
  18593.     and     o.name = @table_name
  18594.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18595.     and     x.id = o.id
  18596.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  18597.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  18598.     and     (
  18599.         suser_id() = 1     /* User is the System Administrator */
  18600.         or o.uid = user_id()     /* User created the object */
  18601.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18602.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18603.             from sysprotects p
  18604.             where p.id = o.id
  18605.             /* get rows for public,current user,user's group */
  18606.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18607.             /* check for SELECT,EXECUTE privilege */
  18608.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  18609.             ) = 1    /* final magic...compare Grants      */
  18610.            )
  18611.     order by 2, 3
  18612. go
  18613. create procedure sp_statistics_rowset;2
  18614.     (
  18615.     @table_schema    varchar(255) = null     
  18616.     )
  18617. as
  18618.     select    db_name()                as TABLE_CATALOG,        
  18619.         user_name(o.uid)            as TABLE_SCHEMA,
  18620.         o.name                    as TABLE_NAME,
  18621.         x.rows                    as CARDINALITY
  18622.     from    sysobjects o, sysindexes x, sysusers u
  18623.     where    o.type in ('U')
  18624.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18625.     and     x.id = o.id
  18626.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  18627.     and     (
  18628.         suser_id() = 1     /* User is the System Administrator */
  18629.         or o.uid = user_id()     /* User created the object */
  18630.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18631.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18632.             from sysprotects p
  18633.             where p.id = o.id
  18634.             /* get rows for public,current user,user's group */
  18635.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18636.             /* check for SELECT,EXECUTE privilege */
  18637.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  18638.             ) = 1    /* final magic...compare Grants      */
  18639.            )        
  18640.     order by 2, 3
  18641. go
  18642.  
  18643. if (charindex('7.00', @@version) > 0)
  18644.     drop procedure sp_statistics_rowset
  18645. else
  18646. begin
  18647.     print ''
  18648.     print ''
  18649.     print 'Warning:'
  18650.     print 'you are installing the stored procedures '
  18651.     print 'on a pre 7.0 SQL Server.'
  18652.     print 'Ignore the following errors.'
  18653. end
  18654. go
  18655.  
  18656. /*     7.0 version */
  18657. create procedure sp_statistics_rowset
  18658.     (
  18659.     @table_name    sysname,
  18660.     @table_schema    sysname = null     
  18661.     )
  18662. as
  18663.     select    db_name()                as TABLE_CATALOG,        
  18664.         user_name(o.uid)            as TABLE_SCHEMA,
  18665.         o.name                    as TABLE_NAME,
  18666.         x.rows                    as CARDINALITY
  18667.     from    sysobjects o, sysindexes x
  18668.     where    o.type in ('U')
  18669.     and     o.name = @table_name
  18670.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18671.     and     x.id = o.id
  18672.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  18673.     and     permissions(o.id) <> 0
  18674.     order by 2, 3
  18675. go
  18676. create procedure sp_statistics_rowset;2
  18677.     (
  18678.     @table_schema    sysname = null     
  18679.     )
  18680. as
  18681.     select    db_name()                as TABLE_CATALOG,        
  18682.         user_name(o.uid)            as TABLE_SCHEMA,
  18683.         o.name                    as TABLE_NAME,
  18684.         x.rows                    as CARDINALITY
  18685.     from    sysobjects o, sysindexes x
  18686.     where    o.type in ('U')
  18687.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18688.     and     x.id = o.id
  18689.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  18690.     and     permissions(o.id) <> 0
  18691.     order by 2, 3
  18692. go
  18693. create procedure sp_statistics_rowset;3
  18694.     (
  18695.     @table_name    sysname = null,
  18696.     @table_schema    sysname = null     
  18697.     )
  18698. as
  18699. IF @table_name is not null
  18700.     BEGIN
  18701.     select    db_name()                as TABLE_CATALOG,        
  18702.         user_name(o.uid)            as TABLE_SCHEMA,
  18703.         o.name                    as TABLE_NAME,
  18704.         x.rows                    as CARDINALITY
  18705.     from    sysobjects o, sysindexes x
  18706.     where    o.type in ('U')
  18707.     and     o.name = @table_name
  18708.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18709.     and     x.id = o.id
  18710.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  18711.     and     permissions(o.id) <> 0
  18712.     END
  18713. ELSE
  18714.     BEGIN
  18715.     select    db_name()                as TABLE_CATALOG,        
  18716.         user_name(o.uid)            as TABLE_SCHEMA,
  18717.         o.name                    as TABLE_NAME,
  18718.         x.rows                    as CARDINALITY
  18719.     from    sysobjects o, sysindexes x
  18720.     where    o.type in ('U')
  18721.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  18722.     and     x.id = o.id
  18723.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  18724.     and     permissions(o.id) <> 0
  18725.     END
  18726. go
  18727.  
  18728. create procedure sp_statistics_rowset;4
  18729.     (
  18730.  
  18731.        @handle        int output,
  18732.        @scrollopt    int output,
  18733.     @ccopt        int output,
  18734.     @rows        int output,
  18735.     @cmd        nvarchar(1200)
  18736.     )
  18737. as
  18738.     declare @ret int
  18739.     declare @database_name sysname
  18740.     declare @SQL nvarchar(1500)
  18741.  
  18742.     create table #spstatisticsrowset
  18743.         (
  18744.         TABLE_CATALOG            sysname not null,
  18745.         TABLE_SCHEMA            sysname not null,
  18746.         TABLE_NAME            sysname not null,
  18747.         CARDINALITY            int not null
  18748.         )
  18749.  
  18750.     declare sysdatabases_cursor insensitive cursor for 
  18751.         select name from master.dbo.sysdatabases
  18752.   
  18753.     set nocount on
  18754.     open sysdatabases_cursor
  18755.       fetch next from sysdatabases_cursor into @database_name 
  18756.     while @@fetch_status = 0
  18757.         begin
  18758.         select @SQL = N'use '+quotename(@database_name)+N' insert into #spstatisticsrowset '+@cmd
  18759.         exec(@SQL)
  18760.         fetch next from sysdatabases_cursor into @database_name 
  18761.         end
  18762.       close sysdatabases_cursor
  18763.     deallocate sysdatabases_cursor
  18764.  
  18765.     if @scrollopt is null
  18766.         begin
  18767.         select * from #spstatisticsrowset order by 1,2,3
  18768.         end
  18769.     else
  18770.         begin
  18771.         exec @ret = sp_cursoropen @handle output,
  18772.             'select * from #spstatisticsrowset order by 1,2,3',
  18773.                 @scrollopt output, @ccopt output, @rows output
  18774.         end
  18775.     drop table #spstatisticsrowset 
  18776.     return isnull(@ret,0)
  18777. go
  18778.  
  18779. grant execute on sp_statistics_rowset to public
  18780. go
  18781.  
  18782. dump tran master with no_log
  18783. go
  18784.  
  18785. print ''
  18786. print 'creating sp_tables_rowset'
  18787. go
  18788.  
  18789.  
  18790. /*    Procedure for 6.50 and earlier servers */
  18791. create procedure sp_tables_rowset
  18792.     (
  18793.     @table_name    varchar(255), 
  18794.     @table_schema    varchar(255) = null,    
  18795.     @table_type    varchar(255) = null 
  18796.     )
  18797. as
  18798.     select    TABLE_CATALOG    = db_name(),
  18799.         TABLE_SCHEMA    = user_name(o.uid),
  18800.         TABLE_NAME    = o.name,
  18801.         TABLE_TYPE    = convert(varchar(30),
  18802.                     case o.type 
  18803.                     when 'U' then 'TABLE'
  18804.                     when 'V' then 'VIEW'
  18805.                     when 'S' then 'SYSTEM TABLE'
  18806.                     end),
  18807.         TABLE_GUID    = convert(binary(16), null),
  18808.         DESCRIPTION    = convert(varchar(1), null)
  18809.     from    sysusers u, sysobjects o
  18810.     where    o.type in ('U','V','S')
  18811.     and     o.name = @table_name
  18812.     and     (    @table_schema is null
  18813.         or    @table_schema = user_name(o.uid)
  18814.         )
  18815.     and     (
  18816.             @table_type is null
  18817.         or    @table_type = case o.type 
  18818.                     when 'U' then 'TABLE'
  18819.                     when 'V' then 'VIEW'
  18820.                     when 'S' then 'SYSTEM TABLE'
  18821.                     end
  18822.         )
  18823.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  18824.     and     (
  18825.         suser_id() = 1     /* User is the System Administrator */
  18826.         or o.uid = user_id()     /* User created the object */
  18827.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18828.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18829.             from sysprotects p
  18830.             /* join to correlate with all rows in sysobjects */
  18831.             where p.id = o.id
  18832.             /* get rows for public,current user,user's group */
  18833.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18834.             /* check for SELECT,EXECUTE privilege */
  18835.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  18836.             ) = 1    /* final magic...compare Grants      */
  18837.         )        
  18838.     order by 4, 2, 3
  18839. go
  18840. create procedure sp_tables_rowset;2
  18841.     (
  18842.     @table_schema    varchar(255) = null,    
  18843.     @table_type    varchar(255) = null 
  18844.     )
  18845. as
  18846.     select    TABLE_CATALOG    = db_name(),
  18847.         TABLE_SCHEMA    = user_name(o.uid),
  18848.         TABLE_NAME    = o.name,
  18849.         TABLE_TYPE    = convert(varchar(30),
  18850.                     case o.type 
  18851.                     when 'U' then 'TABLE'
  18852.                     when 'V' then 'VIEW'
  18853.                     when 'S' then 'SYSTEM TABLE'
  18854.                     end),
  18855.         TABLE_GUID    = convert(binary(16), null),
  18856.         DESCRIPTION    = convert(varchar(1), null)
  18857.     from    sysusers u, sysobjects o
  18858.     where    o.type in ('U','V','S')
  18859.     and     (    @table_schema is null
  18860.         or    @table_schema = user_name(o.uid)
  18861.         )
  18862.     and     (
  18863.             @table_type is null
  18864.         or    @table_type = case o.type 
  18865.                     when 'U' then 'TABLE'
  18866.                     when 'V' then 'VIEW'
  18867.                     when 'S' then 'SYSTEM TABLE'
  18868.                     end
  18869.         )
  18870.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  18871.     and     (
  18872.         suser_id() = 1     /* User is the System Administrator */
  18873.         or o.uid = user_id()     /* User created the object */
  18874.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  18875.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  18876.             from sysprotects p
  18877.             /* join to correlate with all rows in sysobjects */
  18878.             where p.id = o.id
  18879.             /* get rows for public,current user,user's group */
  18880.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  18881.             /* check for SELECT,EXECUTE privilege */
  18882.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  18883.             ) = 1    /* final magic...compare Grants      */
  18884.         )        
  18885.     order by 4, 2, 3
  18886. go
  18887. go
  18888.  
  18889. if (charindex('7.00', @@version) > 0)
  18890.     drop procedure sp_tables_rowset
  18891. else
  18892. begin
  18893.     print ''
  18894.     print ''
  18895.     print 'Warning:'
  18896.     print 'you are installing the stored procedures '
  18897.     print 'on a pre 7.0 SQL Server.'
  18898.     print 'Ignore the following errors.'
  18899. end
  18900. go
  18901.  
  18902. /*    Procedure for 7.00 server */
  18903. create procedure sp_tables_rowset
  18904.     (
  18905.     @table_name    sysname, 
  18906.     @table_schema    sysname = null,    
  18907.     @table_type    nvarchar(255) = null 
  18908.     )
  18909. as
  18910.     select    TABLE_CATALOG    = db_name(),
  18911.         TABLE_SCHEMA    = user_name(o.uid),
  18912.         TABLE_NAME    = o.name,
  18913.         TABLE_TYPE    = convert(nvarchar(30),
  18914.                     case o.type 
  18915.                     when 'U' then N'TABLE'
  18916.                     when 'V' then N'VIEW'
  18917.                     when 'S' then N'SYSTEM TABLE'
  18918.                     end),
  18919.         TABLE_GUID    = convert(uniqueidentifier, null),
  18920.         DESCRIPTION    = convert(nvarchar(1), null)
  18921.     from    sysobjects o
  18922.     where    o.name = @table_name
  18923.     and     o.type in ('U','V','S')
  18924.     and    permissions(o.id) <> 0
  18925.     and     (    @table_schema is null
  18926.         or    @table_schema = user_name(o.uid)
  18927.         )
  18928.     and     (
  18929.             @table_type is null
  18930.         or    @table_type = case o.type 
  18931.                     when 'U' then N'TABLE'
  18932.                     when 'V' then N'VIEW'
  18933.                     when 'S' then N'SYSTEM TABLE'
  18934.                     end
  18935.         )    
  18936.     order by 4, 2, 3
  18937. go
  18938. create procedure sp_tables_rowset;2
  18939.     (
  18940.     @table_schema    sysname = null,    
  18941.     @table_type    nvarchar(255) = null 
  18942.     )
  18943. as
  18944.     select    TABLE_CATALOG    = db_name(),
  18945.         TABLE_SCHEMA    = user_name(o.uid),
  18946.         TABLE_NAME    = o.name,
  18947.         TABLE_TYPE    = convert(nvarchar(30),
  18948.                     case o.type 
  18949.                     when 'U' then N'TABLE'
  18950.                     when 'V' then N'VIEW'
  18951.                     when 'S' then N'SYSTEM TABLE'
  18952.                     end),
  18953.         TABLE_GUID    = convert(uniqueidentifier, null),
  18954.         DESCRIPTION    = convert(nvarchar(1), null)
  18955.     from    sysobjects o
  18956.     where    o.type in ('U','V','S')
  18957.     and    permissions(o.id) <> 0
  18958.     and     (    @table_schema is null
  18959.         or    @table_schema = user_name(o.uid)
  18960.         )
  18961.     and     (
  18962.             @table_type is null
  18963.         or    @table_type = case o.type 
  18964.                     when 'U' then N'TABLE'
  18965.                     when 'V' then N'VIEW'
  18966.                     when 'S' then N'SYSTEM TABLE'
  18967.                     end
  18968.         )    
  18969.     order by 4, 2, 3
  18970. go
  18971. create procedure sp_tables_rowset;3
  18972.     (
  18973.     @table_name    sysname = null, 
  18974.     @table_schema    sysname = null,    
  18975.     @table_type    nvarchar(255) = null 
  18976.     )
  18977. as
  18978. IF @table_name is not null
  18979.     BEGIN
  18980.     select    TABLE_CATALOG    = db_name(),
  18981.         TABLE_SCHEMA    = user_name(o.uid),
  18982.         TABLE_NAME    = o.name,
  18983.         TABLE_TYPE    = convert(nvarchar(30),
  18984.                     case o.type 
  18985.                     when 'U' then N'TABLE'
  18986.                     when 'V' then N'VIEW'
  18987.                     when 'S' then N'SYSTEM TABLE'
  18988.                     end),
  18989.         TABLE_GUID    = convert(uniqueidentifier, null),
  18990.         DESCRIPTION    = convert(nvarchar(1), null)
  18991.     from    sysobjects o
  18992.     where    o.name = @table_name
  18993.     and     o.type in ('U','V','S')
  18994.     and    permissions(o.id) <> 0
  18995.     and     (    @table_schema is null
  18996.         or    @table_schema = user_name(o.uid)
  18997.         )
  18998.     and     (
  18999.             @table_type is null
  19000.         or    @table_type = case o.type 
  19001.                     when 'U' then N'TABLE'
  19002.                     when 'V' then N'VIEW'
  19003.                     when 'S' then N'SYSTEM TABLE'
  19004.                     end
  19005.         )    
  19006.     END
  19007. ELSE
  19008.     BEGIN
  19009.     select    TABLE_CATALOG    = db_name(),
  19010.         TABLE_SCHEMA    = user_name(o.uid),
  19011.         TABLE_NAME    = o.name,
  19012.         TABLE_TYPE    = convert(nvarchar(30),
  19013.                     case o.type 
  19014.                     when 'U' then N'TABLE'
  19015.                     when 'V' then N'VIEW'
  19016.                     when 'S' then N'SYSTEM TABLE'
  19017.                     end),
  19018.         TABLE_GUID    = convert(uniqueidentifier, null),
  19019.         DESCRIPTION    = convert(nvarchar(1), null)
  19020.     from    sysobjects o
  19021.     where    o.type in ('U','V','S')
  19022.     and    permissions(o.id) <> 0
  19023.     and     (    @table_schema is null
  19024.         or    @table_schema = user_name(o.uid)
  19025.         )
  19026.     and     (
  19027.             @table_type is null
  19028.         or    @table_type = case o.type 
  19029.                     when 'U' then N'TABLE'
  19030.                     when 'V' then N'VIEW'
  19031.                     when 'S' then N'SYSTEM TABLE'
  19032.                     end
  19033.         )    
  19034.     END
  19035. go
  19036.  
  19037.  
  19038. create procedure sp_tables_rowset;4
  19039.     (
  19040.  
  19041.        @handle        int output,
  19042.        @scrollopt    int output,
  19043.     @ccopt        int output,
  19044.     @rows        int output,
  19045.     @cmd        nvarchar(1200)
  19046.     )
  19047. as
  19048.     declare @ret int
  19049.     declare @database_name sysname
  19050.     declare @SQL nvarchar(1500)
  19051.  
  19052.     create table #sptablesrowset
  19053.         (
  19054.         TABLE_CATALOG        sysname not null,
  19055.         TABLE_SCHEMA        sysname not null,
  19056.         TABLE_NAME        sysname not null,
  19057.         TABLE_TYPE        sysname not null,
  19058.         TABLE_GUID        uniqueidentifier null,
  19059.         DESCRIPTION        nvarchar(1) null
  19060.         )
  19061.  
  19062.     declare sysdatabases_cursor insensitive cursor for 
  19063.         select name from master.dbo.sysdatabases
  19064.   
  19065.     set nocount on
  19066.     open sysdatabases_cursor
  19067.       fetch next from sysdatabases_cursor into @database_name 
  19068.     while @@fetch_status = 0
  19069.         begin
  19070.         select @SQL = N'use '+quotename(@database_name)+N' insert into #sptablesrowset '+@cmd
  19071.         exec(@SQL)
  19072.         fetch next from sysdatabases_cursor into @database_name 
  19073.         end
  19074.       close sysdatabases_cursor
  19075.     deallocate sysdatabases_cursor
  19076.  
  19077.     if @scrollopt is null
  19078.         begin
  19079.         select * from #sptablesrowset order by 4,1,2,3
  19080.         end
  19081.     else
  19082.         begin
  19083.         exec @ret = sp_cursoropen @handle output,
  19084.             'select * from #sptablesrowset order by 4,1,2,3',
  19085.                 @scrollopt output, @ccopt output, @rows output
  19086.         end
  19087.     drop table #sptablesrowset
  19088.     return isnull(@ret,0)
  19089. go
  19090. create procedure sp_tables_rowset;5
  19091.     (
  19092.     @table_server        sysname,
  19093.     @table_catalog        sysname = null,
  19094.     @table_name        sysname = null,
  19095.     @table_schema        sysname = null,
  19096.     @table_type        sysname = null
  19097.     )
  19098. as
  19099.     select
  19100.         TABLE_CATALOG,
  19101.         TABLE_SCHEMA,
  19102.         TABLE_NAME,
  19103.         TABLE_TYPE,
  19104.         TABLE_GUID,
  19105.         DESCRIPTION
  19106.     from master.dbo.SYSREMOTE_TABLES <
  19107.                 @table_server,
  19108.                 @table_catalog,
  19109.                 @table_schema,
  19110.                 @table_name,
  19111.                 @table_type >
  19112.     order by 4,1,2,3
  19113. go
  19114.  
  19115. grant execute on sp_tables_rowset to public
  19116. go
  19117.  
  19118. dump tran master with no_log
  19119. go
  19120.  
  19121.  
  19122.  
  19123. print ''
  19124. print 'creating sp_table_privileges_rowset'
  19125. go
  19126.  
  19127. /*    Procedure for 6.0 and 6.5 server */
  19128. CREATE PROCEDURE sp_table_privileges_rowset
  19129.     (
  19130.     @table_name    varchar(255) = null,
  19131.     @table_schema    varchar(255) = null,
  19132.     @grantor    varchar(255) = null,
  19133.     @grantee    varchar(255) = null
  19134.     )
  19135. as
  19136. IF @table_name is not null
  19137.     BEGIN
  19138.     select
  19139.         GRANTOR        = user_name(p.grantor),
  19140.         GRANTEE        = user_name(u.uid),
  19141.         TABLE_CATALOG    = db_name(),
  19142.         TABLE_SCHEMA    = user_name(o.uid),
  19143.         TABLE_NAME    = o.name,
  19144.         PRIVILEGE_TYPE    = convert(varchar(30),
  19145.                     case p.action
  19146.                     when 193 then 'SELECT'
  19147.                     when 195 then 'INSERT'
  19148.                     when 196 then 'DELETE'
  19149.                     when 197 then 'UPDATE'
  19150.                     else 'REFERENCES'
  19151.                     end),
  19152.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19153.     from 
  19154.         sysprotects p, sysobjects o, sysusers u
  19155.     where
  19156.         o.name = @table_name
  19157.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19158.     and    (@grantee is null or @grantee = user_name(u.uid))
  19159.     and     o.type in ('U','V','S')
  19160.     and    p.id = o.id
  19161.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19162.             /* expand groups */
  19163.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  19164.     and     p.protecttype <> 206    /* only grant rows */
  19165.     and     p.action in (26,193,195,196,197)
  19166.     and     o.uid <> u.uid            /* no rows for owner */
  19167.     and     not exists (            /* exclude revoke'd privileges */
  19168.             select     *
  19169.             from     sysprotects p1
  19170.             where    p1.protecttype = 206
  19171.             and     p1.action = p.action
  19172.             and     p1.id = p.id
  19173.             and     p1.uid = u.uid)
  19174.     union all
  19175.     select    /*    Add rows for table owner */
  19176.         GRANTOR        = user_name(u.uid),
  19177.         GRANTEE        = user_name(o.uid),
  19178.         TABLE_CATALOG    = db_name(),
  19179.         TABLE_SCHEMA    = user_name(o.uid),
  19180.         TABLE_NAME    = o.name,
  19181.         PRIVILEGE_TYPE    = convert(varchar(30),
  19182.                     case v.number
  19183.                     when 193 then 'SELECT'
  19184.                     when 195 then 'INSERT'
  19185.                     when 196 then 'DELETE'
  19186.                     when 197 then 'UPDATE'
  19187.                     else 'REFERENCES'
  19188.                     end),
  19189.         IS_GRANTABLE    = convert(bit,1)    
  19190.     from 
  19191.         sysobjects o, master.dbo.spt_values v, sysusers u
  19192.     where
  19193.         o.name = @table_name
  19194.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19195.     and    (@grantee is null or @grantee = user_name(u.uid))
  19196.     and     o.type in ('U','V','S')
  19197.     and     u.suid = 1        /* grantor is dbo of database */
  19198.     and    (@grantor is null or @grantor = user_name(u.uid))
  19199.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19200.     and     v.number in (26,193,195,196,197)
  19201.     and     not exists (    /* exclude revoke'd privileges */
  19202.             select     *
  19203.             from     sysprotects p1
  19204.             where    p1.protecttype = 206
  19205.             and     p1.action = v.number
  19206.             and     p1.id = o.id
  19207.             and     p1.uid = o.uid)
  19208.     order by 4,5,6,1,2
  19209.     END
  19210. ELSE
  19211.     BEGIN
  19212.     select
  19213.         GRANTOR        = user_name(p.grantor),
  19214.         GRANTEE        = user_name(u.uid),
  19215.         TABLE_CATALOG    = db_name(),
  19216.         TABLE_SCHEMA    = user_name(o.uid),
  19217.         TABLE_NAME    = o.name,
  19218.         PRIVILEGE_TYPE    = convert(varchar(30),
  19219.                     case p.action
  19220.                     when 193 then 'SELECT'
  19221.                     when 195 then 'INSERT'
  19222.                     when 196 then 'DELETE'
  19223.                     when 197 then 'UPDATE'
  19224.                     else 'REFERENCES'
  19225.                     end),
  19226.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19227.     from 
  19228.         sysprotects p, sysobjects o, sysusers u
  19229.     where
  19230.         o.type in ('U','V','S')
  19231.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19232.     and    (@grantee is null or @grantee = user_name(u.uid))
  19233.     and    p.id = o.id
  19234.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19235.             /* expand groups */
  19236.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  19237.     and     p.protecttype <> 206    /* only grant rows */
  19238.     and     p.action in (26,193,195,196,197)
  19239.     and     o.uid <> u.uid            /* no rows for owner */
  19240.     and     not exists (            /* exclude revoke'd privileges */
  19241.             select     *
  19242.             from     sysprotects p1
  19243.             where    p1.protecttype = 206
  19244.             and     p1.action = p.action
  19245.             and     p1.id = p.id
  19246.             and     p1.uid = u.uid)
  19247.     union all
  19248.     select    /*    Add rows for table owner */
  19249.         GRANTOR        = user_name(u.uid),
  19250.         GRANTEE        = user_name(o.uid),
  19251.         TABLE_CATALOG    = db_name(),
  19252.         TABLE_SCHEMA    = user_name(o.uid),
  19253.         TABLE_NAME    = o.name,
  19254.         PRIVILEGE_TYPE    = convert(varchar(30),
  19255.                     case v.number
  19256.                     when 193 then 'SELECT'
  19257.                     when 195 then 'INSERT'
  19258.                     when 196 then 'DELETE'
  19259.                     when 197 then 'UPDATE'
  19260.                     else 'REFERENCES'
  19261.                     end),
  19262.         IS_GRANTABLE    = convert(bit,1)    
  19263.     from 
  19264.         sysobjects o, master.dbo.spt_values v, sysusers u
  19265.     where
  19266.         o.type in ('U','V','S')
  19267.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19268.     and    (@grantee is null or @grantee = user_name(u.uid))
  19269.     and     u.suid = 1        /* grantor is dbo of database */
  19270.     and    (@grantor is null or @grantor = user_name(u.uid))
  19271.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19272.     and     v.number in (26,193,195,196,197)
  19273.     and     not exists (    /* exclude revoke'd privileges */
  19274.             select     *
  19275.             from     sysprotects p1
  19276.             where    p1.protecttype = 206
  19277.             and     p1.action = v.number
  19278.             and     p1.id = o.id
  19279.             and     p1.uid = o.uid)
  19280.     order by 4,5,6,1,2
  19281.     END
  19282. go
  19283. CREATE PROCEDURE sp_table_privileges_rowset;2
  19284.     (
  19285.        @handle        int output,
  19286.        @scrollopt    int output,
  19287.     @ccopt        int output,
  19288.     @rows        int output,
  19289.     @table_name     varchar(255) = null,
  19290.     @table_schema    varchar(255) = null,
  19291.     @grantor    varchar(255) = null,
  19292.     @grantee    varchar(255) = null
  19293.     )
  19294. as
  19295. declare @ret int
  19296. create table #sptprivsrowset1
  19297.     (
  19298.     GRANTOR        sysname not null,
  19299.     GRANTEE        sysname not null,
  19300.     TABLE_CATALOG    sysname not null,
  19301.     TABLE_SCHEMA    sysname not null,
  19302.     TABLE_NAME    sysname not null,
  19303.     PRIVILEGE_TYPE    sysname not null,
  19304.     IS_GRANTABLE    bit not null
  19305.     )
  19306.     
  19307. IF @table_name is not null
  19308.     BEGIN
  19309.     insert into #sptprivsrowset1
  19310.     select
  19311.         GRANTOR        = user_name(p.grantor),
  19312.         GRANTEE        = user_name(u.uid),
  19313.         TABLE_CATALOG    = db_name(),
  19314.         TABLE_SCHEMA    = user_name(o.uid),
  19315.         TABLE_NAME    = o.name,
  19316.         PRIVILEGE_TYPE    = convert(varchar(30),
  19317.                     case p.action
  19318.                     when 193 then 'SELECT'
  19319.                     when 195 then 'INSERT'
  19320.                     when 196 then 'DELETE'
  19321.                     when 197 then 'UPDATE'
  19322.                     else 'REFERENCES'
  19323.                     end),
  19324.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19325.     from 
  19326.         sysprotects p, sysobjects o, sysusers u
  19327.     where
  19328.         o.name = @table_name
  19329.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19330.     and    (@grantee is null or @grantee = user_name(u.uid))
  19331.     and     o.type in ('U','V','S')
  19332.     and    p.id = o.id
  19333.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19334.             /* expand groups */
  19335.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  19336.     and     p.protecttype <> 206    /* only grant rows */
  19337.     and     p.action in (26,193,195,196,197)
  19338.     and     o.uid <> u.uid            /* no rows for owner */
  19339.     and     not exists (            /* exclude revoke'd privileges */
  19340.             select     *
  19341.             from     sysprotects p1
  19342.             where    p1.protecttype = 206
  19343.             and     p1.action = p.action
  19344.             and     p1.id = p.id
  19345.             and     p1.uid = u.uid)
  19346.     union all
  19347.     select    /*    Add rows for table owner */
  19348.         GRANTOR        = user_name(u.uid),
  19349.         GRANTEE        = user_name(o.uid),
  19350.         TABLE_CATALOG    = db_name(),
  19351.         TABLE_SCHEMA    = user_name(o.uid),
  19352.         TABLE_NAME    = o.name,
  19353.         PRIVILEGE_TYPE    = convert(varchar(30),
  19354.                     case v.number
  19355.                     when 193 then 'SELECT'
  19356.                     when 195 then 'INSERT'
  19357.                     when 196 then 'DELETE'
  19358.                     when 197 then 'UPDATE'
  19359.                     else 'REFERENCES'
  19360.                     end),
  19361.         IS_GRANTABLE    = convert(bit,1)    
  19362.     from 
  19363.         sysobjects o, master.dbo.spt_values v, sysusers u
  19364.     where
  19365.         o.name = @table_name
  19366.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19367.     and    (@grantee is null or @grantee = user_name(u.uid))
  19368.     and     o.type in ('U','V','S')
  19369.     and     u.suid = 1        /* grantor is dbo of database */
  19370.     and    (@grantor is null or @grantor = user_name(u.uid))
  19371.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19372.     and     v.number in (26,193,195,196,197)
  19373.     and     not exists (    /* exclude revoke'd privileges */
  19374.             select     *
  19375.             from     sysprotects p1
  19376.             where    p1.protecttype = 206
  19377.             and     p1.action = v.number
  19378.             and     p1.id = o.id
  19379.             and     p1.uid = o.uid)
  19380.     order by 4,5,6,1,2
  19381.     END
  19382. ELSE
  19383.     BEGIN
  19384.     insert into #sptprivsrowset1
  19385.     select
  19386.         GRANTOR        = user_name(p.grantor),
  19387.         GRANTEE        = user_name(u.uid),
  19388.         TABLE_CATALOG    = db_name(),
  19389.         TABLE_SCHEMA    = user_name(o.uid),
  19390.         TABLE_NAME    = o.name,
  19391.         PRIVILEGE_TYPE    = convert(varchar(30),
  19392.                     case p.action
  19393.                     when 193 then 'SELECT'
  19394.                     when 195 then 'INSERT'
  19395.                     when 196 then 'DELETE'
  19396.                     when 197 then 'UPDATE'
  19397.                     else 'REFERENCES'
  19398.                     end),
  19399.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19400.     from 
  19401.         sysprotects p, sysobjects o, sysusers u
  19402.     where
  19403.         o.type in ('U','V','S')
  19404.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19405.     and    (@grantee is null or @grantee = user_name(u.uid))
  19406.     and    p.id = o.id
  19407.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19408.             /* expand groups */
  19409.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  19410.     and     p.protecttype <> 206    /* only grant rows */
  19411.     and     p.action in (26,193,195,196,197)
  19412.     and     o.uid <> u.uid            /* no rows for owner */
  19413.     and     not exists (            /* exclude revoke'd privileges */
  19414.             select     *
  19415.             from     sysprotects p1
  19416.             where    p1.protecttype = 206
  19417.             and     p1.action = p.action
  19418.             and     p1.id = p.id
  19419.             and     p1.uid = u.uid)
  19420.     union all
  19421.     select    /*    Add rows for table owner */
  19422.         GRANTOR        = user_name(u.uid),
  19423.         GRANTEE        = user_name(o.uid),
  19424.         TABLE_CATALOG    = db_name(),
  19425.         TABLE_SCHEMA    = user_name(o.uid),
  19426.         TABLE_NAME    = o.name,
  19427.         PRIVILEGE_TYPE    = convert(varchar(30),
  19428.                     case v.number
  19429.                     when 193 then 'SELECT'
  19430.                     when 195 then 'INSERT'
  19431.                     when 196 then 'DELETE'
  19432.                     when 197 then 'UPDATE'
  19433.                     else 'REFERENCES'
  19434.                     end),
  19435.         IS_GRANTABLE    = convert(bit,1)    
  19436.     from 
  19437.         sysobjects o, master.dbo.spt_values v, sysusers u
  19438.     where
  19439.         o.type in ('U','V','S')
  19440.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19441.     and    (@grantee is null or @grantee = user_name(u.uid))
  19442.     and     u.suid = 1        /* grantor is dbo of database */
  19443.     and    (@grantor is null or @grantor = user_name(u.uid))
  19444.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19445.     and     v.number in (26,193,195,196,197)
  19446.     and     not exists (    /* exclude revoke'd privileges */
  19447.             select     *
  19448.             from     sysprotects p1
  19449.             where    p1.protecttype = 206
  19450.             and     p1.action = v.number
  19451.             and     p1.id = o.id
  19452.             and     p1.uid = o.uid)
  19453.     order by 4,5,6,1,2
  19454.     END
  19455.  
  19456. exec @ret = sp_cursoropen @handle output, 'select * from #sptprivsrowset1',
  19457.     @scrollopt output, @ccopt output, @rows output
  19458.  
  19459. drop table #sptprivsrowset1
  19460. return isnull(@ret,0)
  19461. go
  19462.  
  19463.  
  19464. if (charindex('7.00', @@version) = 0)
  19465. begin
  19466.     print ''
  19467.     print ''
  19468.     print 'Warning:'
  19469.     print 'you are installing the stored procedures '
  19470.     print 'on a pre 7.0 SQL Server.'
  19471.     print 'Ignore the following errors.'
  19472. end
  19473. else
  19474.     drop proc sp_table_privileges_rowset
  19475. go
  19476.  
  19477.  
  19478. /*    Procedure for 7.0 server */
  19479. CREATE PROCEDURE sp_table_privileges_rowset
  19480.     (
  19481.     @table_name         sysname,
  19482.     @table_schema        sysname = null,
  19483.     @grantor        sysname = null,
  19484.     @grantee        sysname = null
  19485.     )
  19486. as
  19487.     select
  19488.         GRANTOR        = user_name(p.grantor),
  19489.         GRANTEE        = user_name(u.uid),
  19490.         TABLE_CATALOG    = db_name(),
  19491.         TABLE_SCHEMA    = user_name(o.uid),
  19492.         TABLE_NAME    = o.name,
  19493.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19494.                     case p.action
  19495.                     when 193 then N'SELECT'
  19496.                     when 195 then N'INSERT'
  19497.                     when 196 then N'DELETE'
  19498.                     when 197 then N'UPDATE'
  19499.                     else N'REFERENCES'
  19500.                     end),
  19501.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19502.     from 
  19503.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  19504.     where
  19505.         o.name = @table_name
  19506.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19507.     and    (@grantee is null or @grantee = user_name(u.uid))
  19508.     and     o.type in ('U','V','S')
  19509.     and    p.id = o.id
  19510.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19511.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  19512.     and     (u.uid > 0 and u.uid < 16384)
  19513.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  19514.     and     p.protecttype <> 206    /* only grant rows */
  19515.     and     p.action in (26,193,195,196,197)
  19516.     and     o.uid <> u.uid            /* no rows for owner */
  19517.     and     not exists (            /* exclude revoke'd privileges */
  19518.             select     *
  19519.             from     sysprotects p1
  19520.             where    p1.protecttype = 206
  19521.             and     p1.action = p.action
  19522.             and     p1.id = p.id
  19523.             and     p1.uid = u.uid)
  19524.     union all
  19525.     select    /*    Add rows for table owner */
  19526.         GRANTOR        = user_name(u.uid),
  19527.         GRANTEE        = user_name(o.uid),
  19528.         TABLE_CATALOG    = db_name(),
  19529.         TABLE_SCHEMA    = user_name(o.uid),
  19530.         TABLE_NAME    = o.name,
  19531.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19532.                     case v.number
  19533.                     when 193 then N'SELECT'
  19534.                     when 195 then N'INSERT'
  19535.                     when 196 then N'DELETE'
  19536.                     when 197 then N'UPDATE'
  19537.                     else N'REFERENCES'
  19538.                     end),
  19539.         IS_GRANTABLE    = convert(bit,1)    
  19540.     from 
  19541.         sysobjects o, master.dbo.spt_values v, sysusers u
  19542.     where
  19543.         o.name = @table_name
  19544.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19545.     and    (@grantee is null or @grantee = user_name(u.uid))
  19546.     and     o.type in ('U','V','S')
  19547.     and     u.suid = 1        /* grantor is dbo of database */
  19548.     and    (@grantor is null or @grantor = user_name(u.uid))
  19549.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19550.     and     v.number in (26,193,195,196,197)
  19551.     and     not exists (    /* exclude revoke'd privileges */
  19552.             select     *
  19553.             from     sysprotects p1
  19554.             where    p1.protecttype = 206
  19555.             and     p1.action = v.number
  19556.             and     p1.id = o.id
  19557.             and     p1.uid = o.uid)
  19558.     order by 4,5,6,1,2
  19559. go
  19560. CREATE PROCEDURE sp_table_privileges_rowset;2
  19561.     (
  19562.     @table_schema        sysname = null,
  19563.     @grantor        sysname = null,
  19564.     @grantee        sysname = null
  19565.     )
  19566. as
  19567.     select
  19568.         GRANTOR        = user_name(p.grantor),
  19569.         GRANTEE        = user_name(u.uid),
  19570.         TABLE_CATALOG    = db_name(),
  19571.         TABLE_SCHEMA    = user_name(o.uid),
  19572.         TABLE_NAME    = o.name,
  19573.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19574.                     case p.action
  19575.                     when 193 then N'SELECT'
  19576.                     when 195 then N'INSERT'
  19577.                     when 196 then N'DELETE'
  19578.                     when 197 then N'UPDATE'
  19579.                     else N'REFERENCES'
  19580.                     end),
  19581.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19582.     from 
  19583.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  19584.     where
  19585.         o.type in ('U','V','S')
  19586.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19587.     and    (@grantee is null or @grantee = user_name(u.uid))
  19588.     and    p.id = o.id
  19589.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19590.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  19591.     and     (u.uid > 0 and u.uid < 16384)
  19592.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  19593.     and     p.protecttype <> 206    /* only grant rows */
  19594.     and     p.action in (26,193,195,196,197)
  19595.     and     o.uid <> u.uid            /* no rows for owner */
  19596.     and     not exists (            /* exclude revoke'd privileges */
  19597.             select     *
  19598.             from     sysprotects p1
  19599.             where    p1.protecttype = 206
  19600.             and     p1.action = p.action
  19601.             and     p1.id = p.id
  19602.             and     p1.uid = u.uid)
  19603.     union all
  19604.     select    /*    Add rows for table owner */
  19605.         GRANTOR        = user_name(u.uid),
  19606.         GRANTEE        = user_name(o.uid),
  19607.         TABLE_CATALOG    = db_name(),
  19608.         TABLE_SCHEMA    = user_name(o.uid),
  19609.         TABLE_NAME    = o.name,
  19610.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19611.                     case v.number
  19612.                     when 193 then N'SELECT'
  19613.                     when 195 then N'INSERT'
  19614.                     when 196 then N'DELETE'
  19615.                     when 197 then N'UPDATE'
  19616.                     else N'REFERENCES'
  19617.                     end),
  19618.         IS_GRANTABLE    = convert(bit,1)    
  19619.     from 
  19620.         sysobjects o, master.dbo.spt_values v, sysusers u
  19621.     where
  19622.         o.type in ('U','V','S')
  19623.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19624.     and    (@grantee is null or @grantee = user_name(u.uid))
  19625.     and     u.suid = 1        /* grantor is dbo of database */
  19626.     and    (@grantor is null or @grantor = user_name(u.uid))
  19627.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19628.     and     v.number in (26,193,195,196,197)
  19629.     and     not exists (    /* exclude revoke'd privileges */
  19630.             select     *
  19631.             from     sysprotects p1
  19632.             where    p1.protecttype = 206
  19633.             and     p1.action = v.number
  19634.             and     p1.id = o.id
  19635.             and     p1.uid = o.uid)
  19636.     order by 4,5,6,1,2
  19637. go
  19638. CREATE PROCEDURE sp_table_privileges_rowset;3
  19639.     (
  19640.     @table_name         sysname = null,
  19641.     @table_schema        sysname = null,
  19642.     @grantor        sysname = null,
  19643.     @grantee        sysname = null
  19644.     )
  19645. as
  19646. IF @table_name is not null
  19647.     BEGIN
  19648.     select
  19649.         GRANTOR        = user_name(p.grantor),
  19650.         GRANTEE        = user_name(u.uid),
  19651.         TABLE_CATALOG    = db_name(),
  19652.         TABLE_SCHEMA    = user_name(o.uid),
  19653.         TABLE_NAME    = o.name,
  19654.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19655.                     case p.action
  19656.                     when 193 then N'SELECT'
  19657.                     when 195 then N'INSERT'
  19658.                     when 196 then N'DELETE'
  19659.                     when 197 then N'UPDATE'
  19660.                     else N'REFERENCES'
  19661.                     end),
  19662.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19663.     from 
  19664.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  19665.     where
  19666.         o.name = @table_name
  19667.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19668.     and    (@grantee is null or @grantee = user_name(u.uid))
  19669.     and     o.type in ('U','V','S')
  19670.     and    p.id = o.id
  19671.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19672.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  19673.     and     (u.uid > 0 and u.uid < 16384)
  19674.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  19675.     and     p.protecttype <> 206    /* only grant rows */
  19676.     and     p.action in (26,193,195,196,197)
  19677.     and     o.uid <> u.uid            /* no rows for owner */
  19678.     and     not exists (            /* exclude revoke'd privileges */
  19679.             select     *
  19680.             from     sysprotects p1
  19681.             where    p1.protecttype = 206
  19682.             and     p1.action = p.action
  19683.             and     p1.id = p.id
  19684.             and     p1.uid = u.uid)
  19685.     union all
  19686.     select    /*    Add rows for table owner */
  19687.         GRANTOR        = user_name(u.uid),
  19688.         GRANTEE        = user_name(o.uid),
  19689.         TABLE_CATALOG    = db_name(),
  19690.         TABLE_SCHEMA    = user_name(o.uid),
  19691.         TABLE_NAME    = o.name,
  19692.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19693.                     case v.number
  19694.                     when 193 then N'SELECT'
  19695.                     when 195 then N'INSERT'
  19696.                     when 196 then N'DELETE'
  19697.                     when 197 then N'UPDATE'
  19698.                     else 'REFERENCES'
  19699.                     end),
  19700.         IS_GRANTABLE    = convert(bit,1)    
  19701.     from 
  19702.         sysobjects o, master.dbo.spt_values v, sysusers u
  19703.     where
  19704.         o.name = @table_name
  19705.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19706.     and    (@grantee is null or @grantee = user_name(u.uid))
  19707.     and     o.type in ('U','V','S')
  19708.     and     u.suid = 1        /* grantor is dbo of database */
  19709.     and    (@grantor is null or @grantor = user_name(u.uid))
  19710.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19711.     and     v.number in (26,193,195,196,197)
  19712.     and     not exists (    /* exclude revoke'd privileges */
  19713.             select     *
  19714.             from     sysprotects p1
  19715.             where    p1.protecttype = 206
  19716.             and     p1.action = v.number
  19717.             and     p1.id = o.id
  19718.             and     p1.uid = o.uid)
  19719.     END
  19720. ELSE
  19721.     BEGIN
  19722.     select
  19723.         GRANTOR        = user_name(p.grantor),
  19724.         GRANTEE        = user_name(u.uid),
  19725.         TABLE_CATALOG    = db_name(),
  19726.         TABLE_SCHEMA    = user_name(o.uid),
  19727.         TABLE_NAME    = o.name,
  19728.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19729.                     case p.action
  19730.                     when 193 then N'SELECT'
  19731.                     when 195 then N'INSERT'
  19732.                     when 196 then N'DELETE'
  19733.                     when 197 then N'UPDATE'
  19734.                     else N'REFERENCES'
  19735.                     end),
  19736.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  19737.     from 
  19738.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  19739.     where
  19740.         o.type in ('U','V','S')
  19741.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19742.     and    (@grantee is null or @grantee = user_name(u.uid))
  19743.     and    p.id = o.id
  19744.     and     (@grantor is null or @grantor = user_name(p.grantor))
  19745.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  19746.     and     (u.uid > 0 and u.uid < 16384)
  19747.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  19748.     and     p.protecttype <> 206    /* only grant rows */
  19749.     and     p.action in (26,193,195,196,197)
  19750.     and     o.uid <> u.uid            /* no rows for owner */
  19751.     and     not exists (            /* exclude revoke'd privileges */
  19752.             select     *
  19753.             from     sysprotects p1
  19754.             where    p1.protecttype = 206
  19755.             and     p1.action = p.action
  19756.             and     p1.id = p.id
  19757.             and     p1.uid = u.uid)
  19758.     union all
  19759.     select    /*    Add rows for table owner */
  19760.         GRANTOR        = user_name(u.uid),
  19761.         GRANTEE        = user_name(o.uid),
  19762.         TABLE_CATALOG    = db_name(),
  19763.         TABLE_SCHEMA    = user_name(o.uid),
  19764.         TABLE_NAME    = o.name,
  19765.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  19766.                     case v.number
  19767.                     when 193 then N'SELECT'
  19768.                     when 195 then N'INSERT'
  19769.                     when 196 then N'DELETE'
  19770.                     when 197 then N'UPDATE'
  19771.                     else N'REFERENCES'
  19772.                     end),
  19773.         IS_GRANTABLE    = convert(bit,1)    
  19774.     from 
  19775.         sysobjects o, master.dbo.spt_values v, sysusers u
  19776.     where
  19777.         o.type in ('U','V','S')
  19778.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  19779.     and    (@grantee is null or @grantee = user_name(u.uid))
  19780.     and     u.suid = 1        /* grantor is dbo of database */
  19781.     and    (@grantor is null or @grantor = user_name(u.uid))
  19782.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  19783.     and     v.number in (26,193,195,196,197)
  19784.     and     not exists (    /* exclude revoke'd privileges */
  19785.             select     *
  19786.             from     sysprotects p1
  19787.             where    p1.protecttype = 206
  19788.             and     p1.action = v.number
  19789.             and     p1.id = o.id
  19790.             and     p1.uid = o.uid)
  19791.     END
  19792. go
  19793.  
  19794.  
  19795. create procedure sp_table_privileges_rowset;4
  19796.     (
  19797.        @handle        int output,
  19798.        @scrollopt    int output,
  19799.     @ccopt        int output,
  19800.     @rows        int output,
  19801.     @cmd        nvarchar(1200)
  19802.     )
  19803. as
  19804.     declare @ret int
  19805.     declare @database_name sysname
  19806.     declare @SQL nvarchar(1500)
  19807.  
  19808.     create table #sptprivsrowset
  19809.         (
  19810.         GRANTOR        sysname not null,
  19811.         GRANTEE        sysname not null,
  19812.         TABLE_CATALOG    sysname not null,
  19813.         TABLE_SCHEMA    sysname not null,
  19814.         TABLE_NAME    sysname not null,
  19815.         PRIVILEGE_TYPE    sysname not null,
  19816.         IS_GRANTABLE    bit not null
  19817.         )
  19818.  
  19819.     declare sysdatabases_cursor insensitive cursor for 
  19820.         select name from master.dbo.sysdatabases
  19821.   
  19822.     set nocount on
  19823.     open sysdatabases_cursor
  19824.       fetch next from sysdatabases_cursor into @database_name 
  19825.     while @@fetch_status = 0
  19826.         begin
  19827.         select @SQL = N'use '+quotename(@database_name)+N' insert into #sptprivsrowset '+@cmd
  19828.         exec(@SQL)
  19829.         fetch next from sysdatabases_cursor into @database_name 
  19830.         end
  19831.       close sysdatabases_cursor
  19832.     deallocate sysdatabases_cursor
  19833.  
  19834.     if @scrollopt is null
  19835.         begin
  19836.         select * from #sptprivsrowset order by 3,4,5,6,1,2
  19837.         end
  19838.     else
  19839.         begin
  19840.         exec @ret = sp_cursoropen @handle output,
  19841.             'select * from #sptprivsrowset order by 3,4,5,6,1,2',
  19842.                 @scrollopt output, @ccopt output, @rows output
  19843.         end
  19844.     drop table #sptprivsrowset
  19845.     return isnull(@ret,0)
  19846. go
  19847. create procedure sp_table_privileges_rowset;5
  19848.     (
  19849.     @table_server        sysname,
  19850.     @table_catalog        sysname = null,
  19851.     @table_name        sysname = null,
  19852.     @table_schema        sysname = null,
  19853.     @grantor        sysname = null,
  19854.     @grantee        sysname = null
  19855.     )
  19856. as
  19857.     select
  19858.         GRANTOR,        
  19859.         GRANTEE,        
  19860.         TABLE_CATALOG,    
  19861.         TABLE_SCHEMA,    
  19862.         TABLE_NAME,    
  19863.         PRIVILEGE_TYPE,    
  19864.         IS_GRANTABLE    
  19865.     from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
  19866.                 @table_server,
  19867.                 @table_catalog,
  19868.                 @table_schema,
  19869.                 @table_name,
  19870.                 @grantor,
  19871.                 @grantee >
  19872.     order by 3,4,5,6,1,2
  19873. go
  19874.  
  19875. grant execute on sp_table_privileges_rowset to public
  19876. go
  19877.  
  19878. print ''
  19879. print 'creating sp_linkedservers_rowset'
  19880. go
  19881. if (charindex('7.00', @@version) = 0)
  19882. begin
  19883.     print ''
  19884.     print ''
  19885.     print 'Warning:'
  19886.     print 'you are installing the stored procedures '
  19887.     print 'on a pre 7.0 SQL Server.'
  19888.     print 'Ignore the following errors.'
  19889. end
  19890. go
  19891. /*    Procedure for 7.0 server */
  19892. create proc sp_linkedservers_rowset
  19893.     (
  19894.     @srvname     sysname
  19895.     )
  19896. as
  19897.     select
  19898.         SVR_NAME         = srvname,
  19899.         SVR_PRODUCT        = srvproduct,
  19900.         SVR_PROVIDERNAME    = providername,
  19901.         SVR_DATASOURCE        = datasource,
  19902.         SVR_PROVIDERSTRING    = providerstring,
  19903.         SVR_LOCATION        = location
  19904.     from master.dbo.sysservers
  19905.     where srvname = @srvname
  19906.     order by 1
  19907. go
  19908. create proc sp_linkedservers_rowset;2
  19909. as
  19910.     select
  19911.         SVR_NAME         = srvname,
  19912.         SVR_PRODUCT        = srvproduct,
  19913.         SVR_PROVIDERNAME    = providername,
  19914.         SVR_DATASOURCE        = datasource,
  19915.         SVR_PROVIDERSTRING    = providerstring,
  19916.         SVR_LOCATION        = location
  19917.     from master.dbo.sysservers
  19918.     order by 1
  19919. go
  19920.  
  19921. grant execute on sp_linkedservers_rowset to public
  19922. go
  19923.  
  19924. dump tran master with no_log
  19925. print ''
  19926. go
  19927.  
  19928. /*-----------------------------------------------------------------------------*/
  19929. /*-------------- CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/
  19930. /*-----------------------------------------------------------------------------*/
  19931.  
  19932. if object_id('sp_linkedservers', 'P') is not null
  19933.     drop proc sp_linkedservers
  19934. go
  19935. raiserror(15339,-1,-1,'sp_linkedservers')
  19936. go
  19937. create proc sp_linkedservers as
  19938.     select
  19939.         SRV_NAME = srvname,
  19940.         SRV_PROVIDERNAME = providername,
  19941.         SRV_PRODUCT = srvproduct,
  19942.         SRV_DATASOURCE = datasource,
  19943.         SRV_PROVIDERSTRING = providerstring,
  19944.         SRV_LOCATION = location
  19945.     from master.dbo.sysservers
  19946. go
  19947. grant execute on sp_linkedservers to public
  19948. go
  19949.  
  19950.  
  19951. if object_id('sp_catalogs', 'P') is not null
  19952.     drop proc sp_catalogs
  19953. go
  19954. raiserror(15339,-1,-1,'sp_catalogs')
  19955. go
  19956. create procedure sp_catalogs(
  19957.     @server_name        sysname)
  19958. as
  19959.     select
  19960.         CATALOG_NAME,
  19961.         convert (nvarchar(255),DESCRIPTION)
  19962.     from master.dbo.SYSREMOTE_CATALOGS < @server_name >
  19963.     order by CATALOG_NAME
  19964. go
  19965. grant execute on sp_catalogs to public
  19966. go
  19967.  
  19968.  
  19969. if object_id('sp_tables_ex', 'P') is not null
  19970.     drop proc sp_tables_ex
  19971. go
  19972. raiserror(15339,-1,-1,'sp_tables_ex')
  19973. go
  19974. create procedure sp_tables_ex(
  19975.     @table_server        sysname,
  19976.     @table_name            sysname = null,
  19977.     @table_schema        sysname = null,
  19978.     @table_catalog        sysname = null,
  19979.     @table_type            sysname = null)
  19980. as
  19981.     select
  19982.         TABLE_CAT = TABLE_CATALOG,
  19983.         TABLE_SCHEM = TABLE_SCHEMA,
  19984.         TABLE_NAME = TABLE_NAME,
  19985.         TABLE_TYPE = TABLE_TYPE,
  19986.         REMARKS = convert(nvarchar(255),DESCRIPTION)
  19987.     from master.dbo.SYSREMOTE_TABLES <
  19988.                 @table_server,
  19989.                 @table_catalog,
  19990.                 @table_schema,
  19991.                 @table_name,
  19992.                 @table_type >
  19993.     order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
  19994. go
  19995. grant execute on sp_tables_ex to public
  19996. go
  19997.  
  19998.  
  19999. if object_id('sp_columns_ex', 'P') is not null
  20000.     drop proc sp_columns_ex
  20001. go
  20002. raiserror(15339,-1,-1,'sp_columns_ex')
  20003. go
  20004. create procedure sp_columns_ex(
  20005.     @table_server        sysname,
  20006.     @table_name            sysname = null,
  20007.     @table_schema        sysname = null,
  20008.     @table_catalog        sysname = null,
  20009.     @column_name        sysname = null)
  20010. as
  20011.     select
  20012.         TABLE_CAT = c.TABLE_CATALOG,
  20013.         TABLE_SCHEM = c.TABLE_SCHEMA,
  20014.         TABLE_NAME = c.TABLE_NAME,
  20015.         COLUMN_NAME = c.COLUMN_NAME,
  20016.         DATA_TYPE = c.DATA_TYPE,
  20017.         TYPE_NAME = p.TYPE_NAME,
  20018.         COLUMN_SIZE = c.NUMERIC_PRECISION,
  20019.         BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
  20020.         DECIMAL_DIGITS = c.NUMERIC_SCALE,
  20021.         NUM_PREC_RADIX = convert(smallint, 10),
  20022.         NULLABLE = convert(smallint, c.IS_NULLABLE),
  20023.         REMARKS = convert(nvarchar(255),c.DESCRIPTION),
  20024.         COLUMN_DEF = c.COLUMN_DEFAULT,
  20025.         SQL_DATA_TYPE = c.DATA_TYPE,
  20026.         SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
  20027.         CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
  20028.         ORDINAL_POSITION = c.ORDINAL_POSITION,
  20029.         IS_NULLABLE = c.IS_NULLABLE,
  20030.         SS_DATA_TYPE = convert(tinyint, 0)    /* UNDONE: NEED MAPPING FROM OLEDB->TDS*/
  20031.     from master.dbo.SYSREMOTE_COLUMNS <
  20032.                 @table_server,
  20033.                 @table_catalog,
  20034.                 @table_schema,
  20035.                 @table_name,
  20036.                 @column_name > c
  20037.         LEFT OUTER JOIN
  20038.          master.dbo.SYSREMOTE_PROVIDER_TYPES <
  20039.                 @table_server > p
  20040.                 /* LUXOR/KAGERA dont support restricting DATA_TYPE or BEST_MATCH */
  20041.         ON c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1
  20042.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
  20043. go
  20044. grant execute on sp_columns_ex to public
  20045. go
  20046.  
  20047.  
  20048. if object_id('sp_table_privileges_ex', 'P') is not null
  20049.     drop proc sp_table_privileges_ex
  20050. go
  20051. raiserror(15339,-1,-1,'sp_table_privileges_ex')
  20052. go
  20053. create procedure sp_table_privileges_ex(
  20054.     @table_server        sysname,
  20055.     @table_name            sysname = null,
  20056.     @table_schema        sysname = null,
  20057.     @table_catalog        sysname = null)
  20058. as
  20059.     select
  20060.         TABLE_CAT = TABLE_CATALOG,
  20061.         TABLE_SCHEM = TABLE_SCHEMA,
  20062.         TABLE_NAME = TABLE_NAME,
  20063.         GRANTOR = GRANTOR,
  20064.         GRANTEE = GRANTEE,
  20065.         PRIVILEGE = PRIVILEGE_TYPE,
  20066.         IS_GRANTABLE = IS_GRANTABLE
  20067.     from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
  20068.                 @table_server,
  20069.                 @table_catalog,
  20070.                 @table_schema,
  20071.                 @table_name >
  20072.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, PRIVILEGE
  20073. go
  20074. grant execute on sp_table_privileges_ex to public
  20075. go
  20076.  
  20077.  
  20078. if object_id('sp_column_privileges_ex', 'P') is not null
  20079.     drop proc sp_column_privileges_ex
  20080. go
  20081. raiserror(15339,-1,-1,'sp_column_privileges_ex')
  20082. go
  20083. create procedure sp_column_privileges_ex(
  20084.     @table_server        sysname,
  20085.     @table_name            sysname = null,
  20086.     @table_schema        sysname = null,
  20087.     @table_catalog        sysname = null,
  20088.     @column_name        sysname = null)
  20089. as
  20090.     select
  20091.         TABLE_CAT = TABLE_CATALOG,
  20092.         TABLE_SCHEM = TABLE_SCHEMA,
  20093.         TABLE_NAME = TABLE_NAME,
  20094.         COLUMN_NAME = COLUMN_NAME,
  20095.         GRANTOR = GRANTOR,
  20096.         GRANTEE = GRANTEE,
  20097.         PRIVILEGE = PRIVILEGE_TYPE,
  20098.         IS_GRANTABLE = IS_GRANTABLE
  20099.     from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
  20100.                 @table_server,
  20101.                 @table_catalog,
  20102.                 @table_schema,
  20103.                 @table_name,
  20104.                 @column_name >
  20105.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE
  20106. go
  20107. grant execute on sp_column_privileges_ex to public
  20108. go
  20109.  
  20110.  
  20111. if object_id('sp_indexes', 'P') is not null
  20112.     drop proc sp_indexes
  20113. go
  20114. raiserror(15339,-1,-1,'sp_indexes')
  20115. go
  20116. create procedure sp_indexes(
  20117.     @table_server        sysname,
  20118.     @table_name            sysname = null,
  20119.     @table_schema        sysname = null,
  20120.     @table_catalog        sysname = null,
  20121.     @index_name            sysname = null,
  20122.     @is_unique          bit = null)
  20123. as
  20124.     select
  20125.         TABLE_CAT = TABLE_CATALOG,
  20126.         TABLE_SCHEM = TABLE_SCHEMA,
  20127.         TABLE_NAME = TABLE_NAME,
  20128.         NON_UNIQUE = convert(smallint, 1 - [UNIQUE]),
  20129.         INDEX_NAME = INDEX_NAME,
  20130.         INDEX_QUALIFIER = INDEX_SCHEMA,
  20131.         TYPE = TYPE,
  20132.         ORDINAL_POSITION = ORDINAL_POSITION,
  20133.         COLUMN_NAME = COLUMN_NAME,
  20134.         ASC_OR_DESC = [COLLATION],
  20135.         CARDINALITY = CARDINALITY,
  20136.         PAGES = PAGES,
  20137.         FILTER_CONDITION = FILTER_CONDITION
  20138.     from master.dbo.SYSREMOTE_INDEXES <
  20139.                 @table_server,
  20140.                 @table_catalog,
  20141.                 @table_schema,
  20142.                 @index_name,
  20143.                 NULL,            /* TYPE (index type) */
  20144.                 @table_name >
  20145.     where @is_unique is null or @is_unique = [UNIQUE]
  20146.     order by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME, ORDINAL_POSITION
  20147. go
  20148. grant execute on sp_indexes to public
  20149. go
  20150.  
  20151.  
  20152. if object_id('sp_foreignkeys', 'P') is not null
  20153.     drop proc sp_foreignkeys
  20154. go
  20155. raiserror(15339,-1,-1,'sp_foreignkeys')
  20156. go
  20157. create procedure sp_foreignkeys(
  20158.     @table_server        sysname,
  20159.     @pktab_name         sysname = null,
  20160.     @pktab_schema       sysname = null,
  20161.     @pktab_catalog      sysname = null,
  20162.     @fktab_name         sysname = null,
  20163.     @fktab_schema       sysname = null,
  20164.     @fktab_catalog      sysname = null)
  20165. as
  20166.     select
  20167.         PKTABLE_CAT = PK_TABLE_CATALOG,
  20168.         PKTABLE_SCHEM = PK_TABLE_SCHEMA,
  20169.         PKTABLE_NAME = PK_TABLE_NAME,
  20170.         PKCOLUMN_NAME = PK_COLUMN_NAME,
  20171.         FKTABLE_CAT = FK_TABLE_CATALOG,
  20172.         FKTABLE_SCHEM = FK_TABLE_SCHEMA,
  20173.         FKTABLE_NAME = FK_TABLE_NAME,
  20174.         FKCOLUMN_NAME = FK_COLUMN_NAME,
  20175.         KEY_SEQ = ORDINAL,
  20176.         UPDATE_RULE = UPDATE_RULE,
  20177.         DELETE_RULE = DELETE_RULE,
  20178.         FK_NAME = convert(sysname, NULL),
  20179.         PK_NAME = convert(sysname, NULL)
  20180.     from master.dbo.SYSREMOTE_FOREIGN_KEYS <
  20181.                 @table_server,
  20182.                 @pktab_catalog,
  20183.                 @pktab_schema,
  20184.                 @pktab_name,
  20185.                 @fktab_catalog,
  20186.                 @fktab_schema,
  20187.                 @fktab_name >
  20188.     order by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, KEY_SEQ
  20189. go
  20190. grant execute on sp_foreignkeys to public
  20191. go
  20192.  
  20193.  
  20194. if object_id('sp_primarykeys', 'P') is not null
  20195.     drop proc sp_primarykeys
  20196. go
  20197. raiserror(15339,-1,-1,'sp_primarykeys')
  20198. go
  20199. create procedure sp_primarykeys(
  20200.     @table_server        sysname,
  20201.     @table_name         sysname = null,
  20202.     @table_schema       sysname = null,
  20203.     @table_catalog      sysname = null)
  20204. as
  20205.     select
  20206.         TABLE_CAT = TABLE_CATALOG,
  20207.         TABLE_SCHEM = TABLE_SCHEMA,
  20208.         TABLE_NAME = TABLE_NAME,
  20209.         COLUMN_NAME = COLUMN_NAME,
  20210.         KEY_SEQ = ORDINAL,
  20211.         PK_NAME = convert(sysname, NULL)
  20212.     from master.dbo.SYSREMOTE_PRIMARY_KEYS <
  20213.                 @table_server,
  20214.                 @table_catalog,
  20215.                 @table_schema,
  20216.                 @table_name >
  20217.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, KEY_SEQ
  20218. go
  20219. grant execute on sp_primarykeys to public
  20220. go
  20221.  
  20222. /*---------------------------- END OLEDB CATALOG PROCS ------------------------*/
  20223.  
  20224.  
  20225. dump tran master with no_log
  20226. go
  20227.  
  20228.  
  20229.  
  20230.  
  20231. if (exists (select * from sysobjects
  20232.         where name = 'sp_configure' and type = 'P '))
  20233.     begin
  20234.         exec sp_configure 'allow updates',0
  20235.         reconfigure with override
  20236.     end
  20237. go
  20238.  
  20239. exec sp_MS_upd_sysobj_category 2 /* set category | 2 based on crdate. */
  20240.  
  20241. go
  20242.  
  20243. if exists (select * from sysobjects where name = 'sp_check_objects'
  20244.             and type = 'P ')
  20245.     begin
  20246.         /* Only supported on 6.0 servers */
  20247.         print ''
  20248.         print 'Checking objects created by instcat.sql.'
  20249.  
  20250.         exec sp_check_objects 'catalog'
  20251.     end
  20252. go
  20253.  
  20254. print ''
  20255. print 'instcat.sql completed successfully.'
  20256. go
  20257.  
  20258. set quoted_identifier off
  20259. go
  20260.  
  20261. dump tran master with no_log
  20262. go
  20263. checkpoint
  20264. go
  20265. /**/
  20266.