home *** CD-ROM | disk | FTP | other *** search
/ SuperSoft Prophet 6 Astrology / PROPHET6.iso / Pro6Evaluation / MDAC_TYP.EXE / RCDATA / CABINET / sqlnet.cab / instcat.sql < prev    next >
Text File  |  2001-06-27  |  762KB  |  24,203 lines

  1. /*
  2. **    INSTCAT.SQL
  3. **    Installs catalog stored procedures on the Microsoft SQL Server.
  4. ** Copyright Microsoft, Inc. 1994 - 2000
  5. ** All Rights Reserved.
  6. */
  7.  
  8. /*
  9. INTERNAL NOTE:
  10. When this file is updated, you MUST change the last row inserted into
  11. spt_server_info to be version number of this file.    the convention is
  12. j.nn.bbb, where j is the major version number ('7' now), nn is the minor
  13. version number ('10' now), and bbb is the build number.
  14. insert into spt_server_info
  15.     values (500, 'SYS_SPROC_VERSION', '8.00.bbb')
  16. */
  17.  
  18. /****************************************************************************/
  19. /* This portion sets up the ability to perform all the functions in this    */
  20. /* script                                                                    */
  21. /****************************************************************************/
  22. go
  23. use master
  24. go
  25. dump tran master with no_log
  26. go
  27.  
  28. set quoted_identifier on
  29. go
  30.  
  31. if (exists (select * from sysobjects
  32.         where name = 'sp_configure' and type = 'P '))
  33. begin
  34.     execute sp_configure 'update',1
  35. end
  36. reconfigure with override
  37. go
  38.  
  39. exec sp_MS_upd_sysobj_category 1 /*Capture datetime for use below.*/
  40.  
  41. go
  42.  
  43. /*
  44. ** If old versions of tables exist, drop them.
  45. */
  46. if (exists (select * from sysobjects
  47.         where name = 'MSdatatype_info' and type = 'U '))
  48.     drop table MSdatatype_info
  49. go
  50. if (exists (select * from sysobjects
  51.         where name = 'MSdatatype_info_ext' and type = 'U '))
  52.     drop table MSdatatype_info_ext
  53. go
  54. if (exists (select * from sysobjects
  55.         where name = 'MStable_types' and type = 'U '))
  56.     drop table MStable_types
  57. go
  58. if (exists (select * from sysobjects
  59.         where name = 'MSserver_info' and type = 'U '))
  60.     drop table MSserver_info
  61. go
  62. if (exists (select * from sysobjects
  63.         where name = 'spt_table_types' and type = 'U '))
  64.     drop table spt_table_types
  65. go
  66. /*
  67. ** If tables or procs already exist, drop them.
  68. */
  69.  
  70. if (exists (select * from sysobjects
  71.         where name = 'spt_datatype_info' and type = 'U '))
  72.     drop table spt_datatype_info
  73. go
  74. if (exists (select * from sysobjects
  75.         where name = 'spt_datatype_info_ext' and type = 'U '))
  76.     drop table spt_datatype_info_ext
  77. go
  78. if (exists (select * from sysobjects
  79.         where name = 'sp_add_server_sortinfo' and type = 'P '))
  80.     drop proc sp_add_server_sortinfo
  81. go
  82. if (exists (select * from sysobjects
  83.         where name = 'sp_add_server_sortinfo75' and type = 'P '))
  84.     drop proc sp_add_server_sortinfo75
  85. go
  86. if (exists (select * from sysobjects
  87.         where name = 'spt_server_info' and type = 'U '))
  88.     drop table spt_server_info
  89. go
  90. if (exists (select * from sysobjects
  91.         where name = 'sp_tables' and type = 'P '))
  92.     drop proc sp_tables
  93. go
  94. if (exists (select * from sysobjects
  95.         where name = 'sp_statistics' and type = 'P '))
  96.     drop proc sp_statistics
  97. go
  98. if (exists (select * from sysobjects
  99.         where name = 'sp_columns' and type = 'P '))
  100.     drop proc sp_columns
  101. go
  102. if (exists (select * from sysobjects
  103.         where name = 'sp_fkeys' and type = 'P '))
  104.     drop proc sp_fkeys
  105. go
  106. if (exists (select * from sysobjects
  107.         where name = 'sp_pkeys' and type = 'P '))
  108.     drop proc sp_pkeys
  109. dump tran master with no_log
  110. go
  111.  
  112. go
  113. if (exists (select * from sysobjects
  114.         where name = 'sp_stored_procedures' and type = 'P '))
  115.     drop proc sp_stored_procedures
  116. go
  117. if (exists (select * from sysobjects
  118.         where name = 'sp_sproc_columns' and type = 'P '))
  119.     drop proc sp_sproc_columns
  120. go
  121. if (exists (select * from sysobjects
  122.         where name = 'sp_table_privileges' and type = 'P '))
  123.     drop proc sp_table_privileges
  124. go
  125. if (exists (select * from sysobjects
  126.         where name = 'sp_column_privileges' and type = 'P '))
  127.     drop proc sp_column_privileges
  128. go
  129. dump tran master with no_log
  130. go
  131. if (exists (select * from sysobjects
  132.         where name = 'sp_server_info' and type = 'P '))
  133.     drop proc sp_server_info
  134. go
  135. if (exists (select * from sysobjects
  136.         where name = 'sp_datatype_info' and type = 'P '))
  137.     drop proc sp_datatype_info
  138. go
  139. if (exists (select * from sysobjects
  140.         where name = 'sp_special_columns' and type = 'P '))
  141.     drop proc sp_special_columns
  142. go
  143. if (exists (select * from sysobjects
  144.         where name = 'sp_databases' and type = 'P '))
  145.     drop proc sp_databases
  146. go
  147. dump tran master with no_log
  148. go
  149. if (exists (select * from sysobjects
  150.         where name = 'sp_ddopen' and type = 'P '))
  151.     drop proc sp_ddopen
  152. go
  153. if (exists (select * from sysobjects
  154.         where name = 'sp_tableswc' and type = 'P '))
  155.     drop proc sp_tableswc
  156. go
  157.  
  158. if (exists (select * from sysobjects
  159.         where name = 'sp_tablecollations' and type = 'P'))
  160.     drop proc sp_tablecollations
  161. go
  162.  
  163. if (exists (select * from sysobjects
  164.         where name = 'sp_bcp_dbcmptlevel' and type = 'P'))
  165.     drop proc sp_bcp_dbcmptlevel
  166. go
  167.  
  168. dump tran master with no_log
  169. go
  170.  
  171.  
  172. if (exists (select * from sysobjects
  173.         where name = 'spt_provider_types' and type = 'U '))
  174.     begin
  175.     drop table spt_provider_types
  176.     dump tran master with no_log
  177.     end
  178. go
  179. if (exists (select * from sysobjects
  180.         where name = 'sp_catalogs_rowset' and type = 'P '))
  181.     begin
  182.     drop procedure sp_catalogs_rowset
  183.     dump tran master with no_log
  184.     end
  185. go
  186. if (exists (select * from sysobjects
  187.         where name = 'sp_column_privileges_rowset' and type = 'P '))
  188.     begin
  189.     drop procedure sp_column_privileges_rowset
  190.     dump tran master with no_log
  191.     end
  192. go
  193. if (exists (select * from sysobjects
  194.         where name = 'sp_columns_rowset' and type = 'P '))
  195.     begin
  196.     drop procedure sp_columns_rowset
  197.     dump tran master with no_log
  198.     end
  199. go
  200. if (exists (select * from sysobjects
  201.         where name = 'sp_check_constraints_rowset' and type = 'P '))
  202.     begin
  203.     drop procedure sp_check_constraints_rowset
  204.     dump tran master with no_log
  205.     end
  206. go
  207. if (exists (select * from sysobjects
  208.         where name = 'sp_check_constbytable_rowset' and type = 'P '))
  209.     begin
  210.     drop procedure sp_check_constbytable_rowset
  211.     dump tran master with no_log
  212.     end
  213. go
  214. if (exists (select * from sysobjects
  215.         where name = 'sp_foreign_keys_rowset' and type = 'P '))
  216.     begin
  217.     drop procedure sp_foreign_keys_rowset
  218.     dump tran master with no_log
  219.     end
  220. go
  221. if (exists (select * from sysobjects
  222.         where name = 'sp_indexes_rowset' and type = 'P '))
  223.     begin
  224.     drop procedure sp_indexes_rowset
  225.     dump tran master with no_log
  226.     end
  227. go
  228. if (exists (select * from sysobjects
  229.         where name = 'sp_primary_keys_rowset' and type = 'P '))
  230.     begin
  231.     drop procedure sp_primary_keys_rowset
  232.     dump tran master with no_log
  233.     end
  234. go
  235. if (exists (select * from sysobjects
  236.         where name = 'sp_procedure_params_rowset' and type = 'P '))
  237.     begin
  238.     drop procedure sp_procedure_params_rowset
  239.     dump tran master with no_log
  240.     end
  241. go
  242. if (exists (select * from sysobjects
  243.         where name = 'sp_procedures_rowset' and type = 'P '))
  244.     begin
  245.     drop procedure sp_procedures_rowset
  246.     dump tran master with no_log
  247.     end
  248. go
  249. if (exists (select * from sysobjects
  250.         where name = 'sp_provider_types_rowset' and type = 'P '))
  251.     begin
  252.     drop procedure sp_provider_types_rowset
  253.     dump tran master with no_log
  254.     end
  255. go
  256. if (exists (select * from sysobjects
  257.         where name = 'sp_schemata_rowset' and type = 'P '))
  258.     begin
  259.     drop procedure sp_schemata_rowset
  260.     dump tran master with no_log
  261.     end
  262. go
  263. if (exists (select * from sysobjects
  264.         where name = 'sp_statistics_rowset' and type = 'P '))
  265.     begin
  266.     drop procedure sp_statistics_rowset
  267.     dump tran master with no_log
  268.     end
  269. go
  270. if (exists (select * from sysobjects
  271.         where name = 'sp_tables_rowset' and type = 'P '))
  272.     begin
  273.     drop procedure sp_tables_rowset
  274.     dump tran master with no_log
  275.     end
  276. go
  277. if (exists (select * from sysobjects
  278.         where name = 'sp_tables_info_rowset' and type = 'P '))
  279.     begin
  280.     drop procedure sp_tables_info_rowset
  281.     dump tran master with no_log
  282.     end
  283. go
  284. if (exists (select * from sysobjects
  285.         where name = 'sp_tables_info_rowset_64' and type = 'P '))
  286.     begin
  287.     drop procedure sp_tables_info_rowset_64
  288.     dump tran master with no_log
  289.     end
  290. go
  291. if (exists (select * from sysobjects
  292.         where name = 'sp_table_constraints_rowset' and type = 'P '))
  293.     begin
  294.     drop proc sp_table_constraints_rowset
  295.     dump tran master with no_log
  296.     end
  297. go
  298. if (exists (select * from sysobjects
  299.         where name = 'sp_table_privileges_rowset' and type = 'P '))
  300.     begin
  301.     drop proc sp_table_privileges_rowset
  302.     dump tran master with no_log
  303.     end
  304. go
  305. if (exists (select * from sysobjects
  306.         where name = 'sp_linkedservers_rowset' and type = 'P '))
  307.     begin
  308.     drop proc sp_linkedservers_rowset
  309.     dump tran master with no_log
  310.     end
  311. go
  312.  
  313. if (exists (select * from sysobjects
  314.         where name = 'sp_table_statistics_rowset' and type = 'P '))
  315.     begin
  316.     drop proc sp_table_statistics_rowset
  317.     dump tran master with no_log
  318.     end
  319. go
  320.  
  321. if (exists (select * from sysobjects
  322.         where name = 'sp_oledb_column_constraints' and type = 'P '))
  323.     begin
  324.     drop proc sp_oledb_column_constraints
  325.     dump tran master with no_log
  326.     end
  327. go
  328.  
  329. if (exists (select * from sysobjects
  330.         where name = 'sp_oledb_indexinfo' and type = 'P '))
  331.     begin
  332.     drop proc sp_oledb_indexinfo
  333.     dump tran master with no_log
  334.     end
  335. go
  336.  
  337. if (exists (select * from sysobjects
  338.         where name = 'sp_oledb_ro_usrname' and type = 'P '))
  339.     begin
  340.     drop proc sp_oledb_ro_usrname
  341.     dump tran master with no_log
  342.     end
  343. go
  344.  
  345. if (exists (select * from sysobjects
  346.         where name = 'sp_oledb_deflang' and type = 'P '))
  347.     begin
  348.     drop proc sp_oledb_deflang
  349.     dump tran master with no_log
  350.     end
  351. go
  352.  
  353. if (exists (select * from sysobjects
  354.         where name = 'sp_oledb_defdb' and type = 'P '))
  355.     begin
  356.     drop proc sp_oledb_defdb
  357.     dump tran master with no_log
  358.     end
  359. go
  360.  
  361. if (exists (select * from sysobjects
  362.         where name = 'sp_oledb_database' and type = 'P '))
  363.     begin
  364.     drop proc sp_oledb_database
  365.     dump tran master with no_log
  366.     end
  367. go
  368.  
  369. if (exists (select * from sysobjects
  370.         where name = 'sp_oledb_language' and type = 'P '))
  371.     begin
  372.     drop proc sp_oledb_language
  373.     dump tran master with no_log
  374.     end
  375. go
  376.  
  377. print 'creating table spt_datatype_info_ext'
  378. go
  379.  
  380. if (charindex('6.00', @@version) = 0 and
  381.     charindex('6.50', @@version) = 0 and
  382.     charindex('7.00', @@version) = 0 and
  383.     charindex('8.00', @@version) = 0)
  384. begin    /*    Pre 6.0 server */
  385.     print ''
  386.     print ''
  387.     print 'Warning:'
  388.     print 'you are installing the stored procedures '
  389.     print 'on a pre 6.0 SQL Server.'
  390.     print 'Ignore the following error.'
  391.     create table spt_datatype_info_ext (
  392.                 user_type        smallint    not null,
  393.                 CREATE_PARAMS    varchar(32) null,
  394.                 AUTO_INCREMENT    smallint null,
  395.                 typename        varchar(32))
  396. end
  397. go
  398. if (charindex('6.00', @@version) > 0 or
  399.     charindex('6.50', @@version) > 0 or
  400.     charindex('7.00', @@version) > 0 or
  401.     charindex('8.00', @@version) > 0)
  402. begin    /* 6.0 or later server */
  403.     create table spt_datatype_info_ext (
  404.                 user_type        smallint    not null,
  405.                 CREATE_PARAMS    varchar(32) null,
  406.                 AUTO_INCREMENT    smallint null,
  407.                 typename        sysname)    /* from systypes, to avoid xusertype hard-code */
  408. end
  409. go
  410.  
  411. grant select on spt_datatype_info_ext to public
  412. go
  413.  
  414.  
  415. insert into spt_datatype_info_ext
  416.     /* CHAR      user_type, create_params, auto_increment */
  417.     values             (1,    'length' ,0, 'char')
  418.  
  419. insert into spt_datatype_info_ext
  420.     /* VARCHAR     user_type, create_params, auto_increment */
  421.     values             (2,    'max length' ,0, 'varchar')
  422.  
  423. insert into spt_datatype_info_ext
  424.     /* BINARY     user_type, create_params, auto_increment */
  425.     values             (3,    'length' ,0, 'binary')
  426.  
  427. insert into spt_datatype_info_ext
  428.     /* VARBINARY user_type, create_params, auto_increment */
  429.     values             (4,    'max length' ,0, 'varbinary')
  430.  
  431. if    (charindex('6.00', @@version) > 0 or
  432.      charindex('6.50', @@version) > 0 or
  433.      charindex('7.00', @@version) > 0 or
  434.      charindex('8.00', @@version) > 0)
  435. begin    /*    Add 6.0 data types */
  436.     insert into spt_datatype_info_ext
  437.         /* DECIMAL user_type, create_params, auto_increment */
  438.         values             (26,    'precision,scale' ,0, 'decimal')
  439.  
  440.     insert into spt_datatype_info_ext
  441.         /* NUMERIC user_type, create_params, auto_increment */
  442.         values             (25,    'precision,scale' ,0, 'numeric')
  443.  
  444.     insert into spt_datatype_info_ext
  445.         /* DECIMAL IDENTITY user_type, create_params, auto_increment */
  446.         values             (26,    'precision' ,1, 'decimal')
  447.  
  448.     insert into spt_datatype_info_ext
  449.         /* NUMERIC IDENTITY user_type, create_params, auto_increment */
  450.         values             (25,    'precision' ,1, 'numeric')
  451.  
  452. end
  453. else    /*    Pre 6.0 server, add SYSNAME create param */
  454.     begin
  455.         insert into spt_datatype_info_ext
  456.             /* SYSNAME     user_type, create_param, auto_increments */
  457.             values             (18,    'max length' ,0, 'sysname')
  458.  
  459.     end
  460. go
  461.  
  462. if (charindex('7.00', @@version) = 0 and
  463.     charindex('8.00', @@version) = 0)
  464. begin
  465.     print ''
  466.     print ''
  467.     print 'Warning:'
  468.     print 'you are installing the stored procedures '
  469.     print 'on a pre 8.0 SQL Server.'
  470.     print 'Ignore the following errors.'
  471. end
  472. go
  473. if (charindex('7.00', @@version) > 0 or
  474.     charindex('8.00', @@version) > 0)
  475. begin    /*    Update usertypes for 8.0 server */
  476.     begin tran
  477.     insert into spt_datatype_info_ext
  478.         /* NCHAR     user_type, create_params, auto_increment */
  479.         values             (0,    'length' ,0, 'nchar')
  480.  
  481.     insert into spt_datatype_info_ext
  482.         /* NVARCHAR     user_type, create_params, auto_increment */
  483.         values             (0,    'max length' ,0, 'nvarchar')
  484.  
  485.     /* SET user_type TO SPHINX VALUES */
  486.     update spt_datatype_info_ext set user_type = xusertype
  487.         from spt_datatype_info_ext e, systypes t where t.name = e.typename
  488.  
  489.     commit tran
  490. end
  491. go
  492.  
  493. create unique clustered index datatypeinfoextclust on spt_datatype_info_ext(user_type,AUTO_INCREMENT)
  494. go
  495.  
  496. print 'creating table spt_datatype_info'
  497. go
  498. if (charindex('6.00', @@version) = 0 and
  499.     charindex('6.50', @@version) = 0 and
  500.     charindex('7.00', @@version) = 0 and
  501.     charindex('8.00', @@version) = 0)
  502. begin    /*    Pre 6.0 server */
  503.     print ''
  504.     print ''
  505.     print 'Warning:'
  506.     print 'you are installing the stored procedures '
  507.     print 'on a pre 6.0 SQL Server.'
  508.     print 'Ignore the following error.'
  509.     create table spt_datatype_info (
  510.         ss_dtype            tinyint     not null,
  511.         fixlen                int         null,        /* datatype len for variable, else null */
  512.         ODBCVer             tinyint     null,        /* version if needed, else null */
  513.         TYPE_NAME            varchar(32)    not null,
  514.         DATA_TYPE            smallint    not null,
  515.         data_precision        int         null,
  516.         numeric_scale        smallint    null,    /* min scale if 6.0 */
  517.         RADIX                smallint    null,
  518.         length                int         null,
  519.         LITERAL_PREFIX        varchar(32) null,
  520.         LITERAL_SUFFIX        varchar(32) null,
  521.         CREATE_PARAMS        varchar(32) null,
  522.         NULLABLE            smallint    not null,
  523.         CASE_SENSITIVE        smallint    not null,
  524.         SEARCHABLE            smallint    not null,
  525.         UNSIGNED_ATTRIBUTE    smallint    null,
  526.         MONEY                smallint    not null,
  527.         AUTO_INCREMENT        smallint    null,
  528.         LOCAL_TYPE_NAME     varchar(32)    null,
  529.         charbin             tinyint     null, /* 0 for char/binary types, NULL for all others */
  530.         SQL_DATA_TYPE        smallint    not null,
  531.         SQL_DATETIME_SUB    smallint    null)
  532. end
  533. go
  534. if (charindex('6.00', @@version) > 0 or
  535.     charindex('6.50', @@version) > 0 or
  536.     charindex('7.00', @@version) > 0 or
  537.     charindex('8.00', @@version) > 0)
  538. begin    /* 6.0 or later server */
  539.     create table spt_datatype_info (
  540.         ss_dtype            tinyint     not null,
  541.         fixlen                int         null,        /* datatype len for variable, else null */
  542.         ODBCVer             tinyint     null,        /* version if needed, else null */
  543.         TYPE_NAME            sysname     not null,
  544.         DATA_TYPE            smallint    not null,
  545.         data_precision        int         null,
  546.         numeric_scale        smallint    null,    /* min scale if 6.0 */
  547.         RADIX                smallint    null,
  548.         length                int         null,
  549.         LITERAL_PREFIX        varchar(32) null,
  550.         LITERAL_SUFFIX        varchar(32) null,
  551.         CREATE_PARAMS        varchar(32) null,
  552.         NULLABLE            smallint    not null,
  553.         CASE_SENSITIVE        smallint    not null,
  554.         SEARCHABLE            smallint    not null,
  555.         UNSIGNED_ATTRIBUTE    smallint    null,
  556.         MONEY                smallint    not null,
  557.         AUTO_INCREMENT        smallint    null,
  558.         LOCAL_TYPE_NAME     sysname     null,
  559.         charbin             tinyint     null, /* 0 for char/binary types, NULL for all others */
  560.         SQL_DATA_TYPE        smallint    not null,
  561.         SQL_DATETIME_SUB    smallint    null)
  562. end
  563. go
  564.  
  565. grant select on spt_datatype_info to public
  566. go
  567.  
  568. /* Get case sensitivity */
  569. if 'A' = 'A' /* create dummy begin block */
  570. begin
  571.     declare @case smallint
  572.  
  573.     begin tran
  574.     select @case = 0
  575.     select @case = 1 where 'a' <> 'A'
  576.  
  577.     /* Local Binary */
  578.     insert into spt_datatype_info values
  579.     (45,null,null,'binary',-2,null,null,null,null,'0x',null,'length',1,0,2,null,0,null,'binary',0,-2,null)
  580.  
  581.     /* Local Bit */
  582.     insert into spt_datatype_info values
  583.     (50,null,null,'bit',-7,1,0,null,1,null,null,null,0,0,2,null,0,null,'bit',null,-7,null)
  584.  
  585.     /* Local Char */
  586.     insert into spt_datatype_info values
  587.     (47,null,null,'char',1,null,null,null,null,'''','''','length',1,@case,3,null,0,null,'char',0,1,null)
  588.  
  589.     /* Local Datetime */
  590.     insert into spt_datatype_info values
  591.     (61,8,2,'datetime',11,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  592.     insert into spt_datatype_info values
  593.     (61,8,3,'datetime',93,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  594.  
  595.     /* Local Smalldatetime */
  596.     insert into spt_datatype_info values
  597.     (58,4,2,'smalldatetime',11,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  598.     insert into spt_datatype_info values
  599.     (58,4,3,'smalldatetime',93,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  600.  
  601.     /* Local Float */
  602.     insert into spt_datatype_info values
  603.     (62,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  604.     insert into spt_datatype_info values
  605.     (62,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  606.  
  607.     /* Local Real */
  608.     insert into spt_datatype_info values
  609.     (59,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  610.     insert into spt_datatype_info values
  611.     (59,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  612.  
  613.     /* Local Smallmoney */
  614.     insert into spt_datatype_info values
  615.     (122,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
  616.  
  617.     /* Local Money */
  618.     insert into spt_datatype_info values
  619.     (60,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
  620.  
  621.     /* Local Int */
  622.     insert into spt_datatype_info values
  623.     (56,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
  624.  
  625.     commit tran
  626. end
  627. go
  628.  
  629. if 'A' = 'A' /* create dummy begin block */
  630. begin
  631.     declare @case smallint
  632.  
  633.     begin tran
  634.     select @case = 0
  635.     select @case = 1 where 'a' <> 'A'
  636.  
  637.  
  638.     /* Local Smallint */
  639.     insert into spt_datatype_info values
  640.     (52,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  641.     insert into spt_datatype_info values
  642.     (52,2,1,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  643.  
  644.     /* Local Tinyint */
  645.     insert into spt_datatype_info values
  646.     (48,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
  647.  
  648.     /* Local Text */
  649.     insert into spt_datatype_info values
  650.     (35,null,null,'text',-1,2147483647,null,null,2147483647,'''','''',null,1,@case,1,null,0,null,'text',0,-1,null)
  651.  
  652.     /* Local Varbinary */
  653.     insert into spt_datatype_info values
  654.     (37,null,null,'varbinary',-3,null,null,null,null,'0x',null,'max length',1,0,2,null,0,null,'varbinary',0,-3,null)
  655.  
  656.     /* Local Varchar */
  657.     insert into spt_datatype_info values
  658.     (39,null,null,'varchar',12,null,null,null,null,'''','''','max length',1,@case,3,null,0,null,'varchar',0,12,null)
  659.  
  660.     /* Local Image */
  661.     insert into spt_datatype_info values
  662.     (34,null,null,'image',-4,2147483647,null,null,2147483647,'0x',null,null,1,0,0,null,0,null,'image',0,-4,null)
  663.  
  664.     if (charindex('6.00', @@version) > 0 or
  665.         charindex('6.50', @@version) > 0 or
  666.         charindex('7.00', @@version) > 0 or
  667.         charindex('8.00', @@version) > 0)
  668.     begin    /*    Add 6.0 data types */
  669.         /* Local Decimal */
  670.         insert into spt_datatype_info values    /* sql server type is 'decimaln' */
  671.         (55,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
  672.  
  673.         /* Local Numeric */
  674.         insert into spt_datatype_info values    /* sql server type is 'numericn' */
  675.         (63,null,null,'numeric',2    ,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
  676.  
  677.         /* Identity attribute data types */
  678.  
  679.         /* Identity Int */
  680.         insert into spt_datatype_info values
  681.         (56,null,null,'int identity',4,10,0,10,null,null,null,null,0,0,2,0,0,1,'int identity',null,4,null)
  682.  
  683.         /* Identity Smallint */
  684.         insert into spt_datatype_info values
  685.         (52,null,null,'smallint identity',5,5,0,10,null,null,null,null,0,0,2,0,0,1,'smallint identity',null,5,null)
  686.  
  687.         /* Identity Tinyint */
  688.         insert into spt_datatype_info values
  689.         (48,null,null,'tinyint identity',-6,3,0,10,null,null,null,null,0,0,2,1,0,1,'tinyint identity',null,-6,null)
  690.  
  691.         /* Identity Numeric */
  692.         insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  693.         (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)
  694.  
  695.         /* Identity Numeric */
  696.         insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  697.         (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)
  698.  
  699.     end
  700.  
  701.     if (charindex('7.00', @@version) = 0 and
  702.         charindex('8.00', @@version) = 0)
  703.     begin    /*    Add nullable type for non-8.0 server */
  704.         /* Local Datetimn */
  705.         insert into spt_datatype_info values
  706.         (111,4,2,'smalldatetime',11,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  707.         insert into spt_datatype_info values
  708.         (111,4,3,'smalldatetime',93,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
  709.         insert into spt_datatype_info values /* sql server type is 'datetimn' */
  710.         (111,8,2,'datetime',11,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  711.         insert into spt_datatype_info values
  712.         (111,8,3,'datetime',93,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
  713.  
  714.         /* Local Floatn */
  715.         insert into spt_datatype_info values /* sql server type is 'floatn' */
  716.         (109,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  717.         insert into spt_datatype_info values
  718.         (109,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
  719.         insert into spt_datatype_info values /* sql server type is 'floatn' */
  720.         (109,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  721.         insert into spt_datatype_info values
  722.         (109,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
  723.  
  724.         /* Local Moneyn */
  725.         insert into spt_datatype_info values    /* sql server type is 'moneyn' */
  726.         (110,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
  727.         insert into spt_datatype_info values    /* sql server type is 'moneyn' */
  728.         (110,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
  729.  
  730.         /* Local Intn */
  731.         insert into spt_datatype_info values /* sql server type is 'intn' */
  732.         (38,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
  733.         insert into spt_datatype_info values /* sql server type is 'intn' */
  734.         (38,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
  735.         insert into spt_datatype_info values
  736.         (38,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
  737.  
  738.         if (charindex('6.00', @@version) > 0 or
  739.             charindex('6.50', @@version) > 0 or
  740.             charindex('7.00', @@version) > 0 or
  741.             charindex('8.00', @@version) > 0)
  742.         begin    /*    Add 6.0 data types */
  743.             /* Local Decimaln */
  744.             insert into spt_datatype_info values    /* sql server type is 'decimaln' */
  745.             (106,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
  746.             insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  747.             (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)
  748.  
  749.             /* Local Numericn */
  750.             insert into spt_datatype_info values    /* sql server type is 'numericn' */
  751.             (108,null,null,'numeric',2,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
  752.             insert into spt_datatype_info values    /* sql server type is 'decmaln' */
  753.             (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)
  754.         end
  755.     end
  756.  
  757.     commit tran
  758. end
  759. go
  760.  
  761. if (charindex('7.00', @@version) = 0 and
  762.     charindex('8.00', @@version) = 0)
  763. begin
  764.     print ''
  765.     print ''
  766.     print 'Warning:'
  767.     print 'you are installing the stored procedures '
  768.     print 'on a pre 8.0 SQL Server.'
  769.     print 'Ignore the following errors.'
  770. end
  771. go
  772. if (charindex('7.00', @@version) > 0 or
  773.     charindex('8.00', @@version) > 0)
  774.     begin
  775.         declare @ncase smallint
  776.  
  777.         select @ncase = 0
  778.         select @ncase = 1 where N'a' <> N'A'
  779.  
  780.         /* Local Timestamp */
  781.         insert into spt_datatype_info values
  782.         (0,null,null,'timestamp',-2,8,null,null,null,'0x',null,null,1,0,2,null,0,null,'timestamp',0,-2,null)
  783.  
  784.         /* Local GUID */
  785.         insert into spt_datatype_info values
  786.         (0,null,null,'uniqueidentifier',-11,36,null,null,null,'''','''',null,1,0,2,null,0,null,'uniqueidentifier',NULL,-11,null)
  787.  
  788.         /* Local NChar */
  789.         insert into spt_datatype_info values
  790.         (0,null,null,'nchar',-8,null,null,null,null,'N''','''','length',1,@ncase,3,null,0,null,'nchar',0,-8,null)
  791.  
  792.         /* Local NVarchar */
  793.         insert into spt_datatype_info values
  794.         (0,null,null,'nvarchar',-9,null,null,null,null,'N''','''','max length',1,@ncase,3,null,0,null,'nvarchar',0,-9,null)
  795.  
  796.         /* Local NText */
  797.         insert into spt_datatype_info values
  798.         (0,null,null,'ntext',-10,2147483646,null,null,2147483646,'N''','''',null,1,@ncase,1,null,0,null,'ntext',0,-10,null)
  799.  
  800.         if (charindex('8.00', @@version) > 0)
  801.         begin
  802. --            /* Local BIGINT */
  803.             insert into spt_datatype_info values
  804.             (127,8,null,'bigint',-5,19,0,10,null,null,null,null,1,0,2,0,0,0,'bigint',null,-5,null)
  805. --            /* Identity BIGINT */
  806.             insert into spt_datatype_info values
  807.             (127,8,null,'bigint identity',-5,19,0,10,null,null,null,null,0,0,2,0,0,1,'bigint identity',null,-5,null)
  808.  
  809.  
  810. --            /* sql_variant */
  811.             insert into spt_datatype_info values
  812.             (
  813.             98,                    --ss_dtype        
  814.             null,                --fixlen
  815.             null,                --ODBCVer
  816.             'sql_variant',        --TYPE_NAME
  817.             -150,                --SQL DATA TYPE
  818.             8000,                --data_precision
  819.             0,                    --numeric_scale
  820.             10,                    --RADIX
  821.             8000,                --length
  822.             null,                --PREFIX
  823.             null,                --SUFFIX
  824.             null,                --Create Params
  825.             1,                    --Nullable
  826.             0,                --Case sensitive
  827.             2,                    --Searchable
  828.             null,                --UNSIGNED_ATTRIBUTE
  829.             0,                --MONEY
  830.             null,                --AUTO_INCREMENT
  831.             'sql_variant',        --LOCAL TYPE NAME
  832.             0,                    --CHARBIN
  833.             -150,                --SQL_DATA_TYPE
  834.             null                --SQL_DATETIME_SUB
  835.             )
  836.         
  837.         end
  838.  
  839.  
  840.  
  841.         update spt_datatype_info set NULLABLE = 1
  842.             where TYPE_NAME = 'bit'
  843.  
  844.         update spt_datatype_info set ss_dtype = isnull((select distinct xtype from systypes
  845.             where TYPE_NAME like name+'%'),0)
  846.     end
  847. go
  848.  
  849. create unique clustered index datatypeinfoclust on spt_datatype_info(ss_dtype,fixlen,ODBCVer,AUTO_INCREMENT)
  850. go
  851.  
  852. dump tran master with no_log
  853. go
  854.  
  855. print 'creating table spt_server_info'
  856. go
  857. create table spt_server_info (
  858.               attribute_id        int NOT NULL,
  859.               attribute_name    varchar(60) NOT NULL,
  860.               attribute_value    varchar(255) NOT NULL)
  861. go
  862.  
  863. create unique clustered index serverinfoclust on spt_server_info(attribute_id)
  864. go
  865.  
  866. if (charindex('7.00', @@version) = 0 and charindex('8.00', @@version) = 0)
  867.     begin
  868.         drop procedure sp_add_server_sortinfo    /* not used by other servers */
  869.         drop procedure sp_add_server_sortinfo75    /* not used by older servers */
  870.         dump tran master with no_log
  871.     end
  872. go
  873.  
  874.  
  875. insert into spt_server_info
  876.     values (1,'DBMS_NAME','Microsoft SQL Server')
  877. insert into spt_server_info
  878.     values (2,'DBMS_VER',@@version)
  879. insert into spt_server_info
  880.     values (10,'OWNER_TERM','owner')
  881. insert into spt_server_info
  882.     values (11,'TABLE_TERM','table')
  883. insert into spt_server_info
  884.     values (12,'MAX_OWNER_NAME_LENGTH','30')
  885. insert into spt_server_info
  886.     values (13,'TABLE_LENGTH','30')
  887. insert into spt_server_info
  888.     values (14,'MAX_QUAL_LENGTH','30')
  889. insert into spt_server_info
  890.     values (15,'COLUMN_LENGTH','30')
  891. if 'A' = 'a' /* If not case sensitive server */
  892. begin
  893.     insert into spt_server_info
  894.         values (16,'IDENTIFIER_CASE','MIXED')
  895. end
  896. else
  897. begin
  898.     insert into spt_server_info
  899.         values (16,'IDENTIFIER_CASE','SENSITIVE')
  900. end
  901. insert into spt_server_info
  902.     values (17,'TX_ISOLATION','2')
  903. if (charindex('6.00', @@version) > 0 or
  904.     charindex('6.50', @@version) > 0 or
  905.     charindex('7.00', @@version) > 0) 
  906. begin    /*    Add 6.0 collation sequence */
  907.     insert into spt_server_info
  908.         select 18,'COLLATION_SEQ',
  909.             'charset='+t2.name+' sort_order='+t1.name
  910.             +' charset_num='+rtrim(convert(char(4),t1.csid))+
  911.             ' sort_order_num='+rtrim(convert(char(4),t1.id))
  912.         from syscharsets t1, syscharsets t2, sysconfigures t3
  913.         where t1.csid=t2.id and t1.id=t3.value and t3.config=1123
  914. end
  915. else 
  916. begin    /*    Add 4.2x collation sequence */
  917.     insert into spt_server_info
  918.         select 18,'COLLATION_SEQ',
  919.             'charset='+t2.name+' sort_order='+t1.name
  920.             +' charset_num='+rtrim(convert(char(4),t1.csid))+
  921.             ' sort_order_num='+rtrim(convert(char(4),t1.id))
  922.         from syscharsets t1, syscharsets t2, sysconfigures t3
  923.         where t1.csid=t2.id and t1.id=t3.value and t3.config=123
  924. end
  925. insert into spt_server_info
  926.     values (19,'SAVEPOINT_SUPPORT','Y')
  927. insert into spt_server_info
  928.     values (20,'MULTI_RESULT_SETS','Y')
  929. insert into spt_server_info
  930.     values (22,'ACCESSIBLE_TABLES','Y')
  931. go
  932.  
  933. insert into spt_server_info
  934.     values (100,'USERID_LENGTH','30')
  935. insert into spt_server_info
  936.     values (101,'QUALIFIER_TERM','database')
  937. insert into spt_server_info
  938.     values (102,'NAMED_TRANSACTIONS','Y')
  939. insert into spt_server_info
  940.     values (103,'SPROC_AS_LANGUAGE','Y')
  941. insert into spt_server_info
  942.     values (104,'ACCESSIBLE_SPROC','Y')
  943. insert into spt_server_info
  944.     values (105,'MAX_INDEX_COLS','16')
  945. insert into spt_server_info
  946.     values (106,'RENAME_TABLE','Y')
  947. insert into spt_server_info
  948.     values (107,'RENAME_COLUMN','Y')
  949.  
  950. if (charindex('8.00', @@version) > 0)
  951. begin
  952.     /* Columns may be dropped on 8.0 or later */
  953.     insert into spt_server_info
  954.         values (108,'DROP_COLUMN','Y')
  955. end
  956. else
  957. begin
  958.     insert into spt_server_info
  959.         values (108,'DROP_COLUMN','N')
  960. end
  961.  
  962. if (charindex('8.00', @@version) > 0)
  963. begin
  964.     /* Columns size may be changed on 8.0 or later */
  965.     insert into spt_server_info
  966.         values (109,'INCREASE_COLUMN_LENGTH','Y')
  967. end
  968. else
  969. begin
  970.     insert into spt_server_info
  971.         values (109,'INCREASE_COLUMN_LENGTH','N')
  972. end
  973.  
  974. if (charindex('6.50', @@version) = 0 and
  975.     charindex('7.00', @@version) = 0 and
  976.     charindex('8.00', @@version) = 0)
  977. begin
  978.     insert into spt_server_info
  979.         values (110,'DDL_IN_TRANSACTION','N')
  980. end
  981. else
  982. begin
  983.     insert into spt_server_info
  984.         values (110,'DDL_IN_TRANSACTION','Y')
  985. end
  986.  
  987.  
  988. if (charindex('8.00', @@version) > 0)
  989. begin
  990.     /* Descending indexes allowed on 8.0 or later */
  991.     insert into spt_server_info
  992.         values (111,'DESCENDING_INDEXES','Y')
  993. end
  994. else
  995. begin
  996.     insert into spt_server_info
  997.         values (111,'DESCENDING_INDEXES','N')
  998. end
  999.  
  1000. insert into spt_server_info
  1001.     values (112,'SP_RENAME','Y')
  1002. insert into spt_server_info
  1003.     values (113,'REMOTE_SPROC','Y')
  1004. insert into spt_server_info
  1005.     values (500,'SYS_SPROC_VERSION','8.00.375')
  1006. go
  1007.  
  1008. if (charindex('7.00', @@version) > 0 or
  1009.     charindex('8.00', @@version) > 0)
  1010. begin    /*    Update values for 8.0 server */
  1011.     update spt_server_info set attribute_value = '128'
  1012.         where attribute_id in (12,13,14,15,100)
  1013. end
  1014. go
  1015.  
  1016. grant select on spt_server_info to public
  1017. go
  1018.  
  1019. print 'creating sp_column_privileges'
  1020. go
  1021.  
  1022. /*    Procedure for pre 6.50 server */
  1023. CREATE PROCEDURE sp_column_privileges (
  1024.             @table_name         varchar(32),
  1025.             @table_owner        varchar(32) = null,
  1026.             @table_qualifier    varchar(32) = null,
  1027.             @column_name        varchar(96) = null)    /* 3*32 */
  1028. as
  1029.  
  1030.     set nocount on
  1031.     declare @table_id     int
  1032.     DECLARE @full_table_name    varchar(65)    /* 2*32 + 1 */
  1033.     declare @low smallint                     /* range of userids to check */
  1034.     declare @high smallint
  1035.     declare @owner_uid smallint
  1036.  
  1037.     select @low = 0, @high = 32767
  1038.  
  1039.     if @column_name is null /*    If column name not supplied, match all */
  1040.         select @column_name = '%'
  1041.  
  1042.     if @table_qualifier is not null
  1043.     begin
  1044.         if db_name() <> @table_qualifier
  1045.         begin    /* If qualifier doesn't match current database */
  1046.             raiserror 20001 '~~Rush_5~~'
  1047.             return
  1048.         end
  1049.     end
  1050.     if @table_owner is null
  1051.     begin    /* If unqualified table name */
  1052.         SELECT @full_table_name = @table_name
  1053.     end
  1054.     else
  1055.     begin    /* Qualified table name */
  1056.         SELECT @full_table_name = @table_owner + '.' + @table_name
  1057.     end
  1058.     /*    Get Object ID */
  1059.     select @table_id = object_id(@full_table_name)
  1060.  
  1061.     if (@@trancount <> 0)
  1062.     begin    /* If inside a transaction */
  1063.         raiserror 20003 '~~Rush_6~~'
  1064.         return
  1065.     end
  1066.  
  1067.     /*
  1068.     ** We need to create a table which will contain a row for every row to
  1069.     ** be returned to the client.
  1070.     */
  1071.  
  1072.     create table #column_priv1(
  1073.         COLUMN_NAME             varchar(32) NOT NULL,
  1074.         grantor                 smallint NOT NULL,
  1075.         grantee                 smallint NOT NULL,
  1076.         select_privilege        bit,
  1077.         select_grantable        bit,
  1078.         insert_privilege        bit,
  1079.         insert_grantable        bit,
  1080.         update_privilege        bit,
  1081.         update_grantable        bit,
  1082.         references_privilege    bit,
  1083.         references_grantable    bit,
  1084.         uid                     smallint NOT NULL,
  1085.         gid                     smallint NOT NULL)
  1086.  
  1087. /*
  1088. ** insert a row for the table owner (who has all permissions)
  1089. */
  1090.     select @owner_uid = (
  1091.         select uid
  1092.         from sysobjects
  1093.         where id = @table_id)
  1094.  
  1095.     if (charindex('6.00', @@version) > 0)
  1096.     begin
  1097.         insert into #column_priv1
  1098.             select
  1099.                 c.name,
  1100.                 u.uid,
  1101.                 @owner_uid,
  1102.                 0,
  1103.                 1,
  1104.                 0,
  1105.                 1,
  1106.                 0,
  1107.                 1,
  1108.                 0,
  1109.                 1,
  1110.                 @owner_uid,
  1111.                 0
  1112.             from syscolumns c, sysusers u
  1113.             where id = @table_id
  1114.                 and c.number = 0
  1115.                 and u.uid = 1        /* grantor is dbo of database */
  1116.     end
  1117.     else
  1118.     begin
  1119.         insert into #column_priv1
  1120.             select
  1121.                 c.name,
  1122.                 u.uid,
  1123.                 @owner_uid,
  1124.                 0,
  1125.                 1,
  1126.                 0,
  1127.                 1,
  1128.                 0,
  1129.                 1,
  1130.                 0,
  1131.                 0,
  1132.                 @owner_uid,
  1133.                 0
  1134.             from syscolumns c, sysusers u
  1135.             where id = @table_id
  1136.                 and c.number = 0
  1137.                 and u.uid = 1        /* grantor is dbo of database */
  1138.     end
  1139. /*
  1140. ** now stick in a row for every column for every user in the database
  1141. ** we will need to weed out those who have no permissions later
  1142. ** (and yes this is a cartesion product: the uid field in sysprotects
  1143. ** can also have a group id, in which case we need to extend those
  1144. ** privileges to all group members).
  1145. */
  1146.  
  1147.     insert into #column_priv1
  1148.         select distinct
  1149.             c.name,
  1150.             o.uid,
  1151.             u.uid,
  1152.             0,
  1153.             0,
  1154.             0,
  1155.             0,
  1156.             0,
  1157.             0,
  1158.             0,
  1159.             0,
  1160.             u.uid,
  1161.             u.gid
  1162.         from sysusers u, syscolumns c, sysobjects o
  1163.         where o.id = @table_id
  1164.             and c.id = o.id
  1165.             and c.number = 0
  1166.             and u.gid <> u.uid
  1167.             and u.uid <> @owner_uid
  1168.  
  1169.     /*
  1170.     ** we need to create another temporary table to contain all the various
  1171.     ** protection information for the table in question
  1172.     */
  1173.     create table #protects (
  1174.                 uid         smallint NOT NULL,
  1175.                 grantor        smallint NOT NULL,
  1176.                 action        tinyint NOT NULL,
  1177.                 protecttype tinyint NOT NULL,
  1178.                 name        varchar(32) NOT NULL)
  1179.  
  1180.     insert into #protects
  1181.         select
  1182.             p.uid,
  1183.             p.uid,
  1184.             p.action,
  1185.             p.protecttype,
  1186.             isnull(col_name(id, c.number), '~All')
  1187.             from
  1188.                 sysprotects p,
  1189.                 master.dbo.spt_values c,
  1190.                 master.dbo.spt_values a,
  1191.                 master.dbo.spt_values b
  1192.             where
  1193.                 convert(tinyint, substring(isnull(p.columns, 0x1), c.low, 1))
  1194.                     & c.high <> 0
  1195.                     and c.number <= (
  1196.                         select count(*)
  1197.                         from syscolumns
  1198.                         where id = @table_id)
  1199.                 and c.type = 'P'
  1200.                 and a.type = 'T'
  1201.                 and a.number = p.action
  1202.                 and p.action in (193,195,197,26)
  1203.                 and b.type = 'T'
  1204.                 and b.number = p.protecttype
  1205.                 and p.id = @table_id
  1206.                 and p.uid between @low and @high
  1207.  
  1208.  
  1209.     update #column_priv1
  1210.     set select_privilege = 1
  1211.         from #protects p
  1212.     where
  1213.         p.protecttype = 205
  1214.         and p.action = 193
  1215.         and (p.name = #column_priv1.COLUMN_NAME
  1216.             or name = '~All')
  1217.         and (p.uid = 0
  1218.             or p.uid = #column_priv1.gid
  1219.             or p.uid = #column_priv1.uid)
  1220.         and not exists (
  1221.             select * from #protects
  1222.             where
  1223.                 protecttype = 206
  1224.                 and action = 193
  1225.                 and (name = #column_priv1.COLUMN_NAME
  1226.                     or name = '~All')
  1227.                 and ( uid = 0
  1228.                     or uid = #column_priv1.gid
  1229.                     or uid = #column_priv1.uid))
  1230.  
  1231.     update #column_priv1
  1232.     set insert_privilege = 1
  1233.         from #protects p
  1234.     where
  1235.         p.protecttype = 205
  1236.         and p.action = 195
  1237.         and (p.name = #column_priv1.COLUMN_NAME
  1238.             or name = '~All')
  1239.         and (p.uid = 0
  1240.             or p.uid = #column_priv1.gid
  1241.             or p.uid = #column_priv1.uid)
  1242.         and not exists (
  1243.             select * from #protects
  1244.             where
  1245.                 protecttype = 206
  1246.                 and action = 195
  1247.                 and (name = #column_priv1.COLUMN_NAME
  1248.                        or name = '~All')
  1249.                 and (uid = 0
  1250.                     or uid = #column_priv1.gid
  1251.                     or uid = #column_priv1.uid))
  1252.  
  1253.     update #column_priv1
  1254.     set update_privilege = 1
  1255.         from #protects p
  1256.     where
  1257.         p.protecttype = 205
  1258.         and p.action = 197
  1259.         and (p.name = #column_priv1.COLUMN_NAME
  1260.             or name = '~All')
  1261.         and (p.uid = 0
  1262.             or p.uid = #column_priv1.gid
  1263.             or p.uid = #column_priv1.uid)
  1264.         and not exists (
  1265.             select * from #protects
  1266.                 where protecttype = 206
  1267.                 and action = 197
  1268.                 and (name = #column_priv1.COLUMN_NAME
  1269.                     or name = '~All')
  1270.                 and (uid = 0
  1271.                     or uid = #column_priv1.gid
  1272.                     or uid = #column_priv1.uid))
  1273.  
  1274.     update #column_priv1
  1275.     set references_privilege = 1
  1276.         from #protects p
  1277.     where
  1278.         p.protecttype = 205
  1279.         and p.action = 26
  1280.         and (p.name = #column_priv1.COLUMN_NAME
  1281.             or name = '~All')
  1282.         and (p.uid = 0
  1283.             or p.uid = #column_priv1.gid
  1284.             or p.uid = #column_priv1.uid)
  1285.         and not exists (
  1286.             select * from #protects
  1287.                 where protecttype = 206
  1288.                 and action = 26
  1289.                 and (name = #column_priv1.COLUMN_NAME
  1290.                     or name = '~All')
  1291.                 and (uid = 0
  1292.                     or uid = #column_priv1.gid
  1293.                     or uid = #column_priv1.uid))
  1294.  
  1295.     update #column_priv1
  1296.     set select_grantable = 1
  1297.         from #protects p
  1298.     where
  1299.         p.protecttype = 204
  1300.         and p.action = 193
  1301.         and (p.name = #column_priv1.COLUMN_NAME
  1302.             or name = '~All')
  1303.         and (p.uid = 0
  1304.             or p.uid = #column_priv1.gid
  1305.             or p.uid = #column_priv1.uid)
  1306.         and not exists (
  1307.             select * from #protects
  1308.             where
  1309.                 protecttype = 206
  1310.                 and action = 193
  1311.                 and (name = #column_priv1.COLUMN_NAME
  1312.                     or name = '~All')
  1313.                 and ( uid = 0
  1314.                     or uid = #column_priv1.gid
  1315.                     or uid = #column_priv1.uid))
  1316.  
  1317.     update #column_priv1
  1318.     set insert_grantable = 1
  1319.         from #protects p
  1320.     where
  1321.         p.protecttype = 204
  1322.         and p.action = 195
  1323.         and (p.name = #column_priv1.COLUMN_NAME
  1324.             or name = '~All')
  1325.         and (p.uid = 0
  1326.             or p.uid = #column_priv1.gid
  1327.             or p.uid = #column_priv1.uid)
  1328.         and not exists (
  1329.             select * from #protects
  1330.             where
  1331.                 protecttype = 206
  1332.                 and action = 195
  1333.                 and (name = #column_priv1.COLUMN_NAME
  1334.                     or name = '~All')
  1335.                 and ( uid = 0
  1336.                     or uid = #column_priv1.gid
  1337.                     or uid = #column_priv1.uid))
  1338.  
  1339.     update #column_priv1
  1340.     set update_grantable = 1
  1341.         from #protects p
  1342.     where
  1343.         p.protecttype = 204
  1344.         and p.action = 197
  1345.         and (p.name = #column_priv1.COLUMN_NAME
  1346.             or name = '~All')
  1347.         and (p.uid = 0
  1348.             or p.uid = #column_priv1.gid
  1349.             or p.uid = #column_priv1.uid)
  1350.         and not exists (
  1351.             select * from #protects
  1352.             where
  1353.                 protecttype = 206
  1354.                 and action = 197
  1355.                 and (name = #column_priv1.COLUMN_NAME
  1356.                     or name = '~All')
  1357.                 and ( uid = 0
  1358.                     or uid = #column_priv1.gid
  1359.                     or uid = #column_priv1.uid))
  1360.  
  1361.     update #column_priv1
  1362.     set references_grantable = 1
  1363.         from #protects p
  1364.     where
  1365.         p.protecttype = 204
  1366.         and p.action = 26
  1367.         and (p.name = #column_priv1.COLUMN_NAME
  1368.             or name = '~All')
  1369.         and (p.uid = 0
  1370.             or p.uid = #column_priv1.gid
  1371.             or p.uid = #column_priv1.uid)
  1372.         and not exists (
  1373.             select * from #protects
  1374.             where
  1375.                 protecttype = 206
  1376.                 and action = 26
  1377.                 and (name = #column_priv1.COLUMN_NAME
  1378.                     or name = '~All')
  1379.                 and ( uid = 0
  1380.                     or uid = #column_priv1.gid
  1381.                     or uid = #column_priv1.uid))
  1382.  
  1383.     create table #column_priv2(
  1384.         COLUMN_NAME     varchar(32) NOT NULL,
  1385.         grantor         smallint NULL,
  1386.         grantee         smallint NOT NULL,
  1387.         PRIVILEGE        varchar(32) NOT NULL,
  1388.         IS_GRANTABLE    varchar(3) NULL)
  1389.  
  1390.     insert into #column_priv2
  1391.         select
  1392.             COLUMN_NAME,
  1393.             grantor,
  1394.             grantee,
  1395.             'SELECT',
  1396.             'NO'
  1397.         from #column_priv1
  1398.         where select_privilege = 1 and select_grantable    = 0
  1399.  
  1400.     insert into #column_priv2
  1401.         select
  1402.             COLUMN_NAME,
  1403.             grantor,
  1404.             grantee,
  1405.             'INSERT',
  1406.             'NO'
  1407.         from #column_priv1
  1408.         where insert_privilege = 1 and insert_grantable = 0
  1409.  
  1410.     insert into #column_priv2
  1411.         select
  1412.             COLUMN_NAME,
  1413.             grantor,
  1414.             grantee,
  1415.             'UPDATE',
  1416.             'NO'
  1417.         from #column_priv1
  1418.         where update_privilege = 1 and update_grantable = 0
  1419.  
  1420.     insert into #column_priv2
  1421.         select
  1422.             COLUMN_NAME,
  1423.             grantor,
  1424.             grantee,
  1425.             'REFERENCES',
  1426.             'NO'
  1427.         from #column_priv1
  1428.         where references_privilege = 1 and references_grantable = 0
  1429.  
  1430.     insert into #column_priv2
  1431.         select
  1432.             COLUMN_NAME,
  1433.             grantor,
  1434.             grantee,
  1435.             'SELECT',
  1436.             'YES'
  1437.         from #column_priv1
  1438.         where select_grantable = 1
  1439.  
  1440.     insert into #column_priv2
  1441.         select
  1442.             COLUMN_NAME,
  1443.             grantor,
  1444.             grantee,
  1445.             'INSERT',
  1446.             'YES'
  1447.         from #column_priv1
  1448.         where insert_grantable = 1
  1449.  
  1450.     insert into #column_priv2
  1451.         select
  1452.             COLUMN_NAME,
  1453.             grantor,
  1454.             grantee,
  1455.             'UPDATE',
  1456.             'YES'
  1457.         from #column_priv1
  1458.         where update_grantable = 1
  1459.  
  1460.     insert into #column_priv2
  1461.         select
  1462.             COLUMN_NAME,
  1463.             grantor,
  1464.             grantee,
  1465.             'REFERENCES',
  1466.             'YES'
  1467.         from #column_priv1
  1468.         where references_grantable = 1
  1469.  
  1470.     select
  1471.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1472.         convert(varchar(32),user_name(@owner_uid)) TABLE_OWNER,
  1473.         @table_name TABLE_NAME,
  1474.         COLUMN_NAME,
  1475.         convert(varchar(32),user_name(grantor)) GRANTOR,
  1476.         convert(varchar(32),user_name(grantee)) GRANTEE,
  1477.         PRIVILEGE,
  1478.         IS_GRANTABLE
  1479.     from #column_priv2
  1480.     where COLUMN_NAME like @column_name
  1481.     order by 4, 7
  1482. go
  1483.  
  1484. if (charindex('6.50', @@version) = 0 and
  1485.     charindex('7.00', @@version) = 0 and
  1486.     charindex('8.00', @@version) = 0)
  1487. begin
  1488.     print ''
  1489.     print ''
  1490.     print 'Warning:'
  1491.     print 'you are installing the stored procedures '
  1492.     print 'on a pre 6.50 SQL Server.'
  1493.     print 'Ignore the following errors.'
  1494. end
  1495. else
  1496.     drop proc sp_column_privileges
  1497. go
  1498.  
  1499. /*    Procedure for 6.50 server */
  1500. CREATE PROCEDURE sp_column_privileges (
  1501.             @table_name         varchar(32),
  1502.             @table_owner        varchar(32) = null,
  1503.             @table_qualifier    varchar(32) = null,
  1504.             @column_name        varchar(96) = null)    /* 3*32 */
  1505. as
  1506.  
  1507.     declare @table_id     int
  1508.  
  1509.     if @column_name is null /*    If column name not supplied, match all */
  1510.         select @column_name = '%'
  1511.  
  1512.     if @table_qualifier is not null
  1513.     begin
  1514.         if db_name() <> @table_qualifier
  1515.         begin    /* If qualifier doesn't match current database */
  1516.             raiserror (15250, -1,-1)
  1517.             return
  1518.         end
  1519.     end
  1520.     if @table_owner is null
  1521.     begin    /* If unqualified table name */
  1522.         select @table_id = object_id(@table_name)
  1523.     end
  1524.     else
  1525.     begin    /* Qualified table name */
  1526.         select @table_id = object_id(@table_owner + '.' + @table_name)
  1527.     end
  1528.  
  1529.     select
  1530.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1531.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  1532.         @table_name TABLE_NAME,
  1533.         convert(varchar(32),c.name) COLUMN_NAME,
  1534.         convert(varchar(32),user_name(p.grantor)) GRANTOR,
  1535.         convert(varchar(32),user_name(u.uid)) GRANTEE,
  1536.         convert (varchar(32),case p.action
  1537.              when 193 then 'SELECT'
  1538.              when 195 then 'INSERT'
  1539.              when 197 then 'UPDATE'
  1540.              else 'REFERENCES'
  1541.         end) PRIVILEGE,
  1542.         convert (varchar(3),case when p.protecttype = 205 then 'NO'
  1543.             else 'YES'
  1544.         end) IS_GRANTABLE
  1545.     from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  1546.     where
  1547.         c.id = @table_id
  1548.         and c.name like @column_name
  1549.         and c.id = p.id
  1550.         and c.id = o.id
  1551.         and case substring(p.columns, 1, 1) & 1
  1552.                 when NULL then 255    /* all columns have permission */
  1553.                 when 0 then convert(tinyint, substring(p.columns, v.low, 1))
  1554.                 else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
  1555.             end
  1556.             & v.high <> 0            /* permission applies to this column */
  1557.         and v.number <= (select count(*) from syscolumns
  1558.             where id = @table_id)    /* ranges from 1 to # of columns in table */
  1559.         and v.type = 'P'
  1560.         and v.number = c.colid
  1561.             /* expand groups */
  1562.         and ((p.uid = u.uid and u.uid <> u.gid) or
  1563.              (p.uid = u.gid and u.uid <> u.gid))
  1564.         and p.protecttype <> 206    /* only grant rows */
  1565.         and p.action in (26,193,195,197)
  1566.         and o.uid <> u.uid            /* no rows for owner */
  1567.         and not exists (            /* exclude revoke'd privileges */
  1568.             select *
  1569.             from sysprotects p1
  1570.             where
  1571.                 p1.protecttype = 206
  1572.                 and p1.action = p.action
  1573.                 and p1.id = p.id
  1574.                 and p1.uid = u.uid
  1575.                 and case substring(p1.columns, 1, 1) & 1
  1576.                         when NULL then 255    /* all columns have permission */
  1577.                         when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  1578.                                             else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
  1579.                     end
  1580.                     & v.high <> 0)            /* permission applies to this column */
  1581.     union
  1582.     select    /*    Add rows for table owner */
  1583.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  1584.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  1585.         @table_name TABLE_NAME,
  1586.         convert(varchar(32),col_name(@table_id, c.colid)) COLUMN_NAME,
  1587.         convert(varchar(32),user_name(u.uid)) grantor,
  1588.         convert(varchar(32),user_name(o.uid)) grantee,
  1589.         convert (varchar(32),case v.number
  1590.             when 193 then 'SELECT'
  1591.             when 195 then 'INSERT'
  1592.             when 197 then 'UPDATE'
  1593.             else 'REFERENCES'
  1594.         end) PRIVILEGE,
  1595.         convert(varchar(3),'YES') IS_GRANTABLE
  1596.     from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  1597.     where
  1598.         c.id = @table_id
  1599.         and c.name like @column_name
  1600.         and c.id = o.id
  1601.         and u.uid = 1        /* grantor is dbo of database */
  1602.         and v.type = 'P'    /* cross product to get all exposed privileges */
  1603.         and v.number in (26,193,195,197)
  1604.         and not exists (    /* exclude revoke'd privileges */
  1605.             select *
  1606.             from sysprotects p1
  1607.             where
  1608.                 p1.protecttype = 206
  1609.                 and p1.action = v.number
  1610.                 and p1.id = o.id
  1611.                 and p1.uid = o.uid)
  1612.     order by 4, 7
  1613. go
  1614.  
  1615.  
  1616.  
  1617. if (charindex('7.00', @@version) = 0 and
  1618.     charindex('8.00', @@version) = 0)
  1619. begin
  1620.     print ''
  1621.     print ''
  1622.     print 'Warning:'
  1623.     print 'you are installing the stored procedures '
  1624.     print 'on a pre 8.0 SQL Server.'
  1625.     print 'Ignore the following errors.'
  1626. end
  1627. else
  1628.     drop proc sp_column_privileges
  1629. go
  1630.  
  1631. /*    Procedure for 8.0 server */
  1632. CREATE PROCEDURE sp_column_privileges (
  1633.             @table_name         sysname,
  1634.             @table_owner        sysname = null,
  1635.             @table_qualifier    sysname = null,
  1636.             @column_name        nvarchar(384) = null)    /* 3*128 */
  1637. as
  1638.  
  1639.     declare @table_id     int
  1640.  
  1641.     if @column_name is null /*    If column name not supplied, match all */
  1642.         select @column_name = '%'
  1643.  
  1644.     if @table_qualifier is not null
  1645.     begin
  1646.         if db_name() <> @table_qualifier
  1647.         begin    /* If qualifier doesn't match current database */
  1648.             raiserror (15250, -1,-1)
  1649.             return
  1650.         end
  1651.     end
  1652.     if @table_owner is null
  1653.     begin    /* If unqualified table name */
  1654.         select @table_id = object_id(quotename(@table_name))
  1655.     end
  1656.     else
  1657.     begin    /* Qualified table name */
  1658.         if @table_owner = N''
  1659.         begin    /* If empty owner name */
  1660.             select @table_id = 0
  1661.         end
  1662.         else
  1663.         begin
  1664.             select @table_id = object_id(quotename(@table_owner) +
  1665.                 '.' + quotename(@table_name))
  1666.         end
  1667.     end
  1668.  
  1669.     select
  1670.         convert(sysname,db_name()) TABLE_QUALIFIER,
  1671.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  1672.         @table_name TABLE_NAME,
  1673.         convert(sysname,c.name) COLUMN_NAME,
  1674.         convert(sysname,user_name(p.grantor)) GRANTOR,
  1675.         convert(sysname,user_name(u.uid)) GRANTEE,
  1676.         convert (varchar(32),case p.action
  1677.              when 193 then 'SELECT'
  1678.              when 195 then 'INSERT'
  1679.              when 197 then 'UPDATE'
  1680.              else 'REFERENCES'
  1681.         end) PRIVILEGE,
  1682.         convert (varchar(3),case when p.protecttype = 205 then 'NO'
  1683.             else 'YES'
  1684.         end) IS_GRANTABLE
  1685.     from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  1686.     where
  1687.         c.id = @table_id
  1688.         and c.name like @column_name
  1689.         and c.id = p.id
  1690.         and c.id = o.id
  1691.         and case substring(p.columns, 1, 1) & 1
  1692.                 when NULL then 255    /* all columns have permission */
  1693.                 when 0 then convert(tinyint, substring(p.columns, v.low, 1))
  1694.                 else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
  1695.             end
  1696.             & v.high <> 0            /* permission applies to this column */
  1697.         and v.number <= (select count(*) from syscolumns
  1698.             where id = @table_id)    /* ranges from 1 to # of columns in table */
  1699.         and v.type = N'P'
  1700.         and v.number = c.colid
  1701.             /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  1702.         and (u.uid > 0 and u.uid < 16384)
  1703.         and ((p.uid = u.uid) or 
  1704.              (p.uid = m.groupuid and u.uid = m.memberuid))
  1705.         and p.protecttype <> 206    /* only grant rows */
  1706.         and p.action in (26,193,195,197)
  1707.         and o.uid <> u.uid            /* no rows for owner */
  1708.         and not exists (            /* exclude revoke'd privileges */
  1709.             select *
  1710.             from sysprotects p1
  1711.             where
  1712.                 p1.protecttype = 206
  1713.                 and p1.action = p.action
  1714.                 and p1.id = p.id
  1715.                 and p1.uid = u.uid
  1716.                 and case substring(p1.columns, 1, 1) & 1
  1717.                         when NULL then 255    /* all columns have permission */
  1718.                         when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  1719.                                             else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
  1720.                     end
  1721.                     & v.high <> 0)            /* permission applies to this column */
  1722.     union
  1723.     select    /*    Add rows for table owner */
  1724.         convert(sysname,db_name()) TABLE_QUALIFIER,
  1725.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  1726.         @table_name TABLE_NAME,
  1727.         convert(sysname,col_name(@table_id, c.colid)) COLUMN_NAME,
  1728.         convert(sysname,user_name(u.uid)) grantor,
  1729.         convert(sysname,user_name(o.uid)) grantee,
  1730.         convert (varchar(32),case v.number
  1731.             when 193 then 'SELECT'
  1732.             when 195 then 'INSERT'
  1733.             when 197 then 'UPDATE'
  1734.             else 'REFERENCES'
  1735.         end) PRIVILEGE,
  1736.         convert(varchar(3),'YES') IS_GRANTABLE
  1737.     from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  1738.     where
  1739.         c.id = @table_id
  1740.         and c.name like @column_name
  1741.         and c.id = o.id
  1742.         and u.uid = 1        /* grantor is 'dbo' of database */
  1743.         and v.type = N'P'    /* cross product to get all exposed privileges */
  1744.         and v.number in (26,193,195,197)
  1745.         and not exists (    /* exclude revoke'd privileges */
  1746.             select *
  1747.             from sysprotects p1
  1748.             where
  1749.                 p1.protecttype = 206
  1750.                 and p1.action = v.number
  1751.                 and p1.id = o.id
  1752.                 and p1.uid = o.uid)
  1753.     order by 4, 7
  1754. go
  1755.  
  1756.  
  1757. grant execute on sp_column_privileges to public
  1758. go
  1759.  
  1760. dump tran master with no_log
  1761. go
  1762.  
  1763. print 'creating sp_columns'
  1764. go
  1765.  
  1766. /*    Procedure for pre-6.0 server */
  1767. CREATE PROCEDURE sp_columns (
  1768.                  @table_name        varchar(96),
  1769.                  @table_owner        varchar(96) = null,
  1770.                  @table_qualifier    varchar(32) = null,
  1771.                  @column_name        varchar(96) = null,
  1772.                  @ODBCVer            int = 2)
  1773. AS
  1774.     DECLARE @full_table_name varchar(193)
  1775.     DECLARE @table_id        int
  1776.  
  1777.     if @ODBCVer <> 3
  1778.         select @ODBCVer = 2
  1779.     if @column_name is null /*    If column name not supplied, match all */
  1780.         select @column_name = '%'
  1781.     if @table_qualifier is not null
  1782.     begin
  1783.         if db_name() <> @table_qualifier
  1784.         begin    /* If qualifier doesn't match current database */
  1785.             raiserror 20001 '~~Rush_5~~'
  1786.             return
  1787.         end
  1788.     end
  1789.     if @table_name is null
  1790.     begin    /*    If table name not supplied, match all */
  1791.         select @table_name = '%'
  1792.     end
  1793.     if @table_owner is null
  1794.     begin    /* If unqualified table name */
  1795.         SELECT @full_table_name = @table_name
  1796.     end
  1797.     else
  1798.     begin    /* Qualified table name */
  1799.         SELECT @full_table_name = @table_owner + '.' + @table_name
  1800.     end
  1801.  
  1802.     /*    Get Object ID */
  1803.     SELECT @table_id = object_id(@full_table_name)
  1804.     if ((charindex('%',@full_table_name) = 0) and
  1805.         (charindex('_',@full_table_name) = 0) and
  1806.         @table_id <> 0)
  1807.     begin
  1808.         /* this block is for the case where there is no pattern
  1809.              matching required for the table name */
  1810.  
  1811.         SELECT
  1812.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1813.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1814.             TABLE_NAME = convert(varchar(32),o.name),
  1815.             COLUMN_NAME = convert(varchar(32),c.name),
  1816.             d.DATA_TYPE,
  1817.             TYPE_NAME = t.name,
  1818.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  1819.             LENGTH = isnull(d.length, convert(int,c.length)),
  1820.             SCALE = d.numeric_scale,
  1821.             d.RADIX,
  1822.             NULLABLE =    /* set nullability from status flag */
  1823.                 convert(smallint, convert(bit, c.status&8)),
  1824.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1825.             COLUMN_DEF = text,
  1826.             d.SQL_DATA_TYPE,
  1827.             d.SQL_DATETIME_SUB,
  1828.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  1829.             ORDINAL_POSITION = convert(int,
  1830.                        (
  1831.                         select count(*)
  1832.                         from syscolumns sc
  1833.                         where sc.id     =  c.id
  1834.                           AND sc.number =  c.number
  1835.                           AND sc.colid  <= c.colid
  1836.                         )),
  1837.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1838.             SS_DATA_TYPE = c.type
  1839.         FROM
  1840.             syscolumns c,
  1841.             sysobjects o,
  1842.             syscomments m,
  1843.             master.dbo.spt_datatype_info d,
  1844.             systypes t
  1845.         WHERE
  1846.             o.id = @table_id
  1847.             AND c.id = o.id
  1848.             AND t.type = d.ss_dtype
  1849.             AND c.length = isnull(d.fixlen, c.length)
  1850.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1851.             AND o.type <> 'P'
  1852.             AND c.usertype = t.usertype
  1853.             AND c.name like @column_name
  1854.             AND c.cdefault *= m.id
  1855.             AND m.colid = 1
  1856.         ORDER BY 17
  1857.     end
  1858.     else
  1859.     begin
  1860.         /* this block is for the case where there IS pattern
  1861.              matching done on the table name */
  1862.         if @table_owner is null /*    If owner not supplied, match all */
  1863.             select @table_owner = '%'
  1864.  
  1865.         SELECT
  1866.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1867.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1868.             TABLE_NAME = convert(varchar(32),o.name),
  1869.             COLUMN_NAME = convert(varchar(32),c.name),
  1870.             d.DATA_TYPE,
  1871.             TYPE_NAME = t.name,
  1872.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  1873.             LENGTH = isnull(d.length, convert(int,c.length)),
  1874.             SCALE = d.numeric_scale,
  1875.             d.RADIX,
  1876.             NULLABLE =    /* set nullability from status flag */
  1877.                 convert(smallint, convert(bit, c.status&8)),
  1878.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  1879.             COLUMN_DEF = text,
  1880.             d.SQL_DATA_TYPE,
  1881.             d.SQL_DATETIME_SUB,
  1882.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  1883.             ORDINAL_POSITION = convert(int,
  1884.                        (
  1885.                         select count(*)
  1886.                         from syscolumns sc
  1887.                         where sc.id     =  c.id
  1888.                           AND sc.number =  c.number
  1889.                           AND sc.colid  <= c.colid
  1890.                         )),
  1891.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  1892.             SS_DATA_TYPE = c.type
  1893.         FROM
  1894.             syscolumns c,
  1895.             sysobjects o,
  1896.             syscomments m,
  1897.             master.dbo.spt_datatype_info d,
  1898.             systypes t
  1899.         WHERE
  1900.             o.name like @table_name
  1901.             AND user_name(o.uid) like @table_owner
  1902.             AND o.id = c.id
  1903.             AND t.type = d.ss_dtype
  1904.             AND c.length = isnull(d.fixlen, c.length)
  1905.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  1906.             AND o.type <> 'P'
  1907.             AND c.usertype = t.usertype
  1908.             AND c.name like @column_name
  1909.             AND c.cdefault *= m.id
  1910.             AND m.colid = 1
  1911.         ORDER BY 2, 3, 17
  1912.     end
  1913. go
  1914.  
  1915. if (charindex('6.00', @@version) = 0 and
  1916.     charindex('6.50', @@version) = 0 and
  1917.     charindex('7.00', @@version) = 0 and
  1918.     charindex('8.00', @@version) = 0)
  1919. begin
  1920.     print ''
  1921.     print ''
  1922.     print 'Warning:'
  1923.     print 'you are installing the stored procedures '
  1924.     print 'on a pre 6.0 SQL Server.'
  1925.     print 'Ignore the following error.'
  1926. end
  1927. else
  1928.     drop proc sp_columns
  1929. go
  1930.  
  1931. /*    Procedure for 6.0 and 6.50 server */
  1932. CREATE PROCEDURE sp_columns (
  1933.                  @table_name        varchar(96),
  1934.                  @table_owner        varchar(96) = null,
  1935.                  @table_qualifier    varchar(32) = null,
  1936.                  @column_name        varchar(96) = null,
  1937.                  @ODBCVer            int = 2)
  1938. AS
  1939.     DECLARE @full_table_name    varchar(193)
  1940.     DECLARE @table_id int
  1941.  
  1942.     if @ODBCVer <> 3
  1943.         select @ODBCVer = 2
  1944.     if @column_name is null /*    If column name not supplied, match all */
  1945.         select @column_name = '%'
  1946.     if @table_qualifier is not null
  1947.     begin
  1948.         if db_name() <> @table_qualifier
  1949.         begin    /* If qualifier doesn't match current database */
  1950.             raiserror (15250, -1,-1)
  1951.             return
  1952.         end
  1953.     end
  1954.     if @table_name is null
  1955.     begin
  1956.         /* If table name not supplied, match all */
  1957.         select @table_name = '%'
  1958.     end
  1959.     if @table_owner is null
  1960.     begin
  1961.         /* If unqualified table name */
  1962.         SELECT @full_table_name = @table_name
  1963.     end
  1964.     else
  1965.     begin
  1966.         /* Qualified table name */
  1967.         SELECT @full_table_name = @table_owner + '.' + @table_name
  1968.     end
  1969.  
  1970.     /* Get Object ID */
  1971.     SELECT @table_id = object_id(@full_table_name)
  1972.     if ((charindex('%',@full_table_name) = 0) and
  1973.         (charindex('[',@full_table_name) = 0) and
  1974.         (charindex('_',@full_table_name) = 0) and
  1975.         @table_id <> 0)
  1976.     begin
  1977.         /* this block is for the case where there is no pattern
  1978.             matching required for the table name */
  1979.  
  1980.         SELECT
  1981.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  1982.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  1983.             TABLE_NAME = convert(varchar(32),o.name),
  1984.             COLUMN_NAME = convert(varchar(32),c.name),
  1985.             DATA_TYPE = d.DATA_TYPE,
  1986.             TYPE_NAME = convert(varchar(32),
  1987.                     case
  1988.                         when t.usertype > 100 or t.usertype in (18,80) then t.name
  1989.                         else d.TYPE_NAME
  1990.                     end),
  1991.             "PRECISION" = convert(int,
  1992.                     case
  1993.                         when d.DATA_TYPE in (6,7) then d.data_precision    /* FLOAT/REAL */
  1994.                         else isnull(convert(int,c.prec), 2147483647)
  1995.                     end),
  1996.             LENGTH = convert(int,
  1997.                     case
  1998.                         when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  1999.                         c.prec+2
  2000.                         else
  2001.                             isnull(d.length, c.length)
  2002.                     end),
  2003.             SCALE = convert(smallint, c.scale),
  2004.             RADIX = d.RADIX,
  2005.             NULLABLE =    /* set nullability from status flag */
  2006.                 convert(smallint, convert(bit, c.status&8)),
  2007.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2008.             COLUMN_DEF = text,
  2009.             SQL_DATA_TYPE = d.SQL_DATA_TYPE,
  2010.             SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,
  2011.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  2012.             ORDINAL_POSITION = convert(int,
  2013.                        (
  2014.                         select count(*)
  2015.                         from syscolumns sc
  2016.                         where sc.id     =  c.id
  2017.                           AND sc.number =  c.number
  2018.                           AND sc.colid  <= c.colid
  2019.                         )),
  2020.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  2021.             SS_DATA_TYPE = c.type
  2022.         FROM
  2023.             syscolumns c,
  2024.             sysobjects o,
  2025.             syscomments m,
  2026.             master.dbo.spt_datatype_info d,
  2027.             systypes t
  2028.         WHERE
  2029.             o.id = @table_id
  2030.             AND c.id = o.id
  2031.             AND t.type = d.ss_dtype
  2032.             AND c.length = isnull(d.fixlen, c.length)
  2033.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2034.             AND o.type <> 'P'
  2035.             AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  2036.             AND c.usertype = t.usertype
  2037.             AND c.name like @column_name
  2038.             AND c.cdefault *= m.id
  2039.             AND m.colid = 1
  2040.         ORDER BY 17
  2041.     end
  2042.     else
  2043.     begin
  2044.         /* this block is for the case where there IS pattern
  2045.             matching done on the table name */
  2046.  
  2047.         if @table_owner is null /*    If owner not supplied, match all */
  2048.             select @table_owner = '%'
  2049.  
  2050.         SELECT
  2051.             TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
  2052.             TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  2053.             TABLE_NAME = convert(varchar(32),o.name),
  2054.             COLUMN_NAME = convert(varchar(32),c.name),
  2055.             DATA_TYPE = d.DATA_TYPE,
  2056.             TYPE_NAME = convert(varchar(32), 
  2057.                 case 
  2058.                     when t.usertype > 100 or t.usertype in (18,80) then t.name
  2059.                     else d.TYPE_NAME
  2060.                 end),
  2061.             "PRECISION" = convert(int,
  2062.                     case
  2063.                         when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2064.                         else isnull(convert(int,c.prec), 2147483647)
  2065.                     end),
  2066.             LENGTH = convert(int,
  2067.                     case
  2068.                         when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  2069.                             c.prec+2
  2070.                         else
  2071.                             isnull(d.length, c.length)
  2072.                     end),
  2073.             SCALE = convert(smallint, c.scale),
  2074.             RADIX = d.RADIX,
  2075.             NULLABLE =    /* set nullability from status flag */
  2076.                 convert(smallint, convert(bit, c.status&8)),
  2077.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2078.             COLUMN_DEF = text,
  2079.             SQL_DATA_TYPE = d.SQL_DATA_TYPE,
  2080.             SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,
  2081.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647) + d.charbin,
  2082.             ORDINAL_POSITION = convert(int,
  2083.                        (
  2084.                         select count(*)
  2085.                         from syscolumns sc
  2086.                         where sc.id     =  c.id
  2087.                           AND sc.number =  c.number
  2088.                           AND sc.colid  <= c.colid
  2089.                         )),
  2090.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO      YES',(c.status&8)+1,3))),
  2091.             SS_DATA_TYPE = c.type
  2092.         FROM
  2093.             syscolumns c,
  2094.             sysobjects o,
  2095.             syscomments m,
  2096.             master.dbo.spt_datatype_info d,
  2097.             systypes t
  2098.         WHERE
  2099.             o.name like @table_name
  2100.             AND user_name(o.uid) like @table_owner
  2101.             AND o.id = c.id
  2102.             AND t.type = d.ss_dtype
  2103.             AND c.length = isnull(d.fixlen, c.length)
  2104.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2105.             AND o.type <> 'P'
  2106.             AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  2107.             AND c.usertype = t.usertype
  2108.             AND c.name like @column_name
  2109.             AND c.cdefault *= m.id
  2110.             AND m.colid = 1
  2111.         ORDER BY 2, 3, 17
  2112.     end
  2113. go
  2114.  
  2115. if (charindex('7.00', @@version) = 0 and
  2116.     charindex('8.00', @@version) = 0)
  2117. begin
  2118.     print ''
  2119.     print ''
  2120.     print 'Warning:'
  2121.     print 'you are installing the stored procedures '
  2122.     print 'on a pre 7.0 SQL Server.'
  2123.     print 'Ignore the following errors.'
  2124. end
  2125. else
  2126.     drop proc sp_columns
  2127. go
  2128.  
  2129. /*    Procedure for 7.0 server */
  2130. CREATE PROCEDURE sp_columns (
  2131.                  @table_name        nvarchar(384),
  2132.                  @table_owner        nvarchar(384) = null,
  2133.                  @table_qualifier    sysname = null,
  2134.                  @column_name        nvarchar(384) = null,
  2135.                  @ODBCVer            int = 2)
  2136. AS
  2137.     DECLARE @full_table_name    nvarchar(769)
  2138.     DECLARE @table_id int
  2139.  
  2140.     if @ODBCVer <> 3
  2141.         select @ODBCVer = 2
  2142.     if @column_name is null /*    If column name not supplied, match all */
  2143.         select @column_name = '%'
  2144.     if @table_qualifier is not null
  2145.     begin
  2146.         if db_name() <> @table_qualifier
  2147.         begin    /* If qualifier doesn't match current database */
  2148.             raiserror (15250, -1,-1)
  2149.             return
  2150.         end
  2151.     end
  2152.     if @table_name is null
  2153.     begin    /*    If table name not supplied, match all */
  2154.         select @table_name = '%'
  2155.     end
  2156.     if @table_owner is null
  2157.     begin    /* If unqualified table name */
  2158.         SELECT @full_table_name = quotename(@table_name)
  2159.     end
  2160.     else
  2161.     begin    /* Qualified table name */
  2162.         if @table_owner = ''
  2163.         begin    /* If empty owner name */
  2164.             SELECT @full_table_name = quotename(@table_owner)
  2165.         end
  2166.         else
  2167.         begin
  2168.             SELECT @full_table_name = quotename(@table_owner) +
  2169.                 '.' + quotename(@table_name)
  2170.         end
  2171.     end
  2172.  
  2173.     /*    Get Object ID */
  2174.     SELECT @table_id = object_id(@full_table_name)
  2175.     if ((isnull(charindex('%', @full_table_name),0) = 0) and
  2176.         (isnull(charindex('[', @table_name),0) = 0) and
  2177.         (isnull(charindex('[', @table_owner),0) = 0) and
  2178.         (isnull(charindex('_', @full_table_name),0) = 0) and
  2179.         @table_id <> 0)
  2180.     begin
  2181.         /* this block is for the case where there is no pattern
  2182.             matching required for the table name */
  2183.         
  2184.         SELECT
  2185.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  2186.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  2187.             TABLE_NAME = convert(sysname,o.name),
  2188.             COLUMN_NAME = convert(sysname,c.name),
  2189.             d.DATA_TYPE,
  2190.             convert (sysname,case
  2191.                 when t.xusertype > 255 then t.name
  2192.                 else d.TYPE_NAME
  2193.             end) TYPE_NAME,
  2194.             convert(int,case
  2195.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2196.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  2197.             end) "PRECISION",
  2198.             convert(int,case
  2199.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  2200.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  2201.                 else
  2202.                     isnull(d.length, c.length)
  2203.             end) LENGTH,
  2204.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  2205.             d.RADIX,
  2206.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  2207.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2208.             COLUMN_DEF = text,
  2209.             d.SQL_DATA_TYPE,
  2210.             d.SQL_DATETIME_SUB,
  2211.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  2212.             ORDINAL_POSITION = convert(int,
  2213.                        (
  2214.                         select count(*)
  2215.                         from syscolumns sc
  2216.                         where sc.id     =  c.id
  2217.                           AND sc.number =  c.number
  2218.                           AND sc.colid  <= c.colid
  2219.                         )),
  2220.             IS_NULLABLE = convert(varchar(254),
  2221.                 substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
  2222.             SS_DATA_TYPE = c.type
  2223.         FROM
  2224.             sysobjects o,
  2225.             master.dbo.spt_datatype_info d,
  2226.             systypes t,
  2227.             syscolumns c
  2228.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  2229.                 AND m.colid = 1
  2230.         WHERE
  2231.             o.id = @table_id
  2232.             AND c.id = o.id
  2233.             AND t.xtype = d.ss_dtype
  2234.             AND c.length = isnull(d.fixlen, c.length)
  2235.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2236.             AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
  2237.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  2238.             AND c.xusertype = t.xusertype
  2239.             AND c.name like @column_name
  2240.         ORDER BY 17
  2241.     end
  2242.     else
  2243.     begin
  2244.         /* this block is for the case where there IS pattern
  2245.             matching done on the table name */
  2246.  
  2247.         if @table_owner is null /*    If owner not supplied, match all */
  2248.             select @table_owner = '%'
  2249.  
  2250.         SELECT
  2251.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  2252.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  2253.             TABLE_NAME = convert(sysname,o.name),
  2254.             COLUMN_NAME = convert(sysname,c.name),
  2255.             d.DATA_TYPE,
  2256.             convert (sysname,case
  2257.                 when t.xusertype > 255 then t.name
  2258.                 else d.TYPE_NAME
  2259.             end) TYPE_NAME,
  2260.             convert(int,case
  2261.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2262.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  2263.             end) "PRECISION",
  2264.             convert(int,case
  2265.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  2266.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  2267.                 else
  2268.                     isnull(d.length, c.length)
  2269.             end) LENGTH,
  2270.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  2271.             d.RADIX,
  2272.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  2273.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2274.             COLUMN_DEF = text,
  2275.             d.SQL_DATA_TYPE,
  2276.             d.SQL_DATETIME_SUB,
  2277.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  2278.             ORDINAL_POSITION = convert(int,
  2279.                        (
  2280.                         select count(*)
  2281.                         from syscolumns sc
  2282.                         where sc.id     =  c.id
  2283.                           AND sc.number =  c.number
  2284.                           AND sc.colid  <= c.colid
  2285.                         )),
  2286.             IS_NULLABLE = convert(varchar(254),
  2287.                 rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
  2288.             SS_DATA_TYPE = c.type
  2289.         FROM
  2290.             sysobjects o,
  2291.             master.dbo.spt_datatype_info d,
  2292.             systypes t,
  2293.             syscolumns c
  2294.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  2295.                 AND m.colid = 1
  2296.         WHERE
  2297.             o.name like @table_name
  2298.             AND user_name(o.uid) like @table_owner
  2299.             AND o.id = c.id
  2300.             AND t.xtype = d.ss_dtype
  2301.             AND c.length = isnull(d.fixlen, c.length)
  2302.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2303.             AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
  2304.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  2305.             AND c.xusertype = t.xusertype
  2306.             AND c.name like @column_name
  2307.         ORDER BY 2, 3, 17
  2308.     end
  2309. go
  2310.  
  2311. if (charindex('8.00', @@version) = 0)
  2312. begin
  2313.     print ''
  2314.     print ''
  2315.     print 'Warning:'
  2316.     print 'you are installing the stored procedures '
  2317.     print 'on a pre 8.0 SQL Server.'
  2318.     print 'Ignore the following errors.'
  2319. end
  2320. else
  2321.     drop proc sp_columns
  2322. go
  2323.  
  2324. /*    Procedure for 8.0 server */
  2325. CREATE PROCEDURE sp_columns (
  2326.                  @table_name        nvarchar(384),
  2327.                  @table_owner        nvarchar(384) = null,
  2328.                  @table_qualifier    sysname = null,
  2329.                  @column_name        nvarchar(384) = null,
  2330.                  @ODBCVer            int = 2)
  2331. AS
  2332.     DECLARE @full_table_name    nvarchar(769)
  2333.     DECLARE @table_id int
  2334.  
  2335.     if @ODBCVer <> 3
  2336.         select @ODBCVer = 2
  2337.     if @column_name is null /*    If column name not supplied, match all */
  2338.         select @column_name = '%'
  2339.     if @table_qualifier is not null
  2340.     begin
  2341.         if db_name() <> @table_qualifier
  2342.         begin    /* If qualifier doesn't match current database */
  2343.             raiserror (15250, -1,-1)
  2344.             return
  2345.         end
  2346.     end
  2347.     if @table_name is null
  2348.     begin    /*    If table name not supplied, match all */
  2349.         select @table_name = '%'
  2350.     end
  2351.     if @table_owner is null
  2352.     begin    /* If unqualified table name */
  2353.         SELECT @full_table_name = quotename(@table_name)
  2354.     end
  2355.     else
  2356.     begin    /* Qualified table name */
  2357.         if @table_owner = ''
  2358.         begin    /* If empty owner name */
  2359.             SELECT @full_table_name = quotename(@table_owner)
  2360.         end
  2361.         else
  2362.         begin
  2363.             SELECT @full_table_name = quotename(@table_owner) +
  2364.                 '.' + quotename(@table_name)
  2365.         end
  2366.     end
  2367.  
  2368.     /*    Get Object ID */
  2369.     SELECT @table_id = object_id(@full_table_name)
  2370.     if ((isnull(charindex('%', @full_table_name),0) = 0) and
  2371.         (isnull(charindex('[', @table_name),0) = 0) and
  2372.         (isnull(charindex('[', @table_owner),0) = 0) and
  2373.         (isnull(charindex('_', @full_table_name),0) = 0) and
  2374.         @table_id <> 0)
  2375.     begin
  2376.         /* this block is for the case where there is no pattern
  2377.             matching required for the table name */
  2378.         
  2379.         SELECT
  2380.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  2381.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  2382.             TABLE_NAME = convert(sysname,o.name),
  2383.             COLUMN_NAME = convert(sysname,c.name),
  2384.             d.DATA_TYPE,
  2385.             convert (sysname,case
  2386.                 when t.xusertype > 255 then t.name
  2387.                 else d.TYPE_NAME collate database_default
  2388.             end) TYPE_NAME,
  2389.             convert(int,case
  2390.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2391.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  2392.             end) "PRECISION",
  2393.             convert(int,case
  2394.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  2395.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  2396.                 else
  2397.                     isnull(d.length, c.length)
  2398.             end) LENGTH,
  2399.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  2400.             d.RADIX,
  2401.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  2402.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2403.             COLUMN_DEF = text,
  2404.             d.SQL_DATA_TYPE,
  2405.             d.SQL_DATETIME_SUB,
  2406.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  2407.             ORDINAL_POSITION = convert(int,
  2408.                        (
  2409.                         select count(*)
  2410.                         from syscolumns sc
  2411.                         where sc.id     =  c.id
  2412.                           AND sc.number =  c.number
  2413.                           AND sc.colid  <= c.colid
  2414.                         )),
  2415.             IS_NULLABLE = convert(varchar(254),
  2416.                 substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
  2417.             SS_DATA_TYPE = c.type
  2418.         FROM
  2419.             sysobjects o,
  2420.             master.dbo.spt_datatype_info d,
  2421.             systypes t,
  2422.             syscolumns c
  2423.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  2424.                 AND m.colid = 1
  2425.         WHERE
  2426.             o.id = @table_id
  2427.             AND c.id = o.id
  2428.             AND t.xtype = d.ss_dtype
  2429.             AND c.length = isnull(d.fixlen, c.length)
  2430.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2431.             AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
  2432.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  2433.             AND c.xusertype = t.xusertype
  2434.             AND c.name like @column_name
  2435.         ORDER BY 17
  2436.     end
  2437.     else
  2438.     begin
  2439.         /* this block is for the case where there IS pattern
  2440.             matching done on the table name */
  2441.  
  2442.         if @table_owner is null /*    If owner not supplied, match all */
  2443.             select @table_owner = '%'
  2444.  
  2445.         SELECT
  2446.             TABLE_QUALIFIER = convert(sysname,DB_NAME()),
  2447.             TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
  2448.             TABLE_NAME = convert(sysname,o.name),
  2449.             COLUMN_NAME = convert(sysname,c.name),
  2450.             d.DATA_TYPE,
  2451.             convert (sysname,case
  2452.                 when t.xusertype > 255 then t.name
  2453.                 else d.TYPE_NAME collate database_default
  2454.             end) TYPE_NAME,
  2455.             convert(int,case
  2456.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2457.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  2458.             end) "PRECISION",
  2459.             convert(int,case
  2460.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  2461.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  2462.                 else
  2463.                     isnull(d.length, c.length)
  2464.             end) LENGTH,
  2465.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  2466.             d.RADIX,
  2467.             NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
  2468.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  2469.             COLUMN_DEF = text,
  2470.             d.SQL_DATA_TYPE,
  2471.             d.SQL_DATETIME_SUB,
  2472.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  2473.             ORDINAL_POSITION = convert(int,
  2474.                        (
  2475.                         select count(*)
  2476.                         from syscolumns sc
  2477.                         where sc.id     =  c.id
  2478.                           AND sc.number =  c.number
  2479.                           AND sc.colid  <= c.colid
  2480.                         )),
  2481.             IS_NULLABLE = convert(varchar(254),
  2482.                 rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
  2483.             SS_DATA_TYPE = c.type
  2484.         FROM
  2485.             sysobjects o,
  2486.             master.dbo.spt_datatype_info d,
  2487.             systypes t,
  2488.             syscolumns c
  2489.             LEFT OUTER JOIN syscomments m on c.cdefault = m.id
  2490.                 AND m.colid = 1
  2491.         WHERE
  2492.             o.name like @table_name
  2493.             AND user_name(o.uid) like @table_owner
  2494.             AND o.id = c.id
  2495.             AND t.xtype = d.ss_dtype
  2496.             AND c.length = isnull(d.fixlen, c.length)
  2497.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2498.             AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
  2499.             AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  2500.             AND c.xusertype = t.xusertype
  2501.             AND c.name like @column_name
  2502.         ORDER BY 2, 3, 17
  2503.     end
  2504. go
  2505.  
  2506. grant execute on sp_columns to public
  2507. go
  2508.  
  2509. dump tran master with no_log
  2510. go
  2511.  
  2512. print 'creating sp_databases'
  2513. go
  2514.  
  2515. /*    Procedure for pre-7.0 server */
  2516. create proc sp_databases
  2517. as
  2518.     set nocount on
  2519.     /* Use temporary table to sum up database size w/o using group by */
  2520.     create table #databases (
  2521.                   DATABASE_NAME varchar(32) NOT NULL,
  2522.                   size int NOT NULL)
  2523.  
  2524.     /* Insert row for each database */
  2525.     insert into #databases
  2526.         select
  2527.             name,
  2528.             (select sum(size) from master.dbo.sysusages
  2529.                 where dbid = d.dbid)
  2530.         from master.dbo.sysdatabases d
  2531.  
  2532.     select
  2533.          DATABASE_NAME,
  2534.          DATABASE_SIZE = size*2,    /* Convert from 2048 byte pages to K */
  2535.          REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  2536.     from #databases
  2537.     order by 1
  2538. go
  2539.  
  2540. if (charindex('7.00', @@version) = 0 and
  2541.     charindex('8.00', @@version) = 0)
  2542. begin
  2543.     print ''
  2544.     print ''
  2545.     print 'Warning:'
  2546.     print 'you are installing the stored procedures '
  2547.     print 'on a pre 8.0 SQL Server.'
  2548.     print 'Ignore the following errors.'
  2549. end
  2550. else
  2551.     drop proc sp_databases
  2552. go
  2553.  
  2554. /*    Procedure for 8.0 server */
  2555. create proc sp_databases
  2556. as
  2557.     set nocount on
  2558.     declare @name sysname
  2559.     declare @SQL  nvarchar(600)
  2560.  
  2561.     /* Use temporary table to sum up database size w/o using group by */
  2562.     create table #databases (
  2563.                   DATABASE_NAME sysname NOT NULL,
  2564.                   size int NOT NULL)
  2565.  
  2566.     declare c1 cursor for 
  2567.         select name from master.dbo.sysdatabases
  2568.             where has_dbaccess(name) = 1 -- Only look at databases to which we have access
  2569.  
  2570.     open c1
  2571.     fetch c1 into @name
  2572.  
  2573.     while @@fetch_status >= 0
  2574.     begin
  2575.         select @SQL = 'insert into #databases
  2576.                 select N'''+ @name + ''', sum(size) from '
  2577.                 + QuoteName(@name) + '.dbo.sysfiles'
  2578.         /* Insert row for each database */
  2579.         execute (@SQL)
  2580.         fetch c1 into @name
  2581.     end
  2582.     deallocate c1
  2583.  
  2584.     select    
  2585.         DATABASE_NAME,
  2586.         DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */
  2587.         REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  2588.     from #databases
  2589.     order by 1
  2590. go
  2591.  
  2592. grant execute on sp_databases to public
  2593. go
  2594.  
  2595. dump tran master with no_log
  2596. go
  2597.  
  2598. print 'creating sp_datatype_info'
  2599. go
  2600.  
  2601. /*    Procedure for pre-6.0 server */
  2602. create proc sp_datatype_info
  2603.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2604. as
  2605.     if @ODBCVer <> 3
  2606.         select @ODBCVer = 2
  2607.     if @data_type = 0
  2608.         select
  2609.             TYPE_NAME = t.name,
  2610.             d.DATA_TYPE,
  2611.             "PRECISION" = isnull(d.data_precision, convert(int,t.length)),
  2612.             d.LITERAL_PREFIX,
  2613.             d.LITERAL_SUFFIX,
  2614.             e.CREATE_PARAMS,
  2615.             d.NULLABLE,
  2616.             d.CASE_SENSITIVE,
  2617.             d.SEARCHABLE,
  2618.             d.UNSIGNED_ATTRIBUTE,
  2619.             d.MONEY,
  2620.             d.AUTO_INCREMENT,
  2621.             LOCAL_TYPE_NAME = t.name,
  2622.             MINIMUM_SCALE = d.numeric_scale,
  2623.             MAXIMUM_SCALE = d.numeric_scale,
  2624.             d.SQL_DATA_TYPE,
  2625.             d.SQL_DATETIME_SUB,
  2626.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2627.             INTERVAL_PRECISION = convert(smallint,NULL),
  2628.             USERTYPE = t.usertype
  2629.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2630.         where
  2631.             d.ss_dtype = t.type
  2632.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2633.             and t.usertype *= e.user_type
  2634.             and (t.type not in (111,109,38,110) or /* get rid of nullable types */
  2635.                 t.usertype > 100)
  2636.         order by 2, 12, 11, t.usertype
  2637.  
  2638.     else
  2639.         select
  2640.             TYPE_NAME = t.name,
  2641.             d.DATA_TYPE,
  2642.             "PRECISION" = isnull(d.data_precision, convert(int,t.length)),
  2643.             d.LITERAL_PREFIX,
  2644.             d.LITERAL_SUFFIX,
  2645.             e.CREATE_PARAMS,
  2646.             d.NULLABLE,
  2647.             d.CASE_SENSITIVE,
  2648.             d.SEARCHABLE,
  2649.             d.UNSIGNED_ATTRIBUTE,
  2650.             d.MONEY,
  2651.             d.AUTO_INCREMENT,
  2652.             LOCAL_TYPE_NAME = t.name,
  2653.             MINIMUM_SCALE = d.numeric_scale,
  2654.             MAXIMUM_SCALE = d.numeric_scale,
  2655.             d.SQL_DATA_TYPE,
  2656.             d.SQL_DATETIME_SUB,
  2657.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2658.             INTERVAL_PRECISION = convert(smallint,NULL),
  2659.             USERTYPE = t.usertype
  2660.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2661.         where
  2662.             DATA_TYPE = @data_type
  2663.             and d.ss_dtype = t.type
  2664.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2665.             and t.usertype *= e.user_type
  2666.             and (t.type not in (111,109,38,110) or /* get rid of nullable types */
  2667.                 t.usertype > 100)
  2668.         order by 12, 11, t.usertype
  2669.  
  2670. go
  2671.  
  2672. if (charindex('6.00', @@version) = 0 and
  2673.     charindex('6.50', @@version) = 0 and
  2674.     charindex('7.00', @@version) = 0 and
  2675.     charindex('8.00', @@version) = 0)
  2676. begin
  2677.     print ''
  2678.     print ''
  2679.     print 'Warning:'
  2680.     print 'you are installing the stored procedures '
  2681.     print 'on a pre 6.0 SQL Server.'
  2682.     print 'Ignore the following errors.'
  2683. end
  2684. else
  2685.     drop proc sp_datatype_info
  2686. go
  2687.  
  2688. /*    Procedure for 6.0 and 6.50 servers */
  2689. create proc sp_datatype_info
  2690.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2691. as
  2692.     if @ODBCVer <> 3
  2693.         select @ODBCVer = 2
  2694.     if @data_type = 0
  2695.         select
  2696.             convert(varchar(32),case
  2697.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2698.                 else d.TYPE_NAME
  2699.             end) TYPE_NAME,
  2700.             d.DATA_TYPE,
  2701.             convert(int,case
  2702.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2703.                 when d.ss_dtype in (35,34) then 2147483647                /* TEXT/IMAGE */
  2704.                 when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */
  2705.                 else t.prec
  2706.             end) "PRECISION",
  2707.             d.LITERAL_PREFIX,
  2708.             d.LITERAL_SUFFIX,
  2709.             e.CREATE_PARAMS,
  2710.             convert(smallint,case
  2711.                 when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2712.                 else t.allownulls
  2713.             end) NULLABLE,
  2714.             d.CASE_SENSITIVE,
  2715.             d.SEARCHABLE,
  2716.             d.UNSIGNED_ATTRIBUTE,
  2717.             d.MONEY,
  2718.             d.AUTO_INCREMENT,
  2719.             convert(varchar(32),case
  2720.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2721.                 else d.TYPE_NAME
  2722.             end) LOCAL_TYPE_NAME,
  2723.             convert(smallint,case
  2724.                 when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale
  2725.                 else d.numeric_scale
  2726.             end) MINIMUM_SCALE,
  2727.             convert(smallint,case
  2728.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
  2729.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2730.                 else t.scale
  2731.             end) MAXIMUM_SCALE,
  2732.             d.SQL_DATA_TYPE,
  2733.             d.SQL_DATETIME_SUB,
  2734.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2735.             INTERVAL_PRECISION = convert(smallint,NULL),
  2736.             USERTYPE = t.usertype
  2737.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2738.         where
  2739.             d.ss_dtype = t.type
  2740.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2741.             and t.usertype *= e.user_type
  2742.             and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
  2743.             and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */
  2744.                 t.usertype > 100)
  2745.             and (t.usertype <= 100 or
  2746.                 isnull(d.AUTO_INCREMENT,0) = 0)
  2747.         order by 2, 12, 11, t.usertype
  2748.  
  2749.     else
  2750.         select
  2751.             convert(varchar(32),case
  2752.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2753.                 else d.TYPE_NAME
  2754.             end) TYPE_NAME,
  2755.             d.DATA_TYPE,
  2756.             convert(int,case
  2757.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2758.                 when d.ss_dtype in (35,34) then 2147483647                /* TEXT/IMAGE */
  2759.                 when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */
  2760.                 else t.prec
  2761.             end) "PRECISION",
  2762.             d.LITERAL_PREFIX,
  2763.             d.LITERAL_SUFFIX,
  2764.             e.CREATE_PARAMS,
  2765.             convert(smallint,case
  2766.                 when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2767.                 else t.allownulls
  2768.             end) NULLABLE,
  2769.             d.CASE_SENSITIVE,
  2770.             d.SEARCHABLE,
  2771.             d.UNSIGNED_ATTRIBUTE,
  2772.             d.MONEY,
  2773.             d.AUTO_INCREMENT,
  2774.             convert(varchar(32),case
  2775.                 when t.usertype > 100 or t.usertype in (18,80) then t.name
  2776.                 else d.TYPE_NAME
  2777.             end) LOCAL_TYPE_NAME,
  2778.             convert(smallint,case
  2779.                 when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale
  2780.                 else d.numeric_scale
  2781.             end) MINIMUM_SCALE,
  2782.             convert(smallint,case
  2783.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
  2784.                 when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2785.                 else t.scale
  2786.             end) MAXIMUM_SCALE,
  2787.             d.SQL_DATA_TYPE,
  2788.             d.SQL_DATETIME_SUB,
  2789.             NUM_PREC_RADIX = convert(int,d.RADIX),
  2790.             INTERVAL_PRECISION = convert(smallint,NULL),
  2791.             USERTYPE = t.usertype
  2792.         from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
  2793.         where
  2794.             d.DATA_TYPE = @data_type
  2795.             and d.ss_dtype = t.type
  2796.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2797.             and t.usertype *= e.user_type
  2798.             and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
  2799.             and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */
  2800.                 t.usertype > 100)
  2801.             and (t.usertype <= 100 or
  2802.                 isnull(d.AUTO_INCREMENT,0) = 0)
  2803.         order by 12, 11, t.usertype
  2804. go
  2805.  
  2806. if (charindex('7.00', @@version) = 0 and
  2807.     charindex('8.00', @@version) = 0)
  2808. begin
  2809.     print ''
  2810.     print ''
  2811.     print 'Warning:'
  2812.     print 'you are installing the stored procedures '
  2813.     print 'on a pre 7.0 SQL Server.'
  2814.     print 'Ignore the following errors.'
  2815. end
  2816. else
  2817.     drop proc sp_datatype_info
  2818. go
  2819.  
  2820. /*    Procedure for 7.0 server */
  2821. create proc sp_datatype_info
  2822.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2823. as
  2824.     declare @mintype int
  2825.     declare @maxtype int
  2826.  
  2827.     if @ODBCVer <> 3
  2828.         select @ODBCVer = 2
  2829.     if @data_type = 0
  2830.     begin
  2831.         select @mintype = -32768
  2832.         select @maxtype = 32767
  2833.     end
  2834.     else
  2835.     begin
  2836.         select @mintype = @data_type
  2837.         select @maxtype = @data_type
  2838.     end
  2839.  
  2840.     select
  2841.         convert(sysname,case
  2842.             when t.xusertype > 255 then t.name
  2843.             else d.TYPE_NAME
  2844.         end) TYPE_NAME,
  2845.         d.DATA_TYPE,
  2846.         convert(int,case
  2847.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  2848.             when type_name(d.ss_dtype) IN ('numeric','decimal') and
  2849.                 t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
  2850.             else OdbcPrec(t.xtype, t.length, t.xprec)
  2851.         end) "PRECISION",
  2852.         d.LITERAL_PREFIX,
  2853.         d.LITERAL_SUFFIX,
  2854.         e.CREATE_PARAMS,
  2855.         convert(smallint,case
  2856.             when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2857.             else TypeProperty (t.name, 'AllowsNull')
  2858.         end) NULLABLE,
  2859.         d.CASE_SENSITIVE,
  2860.         d.SEARCHABLE,
  2861.         d.UNSIGNED_ATTRIBUTE,
  2862.         d.MONEY,
  2863.         d.AUTO_INCREMENT,
  2864.         convert(sysname,case
  2865.             when t.xusertype > 255 then t.name
  2866.             else d.LOCAL_TYPE_NAME
  2867.         end) LOCAL_TYPE_NAME,
  2868.         MINIMUM_SCALE = d.numeric_scale,
  2869.         convert(smallint,case
  2870.             when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
  2871.             when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2872.             else TypeProperty (t.name, 'Scale')
  2873.         end) MAXIMUM_SCALE,
  2874.         d.SQL_DATA_TYPE,
  2875.         d.SQL_DATETIME_SUB,
  2876.         NUM_PREC_RADIX = convert(int,d.RADIX),
  2877.         INTERVAL_PRECISION = convert(smallint,NULL),
  2878.         USERTYPE = t.usertype
  2879.     from master.dbo.spt_datatype_info d
  2880.         INNER JOIN systypes t on d.ss_dtype = t.xtype
  2881.         LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
  2882.             t.xusertype = e.user_type
  2883.             and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT
  2884.     where
  2885.         d.DATA_TYPE between @mintype and @maxtype
  2886.         and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2887.         and (t.xusertype <= 255 or
  2888.             isnull(d.AUTO_INCREMENT,0) = 0)
  2889.     order by 2, 12, 11,
  2890.     case
  2891.         when t.usertype=18 then 255
  2892.         else t.usertype
  2893.     end
  2894.  
  2895. go
  2896.  
  2897. if (charindex('8.00', @@version) = 0)
  2898. begin
  2899.     print ''
  2900.     print ''
  2901.     print 'Warning:'
  2902.     print 'you are installing the stored procedures '
  2903.     print 'on a pre 8.0 SQL Server.'
  2904.     print 'Ignore the following errors.'
  2905. end
  2906. else
  2907.     drop proc sp_datatype_info
  2908. go
  2909.  
  2910. /*    Procedure for 8.0 server */
  2911. create proc sp_datatype_info
  2912.     (@data_type int = 0, @ODBCVer tinyint = 2)
  2913. as
  2914.     declare @mintype int
  2915.     declare @maxtype int
  2916.  
  2917.     if @ODBCVer <> 3
  2918.         select @ODBCVer = 2
  2919.     if @data_type = 0
  2920.     begin
  2921.         select @mintype = -32768
  2922.         select @maxtype = 32767
  2923.     end
  2924.     else
  2925.     begin
  2926.         select @mintype = @data_type
  2927.         select @maxtype = @data_type
  2928.     end
  2929.  
  2930.     select
  2931.         convert(sysname,case
  2932.             when t.xusertype > 255 then t.name
  2933.             else d.TYPE_NAME collate database_default
  2934.         end) TYPE_NAME,
  2935.         d.DATA_TYPE,
  2936.         convert(int,case
  2937.             when d.DATA_TYPE in (6,7,-150) then d.data_precision         /* FLOAT/REAL/sql_variant*/
  2938.             when d.ss_dtype in (55,63,106,108) and
  2939.                 t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
  2940.             else OdbcPrec(t.xtype, t.length, t.xprec)
  2941.         end) "PRECISION",
  2942.         d.LITERAL_PREFIX,
  2943.         d.LITERAL_SUFFIX,
  2944.         e.CREATE_PARAMS,
  2945.         convert(smallint,case
  2946.             when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
  2947.             else TypeProperty (t.name, 'AllowsNull')
  2948.         end) NULLABLE,
  2949.         d.CASE_SENSITIVE,
  2950.         d.SEARCHABLE,
  2951.         d.UNSIGNED_ATTRIBUTE,
  2952.         d.MONEY,
  2953.         d.AUTO_INCREMENT,
  2954.         convert(sysname,case
  2955.             when t.xusertype > 255 then t.name
  2956.             else d.LOCAL_TYPE_NAME collate database_default
  2957.         end) LOCAL_TYPE_NAME,
  2958.         convert(smallint,case
  2959.             when d.ss_dtype in (55,63,106,108) and t.xusertype > 255 then TypeProperty (t.name, 'Scale')
  2960.             else d.numeric_scale
  2961.         end) MINIMUM_SCALE,
  2962.         convert(smallint,case
  2963.             when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
  2964.             when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
  2965.             else TypeProperty (t.name, 'Scale')
  2966.         end) MAXIMUM_SCALE,
  2967.         d.SQL_DATA_TYPE,
  2968.         d.SQL_DATETIME_SUB,
  2969.         NUM_PREC_RADIX = convert(int,d.RADIX),
  2970.         INTERVAL_PRECISION = convert(smallint,NULL),
  2971.         USERTYPE = t.usertype
  2972.     from master.dbo.spt_datatype_info d
  2973.         INNER JOIN systypes t on d.ss_dtype = t.xtype
  2974.         LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
  2975.             t.xusertype = e.user_type
  2976.             and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT
  2977.     where
  2978.         d.DATA_TYPE between @mintype and @maxtype
  2979.         and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  2980.         and (t.xusertype <= 255 or
  2981.             isnull(d.AUTO_INCREMENT,0) = 0)
  2982.     order by 2, 12, 11,
  2983.     case
  2984.         when t.usertype=18 then 255
  2985.         else t.usertype
  2986.     end
  2987.  
  2988. go
  2989.  
  2990. grant execute on sp_datatype_info to public
  2991. go
  2992.  
  2993. dump tran master with no_log
  2994. go
  2995.  
  2996. print 'creating sp_fkeys'
  2997. go
  2998.  
  2999. /*    Procedure for pre-6.0 server */
  3000. CREATE PROCEDURE sp_fkeys(
  3001.                @pktable_name        varchar(32) = null,
  3002.                @pktable_owner        varchar(32) = null,
  3003.                @pktable_qualifier    varchar(32) = null,
  3004.                @fktable_name        varchar(32) = null,
  3005.                @fktable_owner        varchar(32) = null,
  3006.                @fktable_qualifier    varchar(32) = null )
  3007. as
  3008.     set nocount on
  3009.     declare    @order_by_pk int
  3010.  
  3011.     select  @order_by_pk = 0
  3012.  
  3013.     if (@pktable_name is null) and (@fktable_name is null)
  3014.     begin    /* If neither primary key nor foreign key table names given */
  3015.         raiserror 20004 '~~Rush_25~~'
  3016.         return
  3017.     end
  3018.     if @fktable_qualifier is not null
  3019.     begin
  3020.         if db_name() <> @fktable_qualifier
  3021.         begin    /* If qualifier doesn't match current database */
  3022.             raiserror 20001 '~~Rush_26~~'
  3023.             return
  3024.         end
  3025.     end
  3026.     if @pktable_qualifier is not null
  3027.     begin
  3028.         if db_name() <> @pktable_qualifier
  3029.         begin    /* If qualifier doesn't match current database */
  3030.             raiserror 20001 '~~Rush_27~~'
  3031.             return
  3032.         end
  3033.     end
  3034.  
  3035.     if @pktable_name is null
  3036.     begin /*  If table name not supplied, match all */
  3037.         select @pktable_name = '%'
  3038.         select @order_by_pk = 1
  3039.     end
  3040.     if @pktable_owner is null    /*    If PK owner not supplied, match all */
  3041.         select @pktable_owner = '%'
  3042.     if @fktable_name is null    /*    If table name not supplied, match all */
  3043.         select @fktable_name = '%'
  3044.     if @fktable_owner is null    /*    If FK owner not supplied, match all */
  3045.         select @fktable_owner = '%'
  3046.  
  3047.     if @@trancount <> 0
  3048.     begin    /* If inside a transaction */
  3049.         raiserror 20003 '~~Rush_28~~'
  3050.         return
  3051.     end
  3052.     create table #fkeys(
  3053.              PKTABLE_QUALIFIER    varchar(32) NULL,
  3054.              PKTABLE_OWNER        varchar(32) NULL,
  3055.              PKTABLE_NAME        varchar(32) NOT NULL,
  3056.              PKCOLUMN_NAME        varchar(32) NOT NULL,
  3057.              FKTABLE_QUALIFIER    varchar(32) NULL,
  3058.              FKTABLE_OWNER        varchar(32) NULL,
  3059.              FKTABLE_NAME        varchar(32) NOT NULL,
  3060.              FKCOLUMN_NAME        varchar(32) NOT NULL,
  3061.              KEY_SEQ            smallint NOT NULL)
  3062.  
  3063.     /*    SQL Server supports upto 8 PK/FK relationships between 2 tables */
  3064.     /*    Process syskeys for each relationship */
  3065.     /*    The inserts below adds a row to the temp table for each of the
  3066.         8 possible relationships */
  3067.     insert into #fkeys
  3068.         select
  3069.             db_name(),
  3070.             user_name(o1.uid),
  3071.             object_name(k.depid),
  3072.             c2.name,
  3073.             db_name(),
  3074.             user_name(o2.uid),
  3075.             object_name(k.id),
  3076.             c1.name,
  3077.             1
  3078.         from
  3079.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3080.         where
  3081.             c1.id = k.id
  3082.             and k.type = 2    /* Foreign type key */
  3083.             and c1.colid = k.key1
  3084.             and c2.id = k.depid
  3085.             and c2.colid = k.depkey1
  3086.             and o1.id = k.depid
  3087.             and o2.id = k.id
  3088.     union all
  3089.         select
  3090.             db_name(),
  3091.             user_name(o1.uid),
  3092.             object_name(k.depid),
  3093.             c2.name,
  3094.             db_name(),
  3095.             user_name(o2.uid),
  3096.             object_name(k.id),
  3097.             c1.name,
  3098.             2
  3099.         from
  3100.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3101.         where
  3102.             c1.id = k.id
  3103.             and k.type = 2    /* Foreign type key */
  3104.             and c1.colid = k.key2
  3105.             and c2.id = k.depid
  3106.             and c2.colid = k.depkey2
  3107.             and o1.id = k.depid
  3108.             and o2.id = k.id
  3109.     union all
  3110.         select
  3111.             db_name(),
  3112.             user_name(o1.uid),
  3113.             object_name(k.depid),
  3114.             c2.name,
  3115.             db_name(),
  3116.             user_name(o2.uid),
  3117.             object_name(k.id),
  3118.             c1.name,
  3119.             3
  3120.         from
  3121.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3122.         where
  3123.             c1.id = k.id
  3124.             and k.type = 2    /* Foreign type key */
  3125.             and c1.colid = k.key3
  3126.             and c2.id = k.depid
  3127.             and c2.colid = k.depkey3
  3128.             and o1.id = k.depid
  3129.             and o2.id = k.id
  3130.     union all
  3131.         select
  3132.             db_name(),
  3133.             user_name(o1.uid),
  3134.             object_name(k.depid),
  3135.             c2.name,
  3136.             db_name(),
  3137.             user_name(o2.uid),
  3138.             object_name(k.id),
  3139.             c1.name,
  3140.             4
  3141.         from
  3142.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3143.         where
  3144.             c1.id = k.id
  3145.             and k.type = 2    /* Foreign type key */
  3146.             and c1.colid = k.key4
  3147.             and c2.id = k.depid
  3148.             and c2.colid = k.depkey4
  3149.             and o1.id = k.depid
  3150.             and o2.id = k.id
  3151.     union all
  3152.         select
  3153.             db_name(),
  3154.             user_name(o1.uid),
  3155.             object_name(k.depid),
  3156.             c2.name,
  3157.             db_name(),
  3158.             user_name(o2.uid),
  3159.             object_name(k.id),
  3160.             c1.name,
  3161.             5
  3162.         from
  3163.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3164.         where
  3165.             c1.id = k.id
  3166.             and k.type = 2    /* Foreign type key */
  3167.             and c1.colid = k.key5
  3168.             and c2.id = k.depid
  3169.             and c2.colid = k.depkey5
  3170.             and o1.id = k.depid
  3171.             and o2.id = k.id
  3172.     union all
  3173.         select
  3174.             db_name(),
  3175.             user_name(o1.uid),
  3176.             object_name(k.depid),
  3177.             c2.name,
  3178.             db_name(),
  3179.             user_name(o2.uid),
  3180.             object_name(k.id),
  3181.             c1.name,
  3182.             6
  3183.         from
  3184.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3185.         where
  3186.             c1.id = k.id
  3187.             and k.type = 2    /* Foreign type key */
  3188.             and c1.colid = k.key6
  3189.             and c2.id = k.depid
  3190.             and c2.colid = k.depkey6
  3191.             and o1.id = k.depid
  3192.             and o2.id = k.id
  3193.     union all
  3194.         select
  3195.             db_name(),
  3196.             user_name(o1.uid),
  3197.             object_name(k.depid),
  3198.             c2.name,
  3199.             db_name(),
  3200.             user_name(o2.uid),
  3201.             object_name(k.id),
  3202.             c1.name,
  3203.             7
  3204.         from
  3205.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3206.         where
  3207.             c1.id = k.id
  3208.             and k.type = 2    /* Foreign type key */
  3209.             and c1.colid = k.key7
  3210.             and c2.id = k.depid
  3211.             and c2.colid = k.depkey7
  3212.             and o1.id = k.depid
  3213.             and o2.id = k.id
  3214.     union all
  3215.         select
  3216.             db_name(),
  3217.             user_name(o1.uid),
  3218.             object_name(k.depid),
  3219.             c2.name,
  3220.             db_name(),
  3221.             user_name(o2.uid),
  3222.             object_name(k.id),
  3223.             c1.name,
  3224.             8
  3225.         from
  3226.             syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
  3227.         where
  3228.             c1.id = k.id
  3229.             and k.type = 2    /* Foreign type key */
  3230.             and c1.colid = k.key8
  3231.             and c2.id = k.depid
  3232.             and c2.colid = k.depkey8
  3233.             and o1.id = k.depid
  3234.             and o2.id = k.id
  3235.  
  3236.     if @order_by_pk = 1 /*    If order by PK fields */
  3237.         select
  3238.             PKTABLE_QUALIFIER,
  3239.             PKTABLE_OWNER,
  3240.             PKTABLE_NAME,
  3241.             PKCOLUMN_NAME,
  3242.             FKTABLE_QUALIFIER,
  3243.             FKTABLE_OWNER,
  3244.             FKTABLE_NAME,
  3245.             FKCOLUMN_NAME,
  3246.             KEY_SEQ,
  3247.             UPDATE_RULE = convert(smallint, null),
  3248.             DELETE_RULE = convert(smallint,null),
  3249.             FK_NAME = convert(varchar(32),null),
  3250.             PK_NAME = convert(varchar(32),null),
  3251.             DEFERRABILITY = convert(smallint,7)
  3252.         from #fkeys
  3253.         where FKTABLE_NAME like @fktable_name
  3254.             and FKTABLE_OWNER like @fktable_owner
  3255.             and PKTABLE_NAME  like @pktable_name
  3256.             and PKTABLE_OWNER like @pktable_owner
  3257.         order by 1, 2, 3, 9, 4
  3258.     else        /*    Order by FK fields */
  3259.         select
  3260.             PKTABLE_QUALIFIER,
  3261.             PKTABLE_OWNER,
  3262.             PKTABLE_NAME,
  3263.             PKCOLUMN_NAME,
  3264.             FKTABLE_QUALIFIER,
  3265.             FKTABLE_OWNER,
  3266.             FKTABLE_NAME,
  3267.             FKCOLUMN_NAME,
  3268.             KEY_SEQ,
  3269.             UPDATE_RULE = convert(smallint,null),
  3270.             DELETE_RULE = convert(smallint,null),
  3271.             FK_NAME = convert(varchar(32),null),
  3272.             PK_NAME = convert(varchar(32),null),
  3273.             DEFERRABILITY = convert(smallint,7)
  3274.         from #fkeys
  3275.         where FKTABLE_NAME like @fktable_name
  3276.             and FKTABLE_OWNER like @fktable_owner
  3277.             and PKTABLE_NAME  like @pktable_name
  3278.             and PKTABLE_OWNER like @pktable_owner
  3279.         order by 5, 6, 7, 9, 8
  3280. go
  3281.  
  3282. if (charindex('6.00', @@version) = 0 and
  3283.     charindex('6.50', @@version) = 0 and
  3284.     charindex('7.00', @@version) = 0 and
  3285.     charindex('8.00', @@version) = 0)
  3286. begin
  3287.     print ''
  3288.     print ''
  3289.     print 'Warning:'
  3290.     print 'you are installing the stored procedures '
  3291.     print 'on a pre 6.0 SQL Server.'
  3292.     print 'Ignore the following errors.'
  3293. end
  3294. else
  3295.     drop proc sp_fkeys
  3296. go
  3297.  
  3298. /*    Procedure for 6.0 and 6.50 servers */
  3299. CREATE PROCEDURE sp_fkeys(
  3300.                @pktable_name        varchar(32) = null,
  3301.                @pktable_owner        varchar(32) = null,
  3302.                @pktable_qualifier    varchar(32) = null,
  3303.                @fktable_name        varchar(32) = null,
  3304.                @fktable_owner        varchar(32) = null,
  3305.                @fktable_qualifier    varchar(32) = null )
  3306. as
  3307.     set nocount on
  3308.     DECLARE @pktable_id            int
  3309.     DECLARE @pkfull_table_name    varchar(65) /* 2*32 +1 */
  3310.     DECLARE @fktable_id            int
  3311.     DECLARE @fkfull_table_name    varchar(65) /* 2*32 +1 */
  3312.     declare    @order_by_pk        int
  3313.  
  3314.     select  @order_by_pk = 0
  3315.  
  3316.     if (@pktable_name is null) and (@fktable_name is null)
  3317.     begin    /* If neither primary key nor foreign key table names given */
  3318.         raiserror (15252,-1,-1)
  3319.         return
  3320.     end
  3321.     if @fktable_qualifier is not null
  3322.     begin
  3323.         if db_name() <> @fktable_qualifier
  3324.         begin    /* If qualifier doesn't match current database */
  3325.             raiserror (15250, -1,-1)
  3326.             return
  3327.         end
  3328.     end
  3329.     if @pktable_qualifier is not null
  3330.     begin
  3331.         if db_name() <> @pktable_qualifier
  3332.         begin    /* If qualifier doesn't match current database */
  3333.             raiserror (15250, -1,-1)
  3334.             return
  3335.         end
  3336.     end
  3337.  
  3338.     if @pktable_owner is null
  3339.     begin    /* If unqualified primary key table name */
  3340.         SELECT @pkfull_table_name = @pktable_name
  3341.     end
  3342.     else
  3343.     begin    /* Qualified primary key table name */
  3344.         SELECT @pkfull_table_name = @pktable_owner + '.' + @pktable_name
  3345.     end
  3346.     /*    Get Object ID */
  3347.     SELECT @pktable_id = object_id(@pkfull_table_name)
  3348.  
  3349.     if @fktable_owner is null
  3350.     begin    /* If unqualified foreign key table name */
  3351.         SELECT @fkfull_table_name = @fktable_name
  3352.     end
  3353.     else
  3354.     begin    /* Qualified foreign key table name */
  3355.         SELECT @fkfull_table_name = @fktable_owner + '.' + @fktable_name
  3356.     end
  3357.     /*    Get Object ID */
  3358.     SELECT @fktable_id = object_id(@fkfull_table_name)
  3359.  
  3360.     if @fktable_name is not null
  3361.     begin
  3362.         if @fktable_id is null
  3363.             SELECT @fktable_id = 0    /* fk table not found, empty result */
  3364.     end
  3365.  
  3366.     if @pktable_name is null
  3367.     begin /*  If table name not supplied, match all */
  3368.         select @order_by_pk = 1
  3369.     end
  3370.     else
  3371.     begin
  3372.         if @pktable_id is null
  3373.         begin
  3374.             SELECT @pktable_id = 0    /* pk table not found, empty result */
  3375.         end
  3376.     end
  3377.  
  3378.     if (@@trancount <> 0 and
  3379.         charindex('6.50', @@version) = 0)
  3380.     begin    /* If inside a transaction */
  3381.         raiserror (15002,-1,-1,'sp_fkeys')
  3382.         return
  3383.     end
  3384.  
  3385.     create table #fkeys(
  3386.              pkdb_id        int NOT NULL,
  3387.              pktable_id     int NOT NULL,
  3388.              pkcolid        int NOT NULL,
  3389.              fkdb_id        int NOT NULL,
  3390.              fktable_id        int NOT NULL,
  3391.              fkcolid        int NOT NULL,
  3392.              KEY_SEQ        smallint NOT NULL,
  3393.              fk_id            int NOT NULL,
  3394.              pk_id            int NOT NULL)
  3395.  
  3396.     /*    SQL Server supports upto 16 PK/FK relationships between 2 tables */
  3397.     /*    Process syskeys for each relationship */
  3398.     /*    The inserts below adds a row to the temp table for each of the
  3399.         16 possible relationships */
  3400.     insert into #fkeys
  3401.         select
  3402.             r.rkeydbid,
  3403.             r.rkeyid,
  3404.             r.rkey1,
  3405.             r.fkeydbid,
  3406.             r.fkeyid,
  3407.             r.fkey1,
  3408.             1,
  3409.             r.constid,
  3410.             s.constid
  3411.         from
  3412.             sysreferences r, sysconstraints s
  3413.         where    r.rkeyid = s.id
  3414.             AND (s.status & 0xf) = 1
  3415.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3416.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3417.       union all
  3418.         select
  3419.             r.rkeydbid,
  3420.             r.rkeyid,
  3421.             r.rkey2,
  3422.             r.fkeydbid,
  3423.             r.fkeyid,
  3424.             r.fkey2,
  3425.             2,
  3426.             r.constid,
  3427.             s.constid
  3428.         from
  3429.             sysreferences r, sysconstraints s
  3430.         where    r.rkeyid = s.id
  3431.             AND (s.status & 0xf) = 1
  3432.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3433.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3434.       union all
  3435.         select
  3436.             r.rkeydbid,
  3437.             r.rkeyid,
  3438.             r.rkey3,
  3439.             r.fkeydbid,
  3440.             r.fkeyid,
  3441.             r.fkey3,
  3442.             3,
  3443.             r.constid,
  3444.             s.constid
  3445.         from
  3446.             sysreferences r, sysconstraints s
  3447.         where    r.rkeyid = s.id
  3448.             AND (s.status & 0xf) = 1
  3449.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3450.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3451.       union all
  3452.         select
  3453.             r.rkeydbid,
  3454.             r.rkeyid,
  3455.             r.rkey4,
  3456.             r.fkeydbid,
  3457.             r.fkeyid,
  3458.             r.fkey4,
  3459.             4,
  3460.             r.constid,
  3461.             s.constid
  3462.         from
  3463.             sysreferences r, sysconstraints s
  3464.         where    r.rkeyid = s.id
  3465.             AND (s.status & 0xf) = 1
  3466.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3467.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3468.       union all
  3469.         select
  3470.             r.rkeydbid,
  3471.             r.rkeyid,
  3472.             r.rkey5,
  3473.             r.fkeydbid,
  3474.             r.fkeyid,
  3475.             r.fkey5,
  3476.             5,
  3477.             r.constid,
  3478.             s.constid
  3479.         from
  3480.             sysreferences r, sysconstraints s
  3481.         where    r.rkeyid = s.id
  3482.             AND (s.status & 0xf) = 1
  3483.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3484.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3485.       union all
  3486.         select
  3487.             r.rkeydbid,
  3488.             r.rkeyid,
  3489.             r.rkey6,
  3490.             r.fkeydbid,
  3491.             r.fkeyid,
  3492.             r.fkey6,
  3493.             6,
  3494.             r.constid,
  3495.             s.constid
  3496.         from
  3497.             sysreferences r, sysconstraints s
  3498.         where    r.rkeyid = s.id
  3499.             AND (s.status & 0xf) = 1
  3500.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3501.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3502.       union all
  3503.         select
  3504.             r.rkeydbid,
  3505.             r.rkeyid,
  3506.             r.rkey7,
  3507.             r.fkeydbid,
  3508.             r.fkeyid,
  3509.             r.fkey7,
  3510.             7,
  3511.             r.constid,
  3512.             s.constid
  3513.         from
  3514.             sysreferences r, sysconstraints s
  3515.         where    r.rkeyid = s.id
  3516.             AND (s.status & 0xf) = 1
  3517.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3518.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3519.       union all
  3520.         select
  3521.             r.rkeydbid,
  3522.             r.rkeyid,
  3523.             r.rkey8,
  3524.             r.fkeydbid,
  3525.             r.fkeyid,
  3526.             r.fkey8,
  3527.             8,
  3528.             r.constid,
  3529.             s.constid
  3530.         from
  3531.             sysreferences r, sysconstraints s
  3532.         where    r.rkeyid = s.id
  3533.             AND (s.status & 0xf) = 1
  3534.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3535.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3536.       union all
  3537.         select
  3538.             r.rkeydbid,
  3539.             r.rkeyid,
  3540.             r.rkey9,
  3541.             r.fkeydbid,
  3542.             r.fkeyid,
  3543.             r.fkey9,
  3544.             9,
  3545.             r.constid,
  3546.             s.constid
  3547.         from
  3548.             sysreferences r, sysconstraints s
  3549.         where    r.rkeyid = s.id
  3550.             AND (s.status & 0xf) = 1
  3551.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3552.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3553.       union all
  3554.         select
  3555.             r.rkeydbid,
  3556.             r.rkeyid,
  3557.             r.rkey10,
  3558.             r.fkeydbid,
  3559.             r.fkeyid,
  3560.             r.fkey10,
  3561.             10,
  3562.             r.constid,
  3563.             s.constid
  3564.         from
  3565.             sysreferences r, sysconstraints s
  3566.         where    r.rkeyid = s.id
  3567.             AND (s.status & 0xf) = 1
  3568.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3569.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3570.       union all
  3571.         select
  3572.             r.rkeydbid,
  3573.             r.rkeyid,
  3574.             r.rkey11,
  3575.             r.fkeydbid,
  3576.             r.fkeyid,
  3577.             r.fkey11,
  3578.             11,
  3579.             r.constid,
  3580.             s.constid
  3581.         from
  3582.             sysreferences r, sysconstraints s
  3583.         where    r.rkeyid = s.id
  3584.             AND (s.status & 0xf) = 1
  3585.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3586.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3587.       union all
  3588.         select
  3589.             r.rkeydbid,
  3590.             r.rkeyid,
  3591.             r.rkey12,
  3592.             r.fkeydbid,
  3593.             r.fkeyid,
  3594.             r.fkey12,
  3595.             12,
  3596.             r.constid,
  3597.             s.constid
  3598.         from
  3599.             sysreferences r, sysconstraints s
  3600.         where    r.rkeyid = s.id
  3601.             AND (s.status & 0xf) = 1
  3602.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3603.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3604.       union all
  3605.         select
  3606.             r.rkeydbid,
  3607.             r.rkeyid,
  3608.             r.rkey13,
  3609.             r.fkeydbid,
  3610.             r.fkeyid,
  3611.             r.fkey13,
  3612.             13,
  3613.             r.constid,
  3614.             s.constid
  3615.         from
  3616.             sysreferences r, sysconstraints s
  3617.         where    r.rkeyid = s.id
  3618.             AND (s.status & 0xf) = 1
  3619.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3620.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3621.       union all
  3622.         select
  3623.             r.rkeydbid,
  3624.             r.rkeyid,
  3625.             r.rkey14,
  3626.             r.fkeydbid,
  3627.             r.fkeyid,
  3628.             r.fkey14,
  3629.             14,
  3630.             r.constid,
  3631.             s.constid
  3632.         from
  3633.             sysreferences r, sysconstraints s
  3634.         where    r.rkeyid = s.id
  3635.             AND (s.status & 0xf) = 1
  3636.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3637.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3638.       union all
  3639.         select
  3640.             r.rkeydbid,
  3641.             r.rkeyid,
  3642.             r.rkey15,
  3643.             r.fkeydbid,
  3644.             r.fkeyid,
  3645.             r.fkey15,
  3646.             15,
  3647.             r.constid,
  3648.             s.constid
  3649.         from
  3650.             sysreferences r, sysconstraints s
  3651.         where    r.rkeyid = s.id
  3652.             AND (s.status & 0xf) = 1
  3653.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3654.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3655.       union all
  3656.         select
  3657.             r.rkeydbid,
  3658.             r.rkeyid,
  3659.             r.rkey16,
  3660.             r.fkeydbid,
  3661.             r.fkeyid,
  3662.             r.fkey16,
  3663.             16,
  3664.             r.constid,
  3665.             s.constid
  3666.         from
  3667.             sysreferences r, sysconstraints s
  3668.         where    r.rkeyid = s.id
  3669.             AND (s.status & 0xf) = 1
  3670.             AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
  3671.             AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
  3672.  
  3673.     if @order_by_pk = 1 /*    If order by PK fields */
  3674.         select
  3675.             PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
  3676.             PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
  3677.             PKTABLE_NAME = convert(varchar(32),o1.name),
  3678.             PKCOLUMN_NAME = convert(varchar(32),c1.name),
  3679.             FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
  3680.             FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
  3681.             FKTABLE_NAME = convert(varchar(32),o2.name),
  3682.             FKCOLUMN_NAME = convert(varchar(32),c2.name),
  3683.             KEY_SEQ,
  3684.             UPDATE_RULE = convert(smallint,1),
  3685.             DELETE_RULE = convert(smallint,1),
  3686.             FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
  3687.             PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
  3688.             DEFERRABILITY = convert(smallint,7)
  3689.         from #fkeys f,
  3690.             sysobjects o1, sysobjects o2,
  3691.             syscolumns c1, syscolumns c2
  3692.         where    o1.id = f.pktable_id
  3693.             AND o2.id = f.fktable_id
  3694.             AND c1.id = f.pktable_id
  3695.             AND c2.id = f.fktable_id
  3696.             AND c1.colid = f.pkcolid
  3697.             AND c2.colid = f.fkcolid
  3698.         order by 1,2,3,9,4
  3699.     else        /*    Order by FK fields */
  3700.         select
  3701.             PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
  3702.             PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
  3703.             PKTABLE_NAME = convert(varchar(32),o1.name),
  3704.             PKCOLUMN_NAME = convert(varchar(32),c1.name),
  3705.             FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
  3706.             FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
  3707.             FKTABLE_NAME = convert(varchar(32),o2.name),
  3708.             FKCOLUMN_NAME = convert(varchar(32),c2.name),
  3709.             KEY_SEQ,
  3710.             UPDATE_RULE = convert(smallint,1),
  3711.             DELETE_RULE = convert(smallint,1),
  3712.             FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
  3713.             PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
  3714.             DEFERRABILITY = convert(smallint,7)
  3715.         from #fkeys f,
  3716.             sysobjects o1, sysobjects o2,
  3717.             syscolumns c1, syscolumns c2
  3718.         where    o1.id = f.pktable_id
  3719.             AND o2.id = f.fktable_id
  3720.             AND c1.id = f.pktable_id
  3721.             AND c2.id = f.fktable_id
  3722.             AND c1.colid = f.pkcolid
  3723.             AND c2.colid = f.fkcolid
  3724.         order by 5,6,7,9,8
  3725. go
  3726.  
  3727. if (charindex('7.00', @@version) = 0 and
  3728.     charindex('8.00', @@version) = 0)
  3729. begin
  3730.     print ''
  3731.     print ''
  3732.     print 'Warning:'
  3733.     print 'you are installing the stored procedures '
  3734.     print 'on a pre 7.0 SQL Server.'
  3735.     print 'Ignore the following errors.'
  3736. end
  3737. else
  3738.     drop proc sp_fkeys
  3739. go
  3740.  
  3741. /*    Procedure for 7.0 server */
  3742. CREATE PROCEDURE sp_fkeys(
  3743.                @pktable_name        sysname = null,
  3744.                @pktable_owner        sysname = null,
  3745.                @pktable_qualifier    sysname = null,
  3746.                @fktable_name        sysname = null,
  3747.                @fktable_owner        sysname = null,
  3748.                @fktable_qualifier    sysname = null )
  3749. as
  3750.     set nocount on
  3751.     DECLARE @pktable_id            int
  3752.     DECLARE @pkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  3753.     DECLARE @fktable_id            int
  3754.     DECLARE @fkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  3755.     declare    @order_by_pk        int
  3756.  
  3757.     /* select 'XXX starting table creation' */
  3758.  
  3759.     create table #fkeysall(
  3760.             rkeyid int NOT NULL,
  3761.             rkey1 int NOT NULL,
  3762.                 rkey2 int NOT NULL,
  3763.                 rkey3 int NOT NULL,
  3764.                 rkey4 int NOT NULL,
  3765.                 rkey5 int NOT NULL,
  3766.                 rkey6 int NOT NULL,
  3767.                 rkey7 int NOT NULL,
  3768.                 rkey8 int NOT NULL,
  3769.                 rkey9 int NOT NULL,
  3770.                 rkey10 int NOT NULL,
  3771.                 rkey11 int NOT NULL,
  3772.                 rkey12 int NOT NULL,
  3773.                 rkey13 int NOT NULL,
  3774.                 rkey14 int NOT NULL,
  3775.                 rkey15 int NOT NULL,
  3776.                 rkey16 int NOT NULL,
  3777.             fkeyid int NOT NULL,
  3778.             fkey1 int NOT NULL,
  3779.                 fkey2 int NOT NULL,
  3780.                 fkey3 int NOT NULL,
  3781.                 fkey4 int NOT NULL,
  3782.                 fkey5 int NOT NULL,
  3783.                 fkey6 int NOT NULL,
  3784.                 fkey7 int NOT NULL,
  3785.                 fkey8 int NOT NULL,
  3786.                 fkey9 int NOT NULL,
  3787.                 fkey10 int NOT NULL,
  3788.                 fkey11 int NOT NULL,
  3789.                 fkey12 int NOT NULL,
  3790.                 fkey13 int NOT NULL,
  3791.                 fkey14 int NOT NULL,
  3792.                 fkey15 int NOT NULL,
  3793.                 fkey16 int NOT NULL,
  3794.             constid int NOT NULL,
  3795.             name sysname NOT NULL)
  3796.  
  3797.     create table #fkeys(
  3798.             pktable_id        int NOT NULL,
  3799.             pkcolid         int NOT NULL,
  3800.             fktable_id        int NOT NULL,
  3801.             fkcolid         int NOT NULL,
  3802.             KEY_SEQ         smallint NOT NULL,
  3803.             fk_id            int NOT NULL,
  3804.             PK_NAME            sysname NOT NULL)
  3805.  
  3806.     create table #fkeysout(
  3807.             PKTABLE_QUALIFIER sysname NULL,
  3808.             PKTABLE_OWNER sysname NULL,
  3809.             PKTABLE_NAME sysname NOT NULL,
  3810.             PKCOLUMN_NAME sysname NOT NULL,
  3811.             FKTABLE_QUALIFIER sysname NULL,
  3812.             FKTABLE_OWNER sysname NULL,
  3813.             FKTABLE_NAME sysname NOT NULL,
  3814.             FKCOLUMN_NAME sysname NOT NULL,
  3815.             KEY_SEQ smallint NOT NULL,
  3816.             UPDATE_RULE smallint NULL,
  3817.             DELETE_RULE smallint NULL,
  3818.             FK_NAME sysname NULL,
  3819.             PK_NAME sysname NULL,
  3820.             DEFERRABILITY smallint null)
  3821.  
  3822.     /* select 'XXX starting parameter analysis' */
  3823.  
  3824.     select  @order_by_pk = 0
  3825.  
  3826.     if (@pktable_name is null) and (@fktable_name is null)
  3827.     begin    /* If neither primary key nor foreign key table names given */
  3828.         raiserror (15252,-1,-1)
  3829.         return
  3830.     end
  3831.     if @fktable_qualifier is not null
  3832.     begin
  3833.         if db_name() <> @fktable_qualifier
  3834.         begin    /* If qualifier doesn't match current database */
  3835.             raiserror (15250, -1,-1)
  3836.             return
  3837.         end
  3838.     end
  3839.     if @pktable_qualifier is not null
  3840.     begin
  3841.         if db_name() <> @pktable_qualifier
  3842.         begin    /* If qualifier doesn't match current database */
  3843.             raiserror (15250, -1,-1)
  3844.             return
  3845.         end
  3846.     end
  3847.  
  3848.     if @pktable_owner is null
  3849.     begin    /* If unqualified primary key table name */
  3850.         SELECT @pkfull_table_name = quotename(@pktable_name)
  3851.     end
  3852.     else
  3853.     begin    /* Qualified primary key table name */
  3854.         if @pktable_owner = ''
  3855.         begin    /* If empty owner name */
  3856.             SELECT @pkfull_table_name = quotename(@pktable_owner)
  3857.         end
  3858.         else
  3859.         begin
  3860.             SELECT @pkfull_table_name = quotename(@pktable_owner) +
  3861.                 '.' + quotename(@pktable_name)
  3862.         end
  3863.     end
  3864.     /*    Get Object ID */
  3865.     SELECT @pktable_id = object_id(@pkfull_table_name)
  3866.  
  3867.     if @fktable_owner is null
  3868.     begin    /* If unqualified foreign key table name */
  3869.         SELECT @fkfull_table_name = quotename(@fktable_name)
  3870.     end
  3871.     else
  3872.     begin    /* Qualified foreign key table name */
  3873.         if @fktable_owner = ''
  3874.         begin    /* If empty owner name */
  3875.             SELECT @fkfull_table_name = quotename(@fktable_owner)
  3876.         end
  3877.         else
  3878.         begin
  3879.             SELECT @fkfull_table_name = quotename(@fktable_owner) +
  3880.                 '.' + quotename(@fktable_name)
  3881.         end
  3882.     end
  3883.     /*    Get Object ID */
  3884.     SELECT @fktable_id = object_id(@fkfull_table_name)
  3885.  
  3886.     if @fktable_name is not null
  3887.     begin
  3888.         if @fktable_id is null
  3889.             SELECT @fktable_id = 0    /* fk table not found, empty result */
  3890.     end
  3891.  
  3892.     if @pktable_name is null
  3893.     begin /*  If table name not supplied, match all */
  3894.         select @order_by_pk = 1
  3895.     end
  3896.     else
  3897.     begin
  3898.         if @pktable_id is null
  3899.         begin
  3900.             SELECT @pktable_id = 0    /* pk table not found, empty result */
  3901.         end
  3902.     end
  3903.  
  3904.     /*    SQL Server supports upto 16 PK/FK relationships between 2 tables */
  3905.     /*    Process syskeys for each relationship */
  3906.     /*  First, attempt to get all 16 keys for each rel'ship, then sort
  3907.         them out with a 16-way "insert select ... union select ..." */
  3908.  
  3909.     /* select 'XXX starting data analysis' */
  3910.  
  3911.     insert into #fkeysall
  3912.         select
  3913.             r.rkeyid,
  3914.             r.rkey1, r.rkey2, r.rkey3, r.rkey4,
  3915.                 r.rkey5, r.rkey6, r.rkey7, r.rkey8,
  3916.                 r.rkey9, r.rkey10, r.rkey11, r.rkey12,
  3917.                 r.rkey13, r.rkey14, r.rkey15, r.rkey16,
  3918.             r.fkeyid,
  3919.             r.fkey1, r.fkey2, r.fkey3, r.fkey4,
  3920.                 r.fkey5, r.fkey6, r.fkey7, r.fkey8,
  3921.                 r.fkey9, r.fkey10, r.fkey11, r.fkey12,
  3922.                 r.fkey13, r.fkey14, r.fkey15, r.fkey16,
  3923.             r.constid,
  3924.             i.name
  3925.         from
  3926.             sysreferences r, sysobjects o, sysindexes i
  3927.         where    r.constid = o.id
  3928.             AND o.xtype = 'F'
  3929.             AND r.rkeyindid = i.indid
  3930.             AND r.rkeyid = i.id
  3931.             AND r.rkeyid between isnull(@pktable_id, 0)
  3932.                             and isnull(@pktable_id, 0x7fffffff)
  3933.             AND r.fkeyid between isnull(@fktable_id, 0)
  3934.                             and isnull(@fktable_id, 0x7fffffff)
  3935.  
  3936.     /* select count (*) as 'XXX countall' from #fkeysall */
  3937.  
  3938.     insert into #fkeys
  3939.             select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name
  3940.             from #fkeysall
  3941.         union all
  3942.             select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name
  3943.             from #fkeysall
  3944.         union all
  3945.             select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name
  3946.             from #fkeysall
  3947.         union all
  3948.             select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name
  3949.             from #fkeysall
  3950.         union all
  3951.             select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name
  3952.             from #fkeysall
  3953.         union all
  3954.             select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name
  3955.             from #fkeysall
  3956.         union all
  3957.             select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name
  3958.             from #fkeysall
  3959.         union all
  3960.             select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name
  3961.             from #fkeysall
  3962.         union all
  3963.             select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name
  3964.             from #fkeysall
  3965.         union all
  3966.             select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name
  3967.             from #fkeysall
  3968.         union all
  3969.             select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name
  3970.             from #fkeysall
  3971.         union all
  3972.             select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name
  3973.             from #fkeysall
  3974.         union all
  3975.             select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name
  3976.             from #fkeysall
  3977.         union all
  3978.             select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name
  3979.             from #fkeysall
  3980.         union all
  3981.             select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name
  3982.             from #fkeysall
  3983.         union all
  3984.             select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name
  3985.             from #fkeysall
  3986.  
  3987.     /* select count (*) as 'XXX count' from #fkeys */
  3988.  
  3989.     insert into #fkeysout
  3990.         select
  3991.             PKTABLE_QUALIFIER = convert(sysname,db_name()),
  3992.             PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),
  3993.             PKTABLE_NAME = convert(sysname,o1.name),
  3994.             PKCOLUMN_NAME = convert(sysname,c1.name),
  3995.             FKTABLE_QUALIFIER = convert(sysname,db_name()),
  3996.             FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),
  3997.             FKTABLE_NAME = convert(sysname,o2.name),
  3998.             FKCOLUMN_NAME = convert(sysname,c2.name),
  3999.             KEY_SEQ,
  4000.             UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN 
  4001.                 convert(smallint,0) ELSE convert(smallint,1) END,
  4002.             DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN 
  4003.                 convert(smallint,0) ELSE convert(smallint,1) END,
  4004.             FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),
  4005.             PK_NAME,
  4006.             DEFERRABILITY = 7    /* SQL_NOT_DEFERRABLE */
  4007.         from #fkeys f,
  4008.             sysobjects o1, sysobjects o2,
  4009.             syscolumns c1, syscolumns c2
  4010.         where    o1.id = f.pktable_id
  4011.             AND o2.id = f.fktable_id
  4012.             AND c1.id = f.pktable_id
  4013.             AND c2.id = f.fktable_id
  4014.             AND c1.colid = f.pkcolid
  4015.             AND c2.colid = f.fkcolid
  4016.     /* select count (*) as 'XXX countout' from #fkeysout */
  4017.  
  4018.     if @order_by_pk = 1 /*    If order by PK fields */
  4019.         select
  4020.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  4021.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  4022.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  4023.         from #fkeysout
  4024.         order by 1,2,3,9,4
  4025.     else        /*    Order by FK fields */
  4026.         select
  4027.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  4028.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  4029.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  4030.         from #fkeysout
  4031.         order by 5,6,7,9,8
  4032. go
  4033.  
  4034. if (charindex('8.00', @@version) = 0)
  4035. begin
  4036.     print ''
  4037.     print ''
  4038.     print 'Warning:'
  4039.     print 'you are installing the stored procedures '
  4040.     print 'on a pre 8.0 SQL Server.'
  4041.     print 'Ignore the following errors.'
  4042. end
  4043. else
  4044.     drop proc sp_fkeys
  4045. go
  4046.  
  4047. /*    Procedure for 8.0 server */
  4048. CREATE PROCEDURE sp_fkeys(
  4049.                @pktable_name        sysname = null,
  4050.                @pktable_owner        sysname = null,
  4051.                @pktable_qualifier    sysname = null,
  4052.                @fktable_name        sysname = null,
  4053.                @fktable_owner        sysname = null,
  4054.                @fktable_qualifier    sysname = null )
  4055. as
  4056.     set nocount on
  4057.     DECLARE @pktable_id            int
  4058.     DECLARE @pkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  4059.     DECLARE @fktable_id            int
  4060.     DECLARE @fkfull_table_name    nvarchar(257) /* 2*128 + 1 */
  4061.     declare    @order_by_pk        int
  4062.  
  4063.     /* select 'XXX starting table creation' */
  4064.  
  4065.     create table #fkeysall(
  4066.             rkeyid int NOT NULL,
  4067.             rkey1 int NOT NULL,
  4068.                 rkey2 int NOT NULL,
  4069.                 rkey3 int NOT NULL,
  4070.                 rkey4 int NOT NULL,
  4071.                 rkey5 int NOT NULL,
  4072.                 rkey6 int NOT NULL,
  4073.                 rkey7 int NOT NULL,
  4074.                 rkey8 int NOT NULL,
  4075.                 rkey9 int NOT NULL,
  4076.                 rkey10 int NOT NULL,
  4077.                 rkey11 int NOT NULL,
  4078.                 rkey12 int NOT NULL,
  4079.                 rkey13 int NOT NULL,
  4080.                 rkey14 int NOT NULL,
  4081.                 rkey15 int NOT NULL,
  4082.                 rkey16 int NOT NULL,
  4083.             fkeyid int NOT NULL,
  4084.             fkey1 int NOT NULL,
  4085.                 fkey2 int NOT NULL,
  4086.                 fkey3 int NOT NULL,
  4087.                 fkey4 int NOT NULL,
  4088.                 fkey5 int NOT NULL,
  4089.                 fkey6 int NOT NULL,
  4090.                 fkey7 int NOT NULL,
  4091.                 fkey8 int NOT NULL,
  4092.                 fkey9 int NOT NULL,
  4093.                 fkey10 int NOT NULL,
  4094.                 fkey11 int NOT NULL,
  4095.                 fkey12 int NOT NULL,
  4096.                 fkey13 int NOT NULL,
  4097.                 fkey14 int NOT NULL,
  4098.                 fkey15 int NOT NULL,
  4099.                 fkey16 int NOT NULL,
  4100.             constid int NOT NULL,
  4101.             name sysname collate database_default NOT NULL)
  4102.  
  4103.     create table #fkeys(
  4104.             pktable_id        int NOT NULL,
  4105.             pkcolid         int NOT NULL,
  4106.             fktable_id        int NOT NULL,
  4107.             fkcolid         int NOT NULL,
  4108.             KEY_SEQ         smallint NOT NULL,
  4109.             fk_id            int NOT NULL,
  4110.             PK_NAME            sysname collate database_default NOT NULL)
  4111.  
  4112.     create table #fkeysout(
  4113.             PKTABLE_QUALIFIER sysname collate database_default NULL,
  4114.             PKTABLE_OWNER sysname collate database_default NULL,
  4115.             PKTABLE_NAME sysname collate database_default NOT NULL,
  4116.             PKCOLUMN_NAME sysname collate database_default NOT NULL,
  4117.             FKTABLE_QUALIFIER sysname collate database_default NULL,
  4118.             FKTABLE_OWNER sysname collate database_default NULL,
  4119.             FKTABLE_NAME sysname collate database_default NOT NULL,
  4120.             FKCOLUMN_NAME sysname collate database_default NOT NULL,
  4121.             KEY_SEQ smallint NOT NULL,
  4122.             UPDATE_RULE smallint NULL,
  4123.             DELETE_RULE smallint NULL,
  4124.             FK_NAME sysname collate database_default NULL,
  4125.             PK_NAME sysname collate database_default NULL,
  4126.             DEFERRABILITY smallint null)
  4127.  
  4128.     /* select 'XXX starting parameter analysis' */
  4129.  
  4130.     select  @order_by_pk = 0
  4131.  
  4132.     if (@pktable_name is null) and (@fktable_name is null)
  4133.     begin    /* If neither primary key nor foreign key table names given */
  4134.         raiserror (15252,-1,-1)
  4135.         return
  4136.     end
  4137.     if @fktable_qualifier is not null
  4138.     begin
  4139.         if db_name() <> @fktable_qualifier
  4140.         begin    /* If qualifier doesn't match current database */
  4141.             raiserror (15250, -1,-1)
  4142.             return
  4143.         end
  4144.     end
  4145.     if @pktable_qualifier is not null
  4146.     begin
  4147.         if db_name() <> @pktable_qualifier
  4148.         begin    /* If qualifier doesn't match current database */
  4149.             raiserror (15250, -1,-1)
  4150.             return
  4151.         end
  4152.     end
  4153.  
  4154.     if @pktable_owner is null
  4155.     begin    /* If unqualified primary key table name */
  4156.         SELECT @pkfull_table_name = quotename(@pktable_name)
  4157.     end
  4158.     else
  4159.     begin    /* Qualified primary key table name */
  4160.         if @pktable_owner = ''
  4161.         begin    /* If empty owner name */
  4162.             SELECT @pkfull_table_name = quotename(@pktable_owner)
  4163.         end
  4164.         else
  4165.         begin
  4166.             SELECT @pkfull_table_name = quotename(@pktable_owner) +
  4167.                 '.' + quotename(@pktable_name)
  4168.         end
  4169.     end
  4170.     /*    Get Object ID */
  4171.     SELECT @pktable_id = object_id(@pkfull_table_name)
  4172.  
  4173.     if @fktable_owner is null
  4174.     begin    /* If unqualified foreign key table name */
  4175.         SELECT @fkfull_table_name = quotename(@fktable_name)
  4176.     end
  4177.     else
  4178.     begin    /* Qualified foreign key table name */
  4179.         if @fktable_owner = ''
  4180.         begin    /* If empty owner name */
  4181.             SELECT @fkfull_table_name = quotename(@fktable_owner)
  4182.         end
  4183.         else
  4184.         begin
  4185.             SELECT @fkfull_table_name = quotename(@fktable_owner) +
  4186.                 '.' + quotename(@fktable_name)
  4187.         end
  4188.     end
  4189.     /*    Get Object ID */
  4190.     SELECT @fktable_id = object_id(@fkfull_table_name)
  4191.  
  4192.     if @fktable_name is not null
  4193.     begin
  4194.         if @fktable_id is null
  4195.             SELECT @fktable_id = 0    /* fk table not found, empty result */
  4196.     end
  4197.  
  4198.     if @pktable_name is null
  4199.     begin /*  If table name not supplied, match all */
  4200.         select @order_by_pk = 1
  4201.     end
  4202.     else
  4203.     begin
  4204.         if @pktable_id is null
  4205.         begin
  4206.             SELECT @pktable_id = 0    /* pk table not found, empty result */
  4207.         end
  4208.     end
  4209.  
  4210.     /*    SQL Server supports upto 16 PK/FK relationships between 2 tables */
  4211.     /*    Process syskeys for each relationship */
  4212.     /*  First, attempt to get all 16 keys for each rel'ship, then sort
  4213.         them out with a 16-way "insert select ... union select ..." */
  4214.  
  4215.     /* select 'XXX starting data analysis' */
  4216.  
  4217.     insert into #fkeysall
  4218.         select
  4219.             r.rkeyid,
  4220.             r.rkey1, r.rkey2, r.rkey3, r.rkey4,
  4221.                 r.rkey5, r.rkey6, r.rkey7, r.rkey8,
  4222.                 r.rkey9, r.rkey10, r.rkey11, r.rkey12,
  4223.                 r.rkey13, r.rkey14, r.rkey15, r.rkey16,
  4224.             r.fkeyid,
  4225.             r.fkey1, r.fkey2, r.fkey3, r.fkey4,
  4226.                 r.fkey5, r.fkey6, r.fkey7, r.fkey8,
  4227.                 r.fkey9, r.fkey10, r.fkey11, r.fkey12,
  4228.                 r.fkey13, r.fkey14, r.fkey15, r.fkey16,
  4229.             r.constid,
  4230.             i.name
  4231.         from
  4232.             sysreferences r, sysobjects o, sysindexes i
  4233.         where    r.constid = o.id
  4234.             AND o.xtype = 'F'
  4235.             AND r.rkeyindid = i.indid
  4236.             AND r.rkeyid = i.id
  4237.             AND r.rkeyid between isnull(@pktable_id, 0)
  4238.                             and isnull(@pktable_id, 0x7fffffff)
  4239.             AND r.fkeyid between isnull(@fktable_id, 0)
  4240.                             and isnull(@fktable_id, 0x7fffffff)
  4241.  
  4242.     /* select count (*) as 'XXX countall' from #fkeysall */
  4243.  
  4244.     insert into #fkeys
  4245.             select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name
  4246.             from #fkeysall
  4247.         union all
  4248.             select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name
  4249.             from #fkeysall
  4250.         union all
  4251.             select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name
  4252.             from #fkeysall
  4253.         union all
  4254.             select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name
  4255.             from #fkeysall
  4256.         union all
  4257.             select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name
  4258.             from #fkeysall
  4259.         union all
  4260.             select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name
  4261.             from #fkeysall
  4262.         union all
  4263.             select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name
  4264.             from #fkeysall
  4265.         union all
  4266.             select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name
  4267.             from #fkeysall
  4268.         union all
  4269.             select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name
  4270.             from #fkeysall
  4271.         union all
  4272.             select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name
  4273.             from #fkeysall
  4274.         union all
  4275.             select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name
  4276.             from #fkeysall
  4277.         union all
  4278.             select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name
  4279.             from #fkeysall
  4280.         union all
  4281.             select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name
  4282.             from #fkeysall
  4283.         union all
  4284.             select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name
  4285.             from #fkeysall
  4286.         union all
  4287.             select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name
  4288.             from #fkeysall
  4289.         union all
  4290.             select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name
  4291.             from #fkeysall
  4292.  
  4293.     /* select count (*) as 'XXX count' from #fkeys */
  4294.  
  4295.     insert into #fkeysout
  4296.         select
  4297.             PKTABLE_QUALIFIER = convert(sysname,db_name()),
  4298.             PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),
  4299.             PKTABLE_NAME = convert(sysname,o1.name),
  4300.             PKCOLUMN_NAME = convert(sysname,c1.name),
  4301.             FKTABLE_QUALIFIER = convert(sysname,db_name()),
  4302.             FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),
  4303.             FKTABLE_NAME = convert(sysname,o2.name),
  4304.             FKCOLUMN_NAME = convert(sysname,c2.name),
  4305.             KEY_SEQ,
  4306.             UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN 
  4307.                 convert(smallint,0) ELSE convert(smallint,1) END,
  4308.             DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN 
  4309.                 convert(smallint,0) ELSE convert(smallint,1) END,
  4310.             FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),
  4311.             PK_NAME,
  4312.             DEFERRABILITY = 7    /* SQL_NOT_DEFERRABLE */
  4313.         from #fkeys f,
  4314.             sysobjects o1, sysobjects o2,
  4315.             syscolumns c1, syscolumns c2
  4316.         where    o1.id = f.pktable_id
  4317.             AND o2.id = f.fktable_id
  4318.             AND c1.id = f.pktable_id
  4319.             AND c2.id = f.fktable_id
  4320.             AND c1.colid = f.pkcolid
  4321.             AND c2.colid = f.fkcolid
  4322.     /* select count (*) as 'XXX countout' from #fkeysout */
  4323.  
  4324.     if @order_by_pk = 1 /*    If order by PK fields */
  4325.         select
  4326.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  4327.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  4328.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  4329.         from #fkeysout
  4330.         order by 1,2,3,9,4
  4331.     else        /*    Order by FK fields */
  4332.         select
  4333.             PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
  4334.             FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
  4335.             KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
  4336.         from #fkeysout
  4337.         order by 5,6,7,9,8
  4338. go
  4339. grant execute on sp_fkeys to public
  4340. go
  4341.  
  4342. dump tran master with no_log
  4343. go
  4344.  
  4345. print 'creating sp_pkeys'
  4346. go
  4347.  
  4348. /*    Procedure for pre-6.0 server */
  4349. CREATE PROCEDURE sp_pkeys(
  4350.                @table_name        varchar(32),
  4351.                @table_owner     varchar(32) = null,
  4352.                @table_qualifier varchar(32) = null )
  4353. as
  4354.     set nocount on
  4355.     if @table_qualifier is not null
  4356.     begin
  4357.         if db_name() <> @table_qualifier
  4358.         begin    /* If qualifier doesn't match current database */
  4359.             raiserror 20001 '~~Rush_5~~'
  4360.             return
  4361.         end
  4362.     end
  4363.     if @table_owner is null /*    If owner not supplied, match all */
  4364.         select @table_owner = '%'
  4365.     if @@trancount <> 0
  4366.     begin    /* If inside a transaction */
  4367.         raiserror 20003 '~~Rush_35~~'
  4368.         return
  4369.     end
  4370.  
  4371.     create table #pkeys(
  4372.              TABLE_QUALIFIER varchar(32) NULL,
  4373.              TABLE_OWNER     varchar(32) NULL,
  4374.              TABLE_NAME      varchar(32) NOT NULL,
  4375.              COLUMN_NAME     varchar(32) NOT NULL,
  4376.              KEY_SEQ         smallint NOT NULL)
  4377.  
  4378.     /*    SQL Server supports upto 8 PK/FK relationships between 2 tables */
  4379.     /*    Process syskeys for each relationship */
  4380.     /*    The inserts below adds a row to the temp table for each of the
  4381.         8 possible relationships */
  4382.     insert into #pkeys
  4383.         select
  4384.             db_name(),
  4385.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4386.             object_name(k.id),
  4387.             c.name,
  4388.             1
  4389.         from
  4390.             syskeys k, syscolumns c
  4391.         where
  4392.             c.id = k.id
  4393.             and k.type = 1    /* Primary type key */
  4394.             and c.colid = k.key1
  4395.     if (@@rowcount = 0)
  4396.         goto done
  4397.  
  4398.     insert into #pkeys
  4399.         select
  4400.             db_name(),
  4401.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4402.             object_name(k.id),
  4403.             c.name,
  4404.             2
  4405.         from
  4406.             syskeys k, syscolumns c
  4407.         where
  4408.             c.id = k.id
  4409.             and k.type = 1    /* Primary type key */
  4410.             and c.colid = key2
  4411.     if (@@rowcount = 0)
  4412.         goto done
  4413.  
  4414.     insert into #pkeys
  4415.         select
  4416.             db_name(),
  4417.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4418.             object_name(k.id),
  4419.             c.name,
  4420.             3
  4421.         from
  4422.             syskeys k, syscolumns c
  4423.         where
  4424.             c.id = k.id
  4425.             and k.type = 1    /* Primary type key */
  4426.             and c.colid = key3
  4427.     if (@@rowcount = 0)
  4428.         goto done
  4429.  
  4430.     insert into #pkeys
  4431.         select
  4432.             db_name(),
  4433.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4434.             object_name(k.id),
  4435.             c.name,
  4436.             4
  4437.         from
  4438.             syskeys k, syscolumns c
  4439.         where
  4440.             c.id = k.id
  4441.             and k.type = 1    /* Primary type key */
  4442.             and c.colid = key4
  4443.     if (@@rowcount = 0)
  4444.         goto done
  4445.  
  4446.     insert into #pkeys
  4447.         select
  4448.             db_name(),
  4449.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4450.             object_name(k.id),
  4451.             c.name,
  4452.             5
  4453.         from
  4454.             syskeys k, syscolumns c
  4455.         where
  4456.             c.id = k.id
  4457.             and k.type = 1    /* Primary type key */
  4458.             and c.colid = key5
  4459.     if (@@rowcount = 0)
  4460.         goto done
  4461.  
  4462.     insert into #pkeys
  4463.         select
  4464.             db_name(),
  4465.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4466.             object_name(k.id),
  4467.             c.name,
  4468.             6
  4469.         from
  4470.             syskeys k, syscolumns c
  4471.         where
  4472.             c.id = k.id
  4473.             and k.type = 1    /* Primary type key */
  4474.             and c.colid = key6
  4475.     if (@@rowcount = 0)
  4476.         goto done
  4477.  
  4478.     insert into #pkeys
  4479.         select
  4480.             db_name(),
  4481.             (select user_name(uid) from sysobjects o where o.id = k.id),
  4482.             object_name(k.id),
  4483.             c.name,
  4484.             7
  4485.         from
  4486.             syskeys k, syscolumns c
  4487.         where
  4488.             c.id = k.id
  4489.             and k.type = 1    /* Primary type key */
  4490.             and c.colid = key7
  4491.     if (@@rowcount = 0)
  4492.         goto done
  4493.  
  4494.     insert into #pkeys
  4495.          select
  4496.              db_name(),
  4497.              (select user_name(uid) from sysobjects o where o.id = k.id),
  4498.              object_name(k.id),
  4499.              c.name,
  4500.              8
  4501.          from
  4502.              syskeys k, syscolumns c
  4503.          where
  4504.              c.id = k.id
  4505.              and k.type = 1 /* Primary type key */
  4506.              and c.colid = key8
  4507.  
  4508.     done:
  4509.     select
  4510.         TABLE_QUALIFIER,
  4511.         TABLE_OWNER,
  4512.         TABLE_NAME,
  4513.         COLUMN_NAME,
  4514.         KEY_SEQ,
  4515.         PK_NAME = convert(varchar(32),null)
  4516.     from #pkeys
  4517.     where TABLE_NAME = @table_name
  4518.         and TABLE_OWNER like @table_owner
  4519.     order by 1, 2, 3, 5
  4520. go
  4521.  
  4522. if (charindex('6.00', @@version) = 0 and
  4523.     charindex('6.50', @@version) = 0 and
  4524.     charindex('7.00', @@version) = 0 and
  4525.     charindex('8.00', @@version) = 0)
  4526. begin
  4527.     print ''
  4528.     print ''
  4529.     print 'Warning:'
  4530.     print 'you are installing the stored procedures '
  4531.     print 'on a pre 6.0 SQL Server.'
  4532.     print 'Ignore the following error.'
  4533. end
  4534. else
  4535.     drop proc sp_pkeys
  4536. go
  4537.  
  4538. /*    Procedure for 6.0 and 6.50 servers */
  4539. CREATE PROCEDURE sp_pkeys(
  4540.                @table_name        sysname,
  4541.                @table_owner     sysname = null,
  4542.                @table_qualifier sysname = null )
  4543. as
  4544.     DECLARE @table_id            int
  4545.     DECLARE @full_table_name    varchar(255) /* 2*128 + 1 */
  4546.  
  4547.     if @table_qualifier is not null
  4548.     begin
  4549.         if db_name() <> @table_qualifier
  4550.         begin    /* If qualifier doesn't match current database */
  4551.             raiserror (15250, -1,-1)
  4552.             return
  4553.         end
  4554.     end
  4555.     if @table_owner is null
  4556.     begin    /* If unqualified table name */
  4557.         SELECT @full_table_name = @table_name
  4558.     end
  4559.     else
  4560.     begin    /* Qualified table name */
  4561.         if @table_owner = ''
  4562.         begin    /* If empty owner name */
  4563.             SELECT @full_table_name = @table_owner
  4564.         end
  4565.         else
  4566.         begin
  4567.             SELECT @full_table_name = @table_owner + '.' + @table_name
  4568.         end
  4569.     end
  4570.     /*    Get Object ID */
  4571.     SELECT @table_id = object_id(@full_table_name)
  4572.  
  4573.     select
  4574.         TABLE_QUALIFIER = convert(sysname,db_name()),
  4575.         TABLE_OWNER = convert(sysname,user_name(o.uid)),
  4576.         TABLE_NAME = convert(sysname,o.name),
  4577.         COLUMN_NAME = convert(sysname,c.name),
  4578.         KEY_SEQ = convert(smallint,c1.colid),
  4579.         PK_NAME = convert(sysname,i.name)
  4580.     from
  4581.         sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  4582.     where
  4583.         o.id = @table_id
  4584.         and o.id = c.id
  4585.         and o.id = i.id
  4586.         and (i.status & 0x800) = 0x800
  4587.         and c.name = index_col (@full_table_name, i.indid, c1.colid)
  4588.         and c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  4589.         and c1.id = @table_id
  4590.     order by 1, 2, 3, 5
  4591. go
  4592.  
  4593. if (charindex('7.00', @@version) = 0 and
  4594.     charindex('8.00', @@version) = 0)
  4595. begin
  4596.     print ''
  4597.     print ''
  4598.     print 'Warning:'
  4599.     print 'you are installing the stored procedures '
  4600.     print 'on a pre 7.0 SQL Server.'
  4601.     print 'Ignore the following errors.'
  4602. end
  4603. else
  4604.     drop proc sp_pkeys
  4605. go
  4606.  
  4607. /*    Procedure for 8.0 server */
  4608. CREATE PROCEDURE sp_pkeys(
  4609.                @table_name        sysname,
  4610.                @table_owner     sysname = null,
  4611.                @table_qualifier sysname = null )
  4612. as
  4613.     DECLARE @table_id        int
  4614.     DECLARE @full_table_name    nvarchar(255)
  4615.  
  4616.     if @table_qualifier is not null
  4617.     begin
  4618.         if db_name() <> @table_qualifier
  4619.         begin    /* If qualifier doesn't match current database */
  4620.             raiserror (15250, -1,-1)
  4621.             return
  4622.         end
  4623.     end
  4624.     if @table_owner is null
  4625.     begin    /* If unqualified table name */
  4626.         SELECT @full_table_name = quotename(@table_name)
  4627.     end
  4628.     else
  4629.     begin    /* Qualified table name */
  4630.         if @table_owner = ''
  4631.         begin    /* If empty owner name */
  4632.             SELECT @full_table_name = quotename(@table_owner)
  4633.         end
  4634.         else
  4635.         begin
  4636.             SELECT @full_table_name = quotename(@table_owner) +
  4637.                 '.' + quotename(@table_name)
  4638.         end
  4639.     end
  4640.     /*    Get Object ID */
  4641.     SELECT @table_id = object_id(@full_table_name)
  4642.  
  4643.     select
  4644.         TABLE_QUALIFIER = convert(sysname,db_name()),
  4645.         TABLE_OWNER = convert(sysname,user_name(o.uid)),
  4646.         TABLE_NAME = convert(sysname,o.name),
  4647.         COLUMN_NAME = convert(sysname,c.name),
  4648.         --KEY_SEQ = convert(smallint,c.colid),
  4649.         KEY_SEQ =
  4650.             case
  4651.                 when c.name = index_col(@full_table_name, i.indid,  1) then convert (smallint,1)
  4652.                 when c.name = index_col(@full_table_name, i.indid,  2) then convert (smallint,2)
  4653.                 when c.name = index_col(@full_table_name, i.indid,  3) then convert (smallint,3)
  4654.                 when c.name = index_col(@full_table_name, i.indid,  4) then convert (smallint,4)
  4655.                 when c.name = index_col(@full_table_name, i.indid,  5) then convert (smallint,5)
  4656.                 when c.name = index_col(@full_table_name, i.indid,  6) then convert (smallint,6)
  4657.                 when c.name = index_col(@full_table_name, i.indid,  7) then convert (smallint,7)
  4658.                 when c.name = index_col(@full_table_name, i.indid,  8) then convert (smallint,8)
  4659.                 when c.name = index_col(@full_table_name, i.indid,  9) then convert (smallint,9)
  4660.                 when c.name = index_col(@full_table_name, i.indid, 10) then convert (smallint,10)
  4661.                 when c.name = index_col(@full_table_name, i.indid, 11) then convert (smallint,11)
  4662.                 when c.name = index_col(@full_table_name, i.indid, 12) then convert (smallint,12)
  4663.                 when c.name = index_col(@full_table_name, i.indid, 13) then convert (smallint,13)
  4664.                 when c.name = index_col(@full_table_name, i.indid, 14) then convert (smallint,14)
  4665.                 when c.name = index_col(@full_table_name, i.indid, 15) then convert (smallint,15)
  4666.                 when c.name = index_col(@full_table_name, i.indid, 16) then convert (smallint,16)
  4667.             end,
  4668.         PK_NAME = convert(sysname,i.name)
  4669.     from
  4670.         sysindexes i, syscolumns c, sysobjects o --, syscolumns c1
  4671.     where
  4672.         o.id = @table_id
  4673.         and o.id = c.id
  4674.         and o.id = i.id
  4675.         and (i.status & 0x800) = 0x800
  4676.         --and c.name = index_col (@full_table_name, i.indid, c1.colid)
  4677.         and (c.name = index_col (@full_table_name, i.indid,  1) or
  4678.              c.name = index_col (@full_table_name, i.indid,  2) or
  4679.              c.name = index_col (@full_table_name, i.indid,  3) or
  4680.              c.name = index_col (@full_table_name, i.indid,  4) or
  4681.              c.name = index_col (@full_table_name, i.indid,  5) or
  4682.              c.name = index_col (@full_table_name, i.indid,  6) or
  4683.              c.name = index_col (@full_table_name, i.indid,  7) or
  4684.              c.name = index_col (@full_table_name, i.indid,  8) or
  4685.              c.name = index_col (@full_table_name, i.indid,  9) or
  4686.              c.name = index_col (@full_table_name, i.indid, 10) or
  4687.              c.name = index_col (@full_table_name, i.indid, 11) or
  4688.              c.name = index_col (@full_table_name, i.indid, 12) or
  4689.              c.name = index_col (@full_table_name, i.indid, 13) or
  4690.              c.name = index_col (@full_table_name, i.indid, 14) or
  4691.              c.name = index_col (@full_table_name, i.indid, 15) or
  4692.              c.name = index_col (@full_table_name, i.indid, 16)
  4693.             )
  4694.         --and c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  4695.         --and c1.id = @table_id
  4696.     order by 1, 2, 3, 5
  4697. go
  4698.  
  4699.  
  4700. grant execute on sp_pkeys to public
  4701. go
  4702.  
  4703. dump tran master with no_log
  4704. go
  4705.  
  4706. print 'creating sp_server_info'
  4707. go
  4708.  
  4709. create proc sp_server_info (
  4710.             @attribute_id  int = null)
  4711. as
  4712.     if @attribute_id is not null
  4713.         select *
  4714.         from master.dbo.spt_server_info
  4715.         where attribute_id = @attribute_id
  4716.     else
  4717.         select *
  4718.         from master.dbo.spt_server_info
  4719.         order by attribute_id
  4720. go
  4721.  
  4722. grant execute on sp_server_info to public
  4723. go
  4724.  
  4725. dump tran master with no_log
  4726. go
  4727.  
  4728. print 'creating sp_special_columns'
  4729. go
  4730.  
  4731. /*    Procedure for pre-6.0 server */
  4732. CREATE PROCEDURE sp_special_columns (
  4733.                  @table_name        varchar(32),
  4734.                  @table_owner        varchar(32) = null,
  4735.                  @table_qualifier    varchar(32) = null,
  4736.                  @col_type            char(1) = 'R',
  4737.                  @scope                char(1) = 'T',
  4738.                  @nullable            char(1) = 'U',
  4739.                  @ODBCVer            int = 2)
  4740. AS
  4741.     DECLARE @indid                int
  4742.     DECLARE @table_id            int
  4743.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  4744.     DECLARE @scopeout            smallint
  4745.  
  4746.     if @col_type not in ('R','V') or @col_type is null
  4747.     begin
  4748.         raiserror 20002 '~~Rush_42~~'
  4749.         return
  4750.     end
  4751.  
  4752.     if @scope = 'C'
  4753.         select @scopeout = 0
  4754.     else if @scope = 'T'
  4755.         select @scopeout = 1
  4756.     else
  4757.     begin
  4758.         raiserror 20002 '~~Rush_43~~'
  4759.         return
  4760.     end
  4761.  
  4762.     if @nullable not in ('U','O') or @nullable is null
  4763.     begin
  4764.         raiserror 20002 '~~Rush_44~~'
  4765.         return
  4766.     end
  4767.  
  4768.     if @table_qualifier is not null
  4769.     begin
  4770.         if db_name() <> @table_qualifier
  4771.         begin /* If qualifier doesn't match current database */
  4772.             raiserror 20001 '~~Rush_5~~'
  4773.             return
  4774.         end
  4775.     end
  4776.     if @table_owner is null
  4777.     begin     /* If unqualified table name */
  4778.         SELECT @full_table_name = @table_name
  4779.     end
  4780.     else
  4781.     begin    /* Qualified table name */
  4782.         SELECT @full_table_name = @table_owner + '.' + @table_name
  4783.     end
  4784.     /*    Get Object ID */
  4785.     SELECT @table_id = object_id(@full_table_name)
  4786.  
  4787.     if @col_type = 'V'
  4788.     BEGIN /* if ROWVER, just run that query */
  4789.         SELECT
  4790.             SCOPE = convert(smallint,NULL),
  4791.             COLUMN_NAME = convert(varchar(32),c.name),
  4792.             DATA_TYPE = convert(smallint, -3),
  4793.             TYPE_NAME = t.name,
  4794.             "PRECISION" = convert(int,8),
  4795.             LENGTH = convert(int,8),
  4796.             SCALE = convert(smallint, NULL),
  4797.             PSEUDO_COLUMN = convert(smallint,1)
  4798.         FROM
  4799.             systypes t, syscolumns c
  4800.         WHERE
  4801.             c.id = @table_id
  4802.             AND c.usertype = 80 /*    TIMESTAMP */
  4803.             AND t.usertype = 80 /*    TIMESTAMP */
  4804.         RETURN
  4805.     END
  4806.  
  4807.     /* ROWID, now find the id of the 'best' index for this table */
  4808.  
  4809.     IF @nullable = 'O'    /* Don't include any indexes that contain
  4810.                            nullable columns. */
  4811.  
  4812.             SELECT @indid = MIN(indid)
  4813.                 FROM sysindexes i,syscolumns c,syscolumns c2
  4814.                 WHERE
  4815.                     i.status&2 = 2        /*    If Unique Index */
  4816.                      AND c.id = i.id
  4817.                      AND c2.id = c.id
  4818.                      AND c2.colid < i.keycnt + (i.status&16)/16
  4819.                     AND i.id = @table_id
  4820.                     AND indid > 0        /*    Eliminate Table Row */
  4821.                     AND c.name = index_col(@table_name,i.indid,c2.colid)
  4822.                     GROUP BY indid HAVING SUM(c.status&8) = 0
  4823.  
  4824.     ELSE    /* Include indexes that are partially nullable. */
  4825.  
  4826.         SELECT @indid = MIN(indid)
  4827.             FROM sysindexes i
  4828.             WHERE
  4829.                 status&2 = 2        /*    If Unique Index */
  4830.                 AND id = @table_id
  4831.                 AND indid > 0        /*    Eliminate Table Row */
  4832.  
  4833.     SELECT
  4834.         SCOPE = @scopeout,
  4835.         COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
  4836.         d.DATA_TYPE,
  4837.         TYPE_NAME = t.name,
  4838.         "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  4839.         LENGTH = isnull(d.length, convert(int,c.length)),
  4840.         SCALE = d.numeric_scale,
  4841.         PSEUDO_COLUMN = convert(smallint,1)
  4842.     FROM
  4843.         sysindexes x,
  4844.         syscolumns c,
  4845.         master.dbo.spt_datatype_info d,
  4846.         systypes t,
  4847.         syscolumns c2    /* Self-join to generate list of index columns and */
  4848.                         /* to extract datatype names */
  4849.     WHERE
  4850.         x.id = @table_id
  4851.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  4852.         AND c.id = x.id
  4853.         AND c2.id = x.id
  4854.         AND c2.colid < keycnt+(x.status&16)/16
  4855.         AND x.indid = @indid
  4856.         AND t.type = d.ss_dtype
  4857.         AND c.length = d.fixlen
  4858.         AND c.usertype = t.usertype
  4859.  
  4860. go
  4861.  
  4862. if (charindex('6.00', @@version) = 0 and
  4863.     charindex('6.50', @@version) = 0 and
  4864.     charindex('7.00', @@version) = 0 and
  4865.     charindex('8.00', @@version) = 0)
  4866. begin
  4867.     print ''
  4868.     print ''
  4869.     print 'Warning:'
  4870.     print 'you are installing the stored procedures '
  4871.     print 'on a pre 6.0 SQL Server.'
  4872.     print 'Ignore the following errors.'
  4873. end
  4874. else
  4875.     drop proc sp_special_columns
  4876. go
  4877.  
  4878. /*    Procedure for 6.0 and 6.50 servers */
  4879. CREATE PROCEDURE sp_special_columns (
  4880.                  @table_name        varchar(32),
  4881.                  @table_owner        varchar(32) = null,
  4882.                  @table_qualifier    varchar(32) = null,
  4883.                  @col_type            char(1) = 'R',
  4884.                  @scope                char(1) = 'T',
  4885.                  @nullable            char(1) = 'U',
  4886.                  @ODBCVer            int = 2)
  4887. AS
  4888.     DECLARE @indid                int
  4889.     DECLARE @table_id            int
  4890.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  4891.     DECLARE @scopeout            smallint
  4892.  
  4893.     if @col_type not in ('R','V') or @col_type is null
  4894.     begin
  4895.         raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
  4896.         return
  4897.     end
  4898.  
  4899.     if @scope = 'C'
  4900.         select @scopeout = 0
  4901.     else if @scope = 'T'
  4902.         select @scopeout = 1
  4903.     else
  4904.     begin
  4905.         raiserror (15251,-1,-1,'scope','''C'' or ''T''')
  4906.         return
  4907.     end
  4908.  
  4909.     if @nullable not in ('U','O') or @nullable is null
  4910.     begin
  4911.         raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
  4912.         return
  4913.     end
  4914.  
  4915.     if @table_qualifier is not null
  4916.     begin
  4917.         if db_name() <> @table_qualifier
  4918.         begin /* If qualifier doesn't match current database */
  4919.             raiserror (15250, -1,-1)
  4920.             return
  4921.         end
  4922.     end
  4923.     if @table_owner is null
  4924.     begin     /* If unqualified table name */
  4925.         SELECT @full_table_name = @table_name
  4926.     end
  4927.     else
  4928.     begin     /* Qualified table name */
  4929.         SELECT @full_table_name = @table_owner + '.' + @table_name
  4930.     end
  4931.     /*    Get Object ID */
  4932.     SELECT @table_id = object_id(@full_table_name)
  4933.  
  4934.     if @col_type = 'V'
  4935.     BEGIN /* if ROWVER, just run that query */
  4936.         SELECT
  4937.             SCOPE = convert(smallint,NULL),
  4938.             COLUMN_NAME = convert(varchar(32),c.name),
  4939.             DATA_TYPE = convert(smallint, -2),
  4940.             TYPE_NAME = t.name,
  4941.             "PRECISION" = convert(int,8),
  4942.             LENGTH = convert(int,8),
  4943.             SCALE = convert(smallint, NULL),
  4944.             PSEUDO_COLUMN = convert(smallint,1)
  4945.         FROM
  4946.             systypes t, syscolumns c
  4947.         WHERE
  4948.             c.id = @table_id
  4949.             AND c.usertype = 80 /*    TIMESTAMP */
  4950.             AND t.usertype = 80 /*    TIMESTAMP */
  4951.         RETURN
  4952.     END
  4953.  
  4954.     /* ROWID, now find the id of the 'best' index for this table */
  4955.  
  4956.     IF @nullable = 'O'    /* Don't include any indexes that contain
  4957.                            nullable columns. */
  4958.  
  4959.         SELECT @indid = MIN(indid)
  4960.             FROM sysindexes i,syscolumns c,syscolumns c2
  4961.             WHERE
  4962.                 i.status&2 = 2        /*    If Unique Index */
  4963.                 AND c.id = i.id
  4964.                 AND c2.id = c.id
  4965.                 AND c2.colid < i.keycnt + (i.status&16)/16
  4966.                 AND i.id = @table_id
  4967.                 AND indid > 0        /*    Eliminate Table Row */
  4968.                 AND c.name = index_col(@table_name,i.indid,c2.colid)
  4969.                 GROUP BY indid HAVING SUM(c.status&8) = 0
  4970.  
  4971.     ELSE    /* Include indexes that are partially nullable. */
  4972.  
  4973.         SELECT @indid = MIN(indid)
  4974.             FROM sysindexes i
  4975.             WHERE
  4976.                 status&2 = 2        /*    If Unique Index */
  4977.                 AND id = @table_id
  4978.                 AND indid > 0        /*    Eliminate Table Row */
  4979.  
  4980.     SELECT
  4981.         SCOPE = @scopeout,
  4982.         COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
  4983.         d.DATA_TYPE,
  4984.         convert(varchar(32),case
  4985.             when (t.usertype > 100 or t.usertype in (18,80))
  4986.                 then t.name
  4987.             else d.TYPE_NAME
  4988.         end) TYPE_NAME,
  4989.         convert(int,case
  4990.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  4991.             else isnull(convert(int,c.prec), 2147483647)
  4992.         end) "PRECISION",
  4993.         convert(int,case
  4994.             when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  4995.                 convert(int,c.prec+2)
  4996.             else
  4997.                 isnull(d.length, c.length)
  4998.         end) LENGTH,
  4999.         SCALE = convert(smallint, c.scale),
  5000.         PSEUDO_COLUMN = convert(smallint,1)
  5001.     FROM
  5002.         sysindexes x,
  5003.         syscolumns c,
  5004.         master.dbo.spt_datatype_info d,
  5005.         systypes t,
  5006.         syscolumns c2    /* Self-join to generate list of index columns and */
  5007.                         /* to extract datatype names */
  5008.     WHERE
  5009.         x.id = @table_id
  5010.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  5011.         AND c.id = x.id
  5012.         AND c2.id = x.id
  5013.         AND c2.colid < x.keycnt+(x.status&16)/16
  5014.         AND x.indid = @indid
  5015.         AND t.type = d.ss_dtype
  5016.         AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5017.         AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
  5018.         AND c.usertype = t.usertype
  5019. go
  5020.  
  5021. if (charindex('7.00', @@version) = 0 and
  5022.     charindex('8.00', @@version) = 0)
  5023. begin
  5024.     print ''
  5025.     print ''
  5026.     print 'Warning:'
  5027.     print 'you are installing the stored procedures '
  5028.     print 'on a pre 7.0 SQL Server.'
  5029.     print 'Ignore the following errors.'
  5030. end
  5031. else
  5032.     drop proc sp_special_columns
  5033. go
  5034.  
  5035. /*    Procedure for 7.0 servers */
  5036. CREATE PROCEDURE sp_special_columns (
  5037.                  @table_name        sysname,
  5038.                  @table_owner        sysname = null,
  5039.                  @table_qualifier    sysname = null,
  5040.                  @col_type            char(1) = 'R',
  5041.                  @scope                char(1) = 'T',
  5042.                  @nullable            char(1) = 'U',
  5043.                  @ODBCVer            int = 2)
  5044. AS
  5045.     DECLARE @indid                int
  5046.     DECLARE @table_id            int
  5047.     DECLARE @full_table_name    nvarchar(257)
  5048.     DECLARE @scopeout            smallint
  5049.  
  5050.     if @col_type not in ('R','V') or @col_type is null
  5051.     begin
  5052.         raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
  5053.         return
  5054.     end
  5055.  
  5056.     if @scope = 'C'
  5057.         select @scopeout = 0
  5058.     else if @scope = 'T'
  5059.         select @scopeout = 1
  5060.     else
  5061.     begin
  5062.         raiserror (15251,-1,-1,'scope','''C'' or ''T''')
  5063.         return
  5064.     end
  5065.  
  5066.     if @nullable not in ('U','O') or @nullable is null
  5067.     begin
  5068.         raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
  5069.         return
  5070.     end
  5071.  
  5072.     if @table_qualifier is not null
  5073.     begin
  5074.         if db_name() <> @table_qualifier
  5075.         begin /* If qualifier doesn't match current database */
  5076.             raiserror (15250, -1,-1)
  5077.             return
  5078.         end
  5079.     end
  5080.     if @table_owner is null
  5081.     begin     /* If unqualified table name */
  5082.         SELECT @full_table_name = quotename(@table_name)
  5083.     end
  5084.     else
  5085.     begin    /* Qualified table name */
  5086.         if @table_owner = ''
  5087.         begin    /* If empty owner name */
  5088.             SELECT @full_table_name = quotename(@table_owner)
  5089.         end
  5090.         else
  5091.         begin
  5092.             SELECT @full_table_name = quotename(@table_owner) +
  5093.                 '.' + quotename(@table_name)
  5094.         end
  5095.     end
  5096.     /*    Get Object ID */
  5097.     SELECT @table_id = object_id(@full_table_name)
  5098.  
  5099.     if @col_type = 'V'
  5100.     BEGIN /* if ROWVER, just run that query */
  5101.         SELECT
  5102.             SCOPE = convert(smallint,NULL),
  5103.             COLUMN_NAME = convert(sysname,c.name),
  5104.             DATA_TYPE = convert(smallint, -2),
  5105.             TYPE_NAME = t.name,
  5106.             "PRECISION" = convert(int,8),
  5107.             LENGTH = convert(int,8),
  5108.             SCALE = convert(smallint, NULL),
  5109.             PSEUDO_COLUMN = convert(smallint,1)
  5110.         FROM
  5111.             systypes t, syscolumns c
  5112.         WHERE
  5113.             not (@table_id is null)
  5114.             AND c.id = @table_id
  5115.             AND t.name = 'timestamp'    /*    TIMESTAMP  */
  5116.             AND t.xtype = c.xtype        
  5117.             AND t.xusertype = c.xusertype    
  5118.         RETURN
  5119.     END
  5120.  
  5121.     /* ROWID, now find the id of the 'best' index for this table */
  5122.  
  5123.     IF @nullable = 'O'    /* Don't include any indexes that contain
  5124.                            nullable columns. */
  5125.  
  5126.         SELECT @indid = MIN(indid)
  5127.             FROM sysindexes x, syscolumns c, syscolumns c2
  5128.             WHERE
  5129.                 not (@table_id is null)
  5130.                 AND x.status&2 = 2        /*    If Unique Index */
  5131.                 AND c.id = x.id
  5132.                 AND c2.id = c.id
  5133.                 AND c2.colid < x.keycnt + (x.status&16)/16
  5134.                 AND x.id = @table_id
  5135.                 AND indid > 0        /*    Eliminate Table Row */
  5136.                 AND c.name = index_col(@table_name,x.indid,c2.colid)
  5137.                 GROUP BY indid HAVING SUM(c.status&8) = 0
  5138.  
  5139.     ELSE    /* Include indexes that are partially nullable. */
  5140.  
  5141.         SELECT @indid = MIN(indid)
  5142.             FROM sysindexes x
  5143.             WHERE
  5144.                 not (@table_id is null)
  5145.                 AND status&2 = 2        /*    If Unique Index */
  5146.                 AND id = @table_id
  5147.                 AND indid > 0        /*    Eliminate Table Row */
  5148.  
  5149.     SELECT
  5150.         SCOPE = @scopeout,
  5151.         COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),
  5152.         d.DATA_TYPE,
  5153.         convert(sysname,case
  5154.             when t.xusertype > 255 then t.name
  5155.             else d.TYPE_NAME
  5156.         end) TYPE_NAME,
  5157.         convert(int,case
  5158.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  5159.             else OdbcPrec(c.xtype,c.length,c.xprec)
  5160.         end) "PRECISION",
  5161.         convert(int,case
  5162.             when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  5163.                 OdbcPrec(c.xtype,c.length,c.xprec)+2
  5164.             else isnull(d.length, c.length)
  5165.         end) LENGTH,
  5166.         SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  5167.         PSEUDO_COLUMN = convert(smallint,1)
  5168.     FROM
  5169.         sysindexes x,
  5170.         syscolumns c,
  5171.         master.dbo.spt_datatype_info d,
  5172.         systypes t,
  5173.         syscolumns c2    /* Self-join to generate list of index columns and */
  5174.                         /* to extract datatype names */
  5175.     WHERE
  5176.         not (@table_id is null)
  5177.         AND x.id = @table_id
  5178.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  5179.         AND c.id = x.id
  5180.         AND c2.id = x.id
  5181.         AND c2.colid < x.keycnt + (x.status&16)/16
  5182.         AND x.indid = @indid
  5183.         AND t.xtype = d.ss_dtype
  5184.         AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5185.         AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  5186.         AND c.xusertype = t.xusertype
  5187. go
  5188.  
  5189. if (charindex('8.00', @@version) = 0)
  5190. begin
  5191.     print ''
  5192.     print ''
  5193.     print 'Warning:'
  5194.     print 'you are installing the stored procedures '
  5195.     print 'on a pre 8.0 SQL Server.'
  5196.     print 'Ignore the following errors.'
  5197. end
  5198. else
  5199.     drop proc sp_special_columns
  5200. go
  5201.  
  5202. /*    Procedure for 8.0 and later servers */
  5203. CREATE PROCEDURE sp_special_columns (
  5204.                  @table_name        sysname,
  5205.                  @table_owner        sysname = null,
  5206.                  @table_qualifier    sysname = null,
  5207.                  @col_type            char(1) = 'R',
  5208.                  @scope                char(1) = 'T',
  5209.                  @nullable            char(1) = 'U',
  5210.                  @ODBCVer            int = 2)
  5211. AS
  5212.     DECLARE @indid                int
  5213.     DECLARE @table_id            int
  5214.     DECLARE @full_table_name    nvarchar(257)
  5215.     DECLARE @scopeout            smallint
  5216.  
  5217.     if @col_type not in ('R','V') or @col_type is null
  5218.     begin
  5219.         raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
  5220.         return
  5221.     end
  5222.  
  5223.     if @scope = 'C'
  5224.         select @scopeout = 0
  5225.     else if @scope = 'T'
  5226.         select @scopeout = 1
  5227.     else
  5228.     begin
  5229.         raiserror (15251,-1,-1,'scope','''C'' or ''T''')
  5230.         return
  5231.     end
  5232.  
  5233.     if @nullable not in ('U','O') or @nullable is null
  5234.     begin
  5235.         raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
  5236.         return
  5237.     end
  5238.  
  5239.     if @table_qualifier is not null
  5240.     begin
  5241.         if db_name() <> @table_qualifier
  5242.         begin /* If qualifier doesn't match current database */
  5243.             raiserror (15250, -1,-1)
  5244.             return
  5245.         end
  5246.     end
  5247.     if @table_owner is null
  5248.     begin     /* If unqualified table name */
  5249.         SELECT @full_table_name = quotename(@table_name)
  5250.     end
  5251.     else
  5252.     begin    /* Qualified table name */
  5253.         if @table_owner = ''
  5254.         begin    /* If empty owner name */
  5255.             SELECT @full_table_name = quotename(@table_owner)
  5256.         end
  5257.         else
  5258.         begin
  5259.             SELECT @full_table_name = quotename(@table_owner) +
  5260.                 '.' + quotename(@table_name)
  5261.         end
  5262.     end
  5263.     /*    Get Object ID */
  5264.     SELECT @table_id = object_id(@full_table_name)
  5265.  
  5266.     if @col_type = 'V'
  5267.     BEGIN /* if ROWVER, just run that query */
  5268.         SELECT
  5269.             SCOPE = convert(smallint,NULL),
  5270.             COLUMN_NAME = convert(sysname,c.name),
  5271.             DATA_TYPE = convert(smallint, -2),
  5272.             TYPE_NAME = t.name,
  5273.             "PRECISION" = convert(int,8),
  5274.             LENGTH = convert(int,8),
  5275.             SCALE = convert(smallint, NULL),
  5276.             PSEUDO_COLUMN = convert(smallint,1)
  5277.         FROM
  5278.             systypes t, syscolumns c
  5279.         WHERE
  5280.             not (@table_id is null)
  5281.             AND c.id = @table_id
  5282.             AND t.name = 'timestamp'    /*    TIMESTAMP  */
  5283.             AND t.xtype = c.xtype        
  5284.             AND t.xusertype = c.xusertype    
  5285.         RETURN
  5286.     END
  5287.  
  5288.     /* ROWID, now find the id of the 'best' index for this table */
  5289.  
  5290.     IF @nullable = 'O'    /* Don't include any indexes that contain
  5291.                            nullable columns. */
  5292.  
  5293.         SELECT @indid = MIN(indid)
  5294.             FROM sysindexes x, syscolumns c, syscolumns c2
  5295.             WHERE
  5296.                 not (@table_id is null)
  5297.                 AND x.status&2 = 2        /*    If Unique Index */
  5298.                 AND c.id = x.id
  5299.                 AND c2.id = c.id
  5300.                 AND c2.colid < x.keycnt + (x.status&18)/18
  5301.                 AND x.id = @table_id
  5302.                 AND indid > 0        /*    Eliminate Table Row */
  5303.                 AND c.name = index_col(@table_name,x.indid,c2.colid)
  5304.                 GROUP BY indid HAVING SUM(c.status&8) = 0
  5305.  
  5306.     ELSE    /* Include indexes that are partially nullable. */
  5307.  
  5308.         SELECT @indid = MIN(indid)
  5309.             FROM sysindexes x
  5310.             WHERE
  5311.                 not (@table_id is null)
  5312.                 AND status&2 = 2        /*    If Unique Index */
  5313.                 AND id = @table_id
  5314.                 AND indid > 0        /*    Eliminate Table Row */
  5315.  
  5316.     SELECT
  5317.         SCOPE = @scopeout,
  5318.         COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),
  5319.         d.DATA_TYPE,
  5320.         convert(sysname,case
  5321.             when t.xusertype > 255 then t.name
  5322.             else d.TYPE_NAME collate database_default
  5323.         end) TYPE_NAME,
  5324.         convert(int,case
  5325.             when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  5326.             else OdbcPrec(c.xtype,c.length,c.xprec)
  5327.         end) "PRECISION",
  5328.         convert(int,case
  5329.             when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  5330.                 OdbcPrec(c.xtype,c.length,c.xprec)+2
  5331.             else isnull(d.length, c.length)
  5332.         end) LENGTH,
  5333.         SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  5334.         PSEUDO_COLUMN = convert(smallint,1)
  5335.     FROM
  5336.         sysindexes x,
  5337.         syscolumns c,
  5338.         master.dbo.spt_datatype_info d,
  5339.         systypes t,
  5340.         syscolumns c2    /* Self-join to generate list of index columns and */
  5341.                         /* to extract datatype names */
  5342.     WHERE
  5343.         not (@table_id is null)
  5344.         AND x.id = @table_id
  5345.         AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
  5346.         AND c.id = x.id
  5347.         AND c2.id = x.id
  5348.         AND c2.colid < x.keycnt + (x.status&16)/16
  5349.         AND x.indid = @indid
  5350.         AND t.xtype = d.ss_dtype
  5351.         AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5352.         AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
  5353.         AND c.xusertype = t.xusertype
  5354. go
  5355.  
  5356. grant execute on sp_special_columns to public
  5357. go
  5358.  
  5359. dump tran master with no_log
  5360. go
  5361.  
  5362. print 'creating sp_sproc_columns'
  5363. go
  5364.  
  5365. /*    Procedure for pre-6.0 server */
  5366. CREATE PROCEDURE sp_sproc_columns (
  5367.                  @procedure_name        varchar(102) = '%', /* 3*32+5+1 */
  5368.                  @procedure_owner        varchar(96) = null,
  5369.                  @procedure_qualifier    varchar(32) = null,
  5370.                  @column_name            varchar(96) = null,
  5371.                  @ODBCVer                int = 2)
  5372. AS
  5373.     DECLARE @group_num_lower smallint
  5374.     DECLARE @group_num_upper smallint
  5375.     DECLARE @semi_position int
  5376.     DECLARE @full_procedure_name    varchar(205)/* 2*102+1 */
  5377.     DECLARE @procedure_id int
  5378.  
  5379.     if @column_name is null /*    If column name not supplied, match all */
  5380.         select @column_name = '%'
  5381.     if @procedure_qualifier is not null
  5382.     begin
  5383.         if db_name() <> @procedure_qualifier
  5384.         begin
  5385.             if @procedure_qualifier = ''
  5386.             begin
  5387.                 /* in this case, we need to return an empty result set */
  5388.                 /* because the user has requested a database with an empty name */
  5389.                 select @procedure_name = ''
  5390.                 select @procedure_owner = ''
  5391.             end
  5392.             else
  5393.             begin    /* If qualifier doesn't match current database */
  5394.                 raiserror 20001 '~~Rush_51~~'
  5395.                 return
  5396.             end
  5397.         end
  5398.     end
  5399.  
  5400.     if @procedure_name is null
  5401.     begin    /*    If procedure name not supplied, match all */
  5402.         select @procedure_name = '%'
  5403.     end
  5404.  
  5405.     /* first we need to extract the procedure group number, if one exists */
  5406.     select @semi_position = charindex(';',@procedure_name)
  5407.     if (@semi_position > 0)
  5408.     begin    /* If group number separator (;) found */
  5409.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  5410.         select @group_num_upper = @group_num_lower
  5411.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  5412.     end
  5413.     else
  5414.     begin    /* No group separator, so default to group number of 1 */
  5415.         select @group_num_lower = 1
  5416.         select @group_num_upper = 32767            
  5417.     end
  5418.  
  5419.     if @procedure_owner is null
  5420.     begin    /* If unqualified procedure name */
  5421.         SELECT @full_procedure_name = @procedure_name
  5422.     end
  5423.     else
  5424.     begin    /* Qualified procedure name */
  5425.         SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
  5426.     end
  5427.  
  5428.     /*    Get Object ID */
  5429.     SELECT @procedure_id = object_id(@full_procedure_name)
  5430.     if ((charindex('%',@full_procedure_name) = 0) and
  5431.         (charindex('_',@full_procedure_name) = 0) and
  5432.         @procedure_id <> 0)
  5433.     begin
  5434.         /* this block is for the case where there is no pattern
  5435.             matching required for the procedure name */
  5436.         SELECT
  5437.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5438.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5439.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  5440.             COLUMN_NAME = convert(varchar(32),c.name),
  5441.             COLUMN_TYPE = convert(smallint, 0),
  5442.             d.DATA_TYPE,
  5443.             TYPE_NAME = t.name,
  5444.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  5445.             LENGTH = isnull(d.length, convert(int,c.length)),
  5446.             SCALE = d.numeric_scale,
  5447.             d.RADIX,
  5448.             d.NULLABLE,
  5449.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5450.             COLUMN_DEF = convert(varchar(255),null),
  5451.             d.SQL_DATA_TYPE,
  5452.             d.SQL_DATETIME_SUB,
  5453.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  5454.             ORDINAL_POSITION = convert(int, c.colid),
  5455.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  5456.             SS_DATA_TYPE = c.type
  5457.         FROM
  5458.             syscolumns c,
  5459.             sysobjects o,
  5460.             master.dbo.spt_datatype_info d,
  5461.             systypes t
  5462.         WHERE
  5463.             o.id = @procedure_id
  5464.             AND c.id = o.id
  5465.             AND t.type = d.ss_dtype
  5466.             AND c.length = isnull(d.fixlen, c.length)
  5467.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5468.             AND c.usertype = t.usertype
  5469.             AND c.name like @column_name
  5470.             AND c.number between @group_num_lower and @group_num_upper
  5471.         UNION ALL
  5472.         SELECT           /* return value row*/
  5473.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5474.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5475.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  5476.             COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
  5477.             COLUMN_TYPE = convert(smallint, 5),
  5478.             DATA_TYPE = convert(smallint, 4),
  5479.             TYPE_NAME = convert(varchar(32),'int'),
  5480.             "PRECISION" = convert(int,10),
  5481.             LENGTH = convert(int,4),
  5482.             SCALE = convert(smallint,0),
  5483.             RADIX = convert(smallint,10),
  5484.             NULLABLE = convert(smallint,0),
  5485.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5486.             COLUMN_DEF = convert(varchar(255),NULL),
  5487.             SQL_DATA_TYPE = convert(smallint, 4),
  5488.             SQL_DATETIME_SUB = convert(smallint,null),
  5489.             CHAR_OCTET_LENGTH = convert(int,null),
  5490.             ORDINAL_POSITION = convert(int,0),
  5491.             IS_NULLABLE = convert(varchar(254),'NO'),
  5492.             SS_DATA_TYPE = convert(tinyint,56)
  5493.         FROM
  5494.             syscomments c, sysobjects o
  5495.         WHERE
  5496.             o.id = @procedure_id
  5497.             AND c.id = o.id
  5498.             AND c.colid = 1
  5499.             AND o.type = 'P'                        /* Just Procedures */
  5500.             AND '@RETURN_VALUE' like @column_name
  5501.             AND c.number between @group_num_lower and @group_num_upper        
  5502.         ORDER BY 1, 2, 3, 18
  5503.     end
  5504.     else
  5505.     begin
  5506.         /* this block is for the case where there IS pattern
  5507.             matching done on the procedure name */
  5508.         if @procedure_owner is null
  5509.             select @procedure_owner = '%'
  5510.         SELECT
  5511.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5512.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5513.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  5514.             COLUMN_NAME = convert(varchar(32),c.name),
  5515.             COLUMN_TYPE = convert(smallint, 0),
  5516.             d.DATA_TYPE,
  5517.             TYPE_NAME = t.name,
  5518.             "PRECISION" = isnull(d.data_precision, convert(int,c.length)),
  5519.             LENGTH = isnull(d.length, convert(int,c.length)),
  5520.             SCALE = d.numeric_scale,
  5521.             d.RADIX,
  5522.             d.NULLABLE,
  5523.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5524.             COLUMN_DEF = convert(varchar(255),null),
  5525.             d.SQL_DATA_TYPE,
  5526.             d.SQL_DATETIME_SUB,
  5527.             CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
  5528.             ORDINAL_POSITION = convert(int, c.colid),
  5529.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  5530.             SS_DATA_TYPE = c.type
  5531.         FROM
  5532.             syscolumns c,
  5533.             sysobjects o,
  5534.             master.dbo.spt_datatype_info d,
  5535.             systypes t
  5536.         WHERE
  5537.             o.name like @procedure_name
  5538.             AND user_name(o.uid) like @procedure_owner
  5539.             AND o.id = c.id
  5540.             AND t.type = d.ss_dtype
  5541.             AND c.length = isnull(d.fixlen, c.length)
  5542.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5543.             AND c.usertype = t.usertype
  5544.             AND o.type = 'P'                            /* Just Procedures */
  5545.             AND c.name like @column_name
  5546.             AND c.number between @group_num_lower and @group_num_upper
  5547.         UNION ALL
  5548.         SELECT           /* return value row*/
  5549.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5550.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5551.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  5552.             COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
  5553.             COLUMN_TYPE = convert(smallint, 5),
  5554.             DATA_TYPE = convert(smallint, 4),
  5555.             TYPE_NAME = convert(varchar(32),'int'),
  5556.             "PRECISION" = convert(int,10),
  5557.             LENGTH = convert(int,4),
  5558.             SCALE = convert(smallint,0),
  5559.             RADIX = convert(smallint,10),
  5560.             NULLABLE = convert(smallint,0),
  5561.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5562.             COLUMN_DEF = convert(varchar(255),NULL),
  5563.             SQL_DATA_TYPE = convert(smallint, 4),
  5564.             SQL_DATETIME_SUB = convert(smallint,null),
  5565.             CHAR_OCTET_LENGTH = convert(int,null),
  5566.             ORDINAL_POSITION = convert(int,0),
  5567.             IS_NULLABLE = convert(varchar(254),'NO'),
  5568.             SS_DATA_TYPE = convert(tinyint,56)
  5569.         FROM
  5570.             syscomments c, sysobjects o
  5571.         WHERE
  5572.             o.name like @procedure_name
  5573.             AND user_name(o.uid) like @procedure_owner
  5574.             AND c.id = o.id
  5575.             AND c.colid = 1
  5576.             AND o.type = 'P'                        /* Just Procedures */
  5577.             AND '@RETURN_VALUE' like @column_name
  5578.             AND c.number between @group_num_lower and @group_num_upper
  5579.         ORDER BY 1, 2, 3, 18
  5580.     end
  5581. go
  5582.  
  5583. if (charindex('6.00', @@version) = 0 and
  5584.     charindex('6.50', @@version) = 0 and
  5585.     charindex('7.00', @@version) = 0 and
  5586.     charindex('8.00', @@version) = 0)
  5587. begin
  5588.     print ''
  5589.     print ''
  5590.     print 'Warning:'
  5591.     print 'you are installing the stored procedures '
  5592.     print 'on a pre 6.0 SQL Server.'
  5593.     print 'Ignore the following error.'
  5594. end
  5595. else
  5596.     drop proc sp_sproc_columns
  5597. go
  5598.  
  5599. /*    Procedure for 6.0 and 6.50 servers */
  5600. CREATE PROCEDURE sp_sproc_columns (
  5601.                  @procedure_name        varchar(102) = '%', /* 3*36+5+1 */
  5602.                  @procedure_owner        varchar(96) = null,
  5603.                  @procedure_qualifier    varchar(32) = null,
  5604.                  @column_name            varchar(96) = null,
  5605.                  @ODBCVer                int = 2)
  5606. AS
  5607.     DECLARE @group_num_lower smallint
  5608.     DECLARE @group_num_upper smallint
  5609.     DECLARE @semi_position int
  5610.     DECLARE @full_procedure_name    varchar(205)
  5611.     DECLARE @procedure_id int
  5612.  
  5613.     if @column_name is null /*    If column name not supplied, match all */
  5614.         select @column_name = '%'
  5615.     if @procedure_qualifier is not null
  5616.     begin
  5617.         if db_name() <> @procedure_qualifier
  5618.         begin
  5619.             if @procedure_qualifier = ''
  5620.             begin
  5621.                 /* in this case, we need to return an empty result set */
  5622.                 /* because the user has requested a database with an empty name */
  5623.                 select @procedure_name = ''
  5624.                 select @procedure_owner = ''
  5625.             end
  5626.             else
  5627.             begin    /* If qualifier doesn't match current database */
  5628.                 raiserror (15250, -1,-1)
  5629.                 return
  5630.             end
  5631.         end
  5632.     end
  5633.  
  5634.     if @procedure_name is null
  5635.     begin    /*    If procedure name not supplied, match all */
  5636.         select @procedure_name = '%'
  5637.     end
  5638.  
  5639.     /* first we need to extract the procedure group number, if one exists */
  5640.     select @semi_position = charindex(';',@procedure_name)
  5641.     if (@semi_position > 0)
  5642.     begin    /* If group number separator (;) found */
  5643.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  5644.         select @group_num_upper = @group_num_lower
  5645.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  5646.     end
  5647.     else
  5648.     begin    /* No group separator, so default to group number of 1 */
  5649.         select @group_num_lower = 1
  5650.         select @group_num_upper = 32767            
  5651.     end
  5652.  
  5653.     if @procedure_owner is null
  5654.     begin    /* If unqualified procedure name */
  5655.         SELECT @full_procedure_name = @procedure_name
  5656.     end
  5657.     else
  5658.     begin    /* Qualified procedure name */
  5659.         SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
  5660.     end
  5661.  
  5662.     /*    Get Object ID */
  5663.     SELECT @procedure_id = object_id(@full_procedure_name)
  5664.     if ((charindex('%',@full_procedure_name) = 0) and
  5665.         (charindex('[',@full_procedure_name) = 0) and
  5666.         (charindex('_',@full_procedure_name) = 0) and
  5667.         @procedure_id <> 0)
  5668.     begin
  5669.         /* this block is for the case where there is no pattern
  5670.             matching required for the procedure name */
  5671.         SELECT
  5672.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5673.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5674.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  5675.             COLUMN_NAME = convert(varchar(32),c.name),
  5676.             COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
  5677.             d.DATA_TYPE,
  5678.             TYPE_NAME = t.name,
  5679.             convert(int,case
  5680.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  5681.                 else isnull(convert(int,c.prec), 2147483647)
  5682.             end) "PRECISION",
  5683.             convert(int,case
  5684.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  5685.                     c.prec+2
  5686.                 else
  5687.                     isnull(d.length, c.length)
  5688.             end) LENGTH,
  5689.             SCALE = convert(smallint, c.scale),
  5690.             d.RADIX,
  5691.             d.NULLABLE,
  5692.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5693.             COLUMN_DEF = convert(varchar(255),NULL),
  5694.             d.SQL_DATA_TYPE,
  5695.             d.SQL_DATETIME_SUB,
  5696.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  5697.             ORDINAL_POSITION = convert(int, c.colid),
  5698.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  5699.             SS_DATA_TYPE = c.type
  5700.         FROM
  5701.             syscolumns c,
  5702.             sysobjects o,
  5703.             master.dbo.spt_datatype_info d,
  5704.             systypes t
  5705.         WHERE
  5706.             o.id = @procedure_id
  5707.             AND c.id = o.id
  5708.             AND c.type = d.ss_dtype
  5709.             AND c.length = isnull(d.fixlen, c.length)
  5710.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5711.             AND isnull(d.AUTO_INCREMENT,0) = 0
  5712.             AND c.usertype = t.usertype
  5713.             AND c.name like @column_name
  5714.             AND c.number between @group_num_lower and @group_num_upper
  5715.         UNION ALL
  5716.         SELECT           /* return value row*/
  5717.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5718.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5719.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  5720.             COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
  5721.             COLUMN_TYPE = convert(smallint, 5),
  5722.             DATA_TYPE = convert(smallint, 4),
  5723.             TYPE_NAME = convert(varchar(32),'int'),
  5724.             "PRECISION" = convert(int,10),
  5725.             LENGTH = convert(int,4),
  5726.             SCALE = convert(smallint,0),
  5727.             RADIX = convert(smallint,10),
  5728.             NULLABLE = convert(smallint,0),
  5729.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5730.             COLUMN_DEF = convert(varchar(255),NULL),
  5731.             SQL_DATA_TYPE = convert(smallint, 4),
  5732.             SQL_DATETIME_SUB = convert(smallint,null),
  5733.             CHAR_OCTET_LENGTH = convert(int,null),
  5734.             ORDINAL_POSITION = convert(int,0),
  5735.             IS_NULLABLE = convert(varchar(254),'NO'),
  5736.             SS_DATA_TYPE = convert(tinyint,56)
  5737.         FROM
  5738.             syscomments c, sysobjects o
  5739.         WHERE
  5740.             o.id = @procedure_id
  5741.             AND c.id = o.id
  5742.             AND c.colid = 1
  5743.             AND o.type = 'P'                        /* Just Procedures */
  5744.             AND '@RETURN_VALUE' like @column_name
  5745.             AND c.number between @group_num_lower and @group_num_upper
  5746.         ORDER BY 1, 2, 3, 18
  5747.     end
  5748.     else
  5749.     begin
  5750.         /* this block is for the case where there IS pattern
  5751.             matching done on the procedure name */
  5752.         if @procedure_owner is null
  5753.             select @procedure_owner = '%'
  5754.         SELECT
  5755.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5756.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5757.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  5758.             COLUMN_NAME = convert(varchar(32),c.name),
  5759.             COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
  5760.             d.DATA_TYPE,
  5761.             TYPE_NAME = t.name,
  5762.             convert(int,case
  5763.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  5764.                 else isnull(convert(int,c.prec), 2147483647)
  5765.             end) "PRECISION",
  5766.             convert(int,case
  5767.                 when d.ss_dtype IN (106, 108, 55, 63) then    /* decimal/numeric types */
  5768.                     c.prec+2
  5769.                 else
  5770.                     isnull(d.length, c.length)
  5771.             end) LENGTH,
  5772.             SCALE = convert(smallint, c.scale),
  5773.             d.RADIX,
  5774.             d.NULLABLE,
  5775.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5776.             COLUMN_DEF = convert(varchar(255),NULL),
  5777.             d.SQL_DATA_TYPE,
  5778.             d.SQL_DATETIME_SUB,
  5779.             CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
  5780.             ORDINAL_POSITION = convert(int, c.colid),
  5781.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  5782.             SS_DATA_TYPE = c.type
  5783.         FROM
  5784.             syscolumns c,
  5785.             sysobjects o,
  5786.             master.dbo.spt_datatype_info d,
  5787.             systypes t
  5788.         WHERE
  5789.             o.name like @procedure_name
  5790.             AND user_name(o.uid) like @procedure_owner
  5791.             AND o.id = c.id
  5792.             AND c.type = d.ss_dtype
  5793.             AND c.length = isnull(d.fixlen, c.length)
  5794.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5795.             AND isnull(d.AUTO_INCREMENT,0) = 0
  5796.             AND c.usertype = t.usertype
  5797.             AND o.type = 'P'                            /* Just Procedures */
  5798.             AND c.name like @column_name
  5799.             AND c.number between @group_num_lower and @group_num_upper
  5800.         UNION ALL
  5801.         SELECT           /* return value row*/
  5802.             PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
  5803.             PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
  5804.             PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  5805.             COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
  5806.             COLUMN_TYPE = convert(smallint, 5),
  5807.             DATA_TYPE = convert(smallint, 4),
  5808.             TYPE_NAME = convert(varchar(32),'int'),
  5809.             "PRECISION" = convert(int,10),
  5810.             LENGTH = convert(int,4),
  5811.             SCALE = convert(smallint,0),
  5812.             RADIX = convert(smallint,10),
  5813.             NULLABLE = convert(smallint,0),
  5814.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5815.             COLUMN_DEF = convert(varchar(255),NULL),
  5816.             SQL_DATA_TYPE = convert(smallint, 4),
  5817.             SQL_DATETIME_SUB = convert(smallint,null),
  5818.             CHAR_OCTET_LENGTH = convert(int,null),
  5819.             ORDINAL_POSITION = convert(int,0),
  5820.             IS_NULLABLE = convert(varchar(254),'NO'),
  5821.             SS_DATA_TYPE = convert(tinyint,56)
  5822.         FROM
  5823.             syscomments c, sysobjects o
  5824.         WHERE
  5825.             o.name like @procedure_name
  5826.             AND user_name(o.uid) like @procedure_owner
  5827.             AND c.id = o.id
  5828.             AND c.colid = 1
  5829.             AND o.type = 'P'                        /* Just Procedures */
  5830.             AND '@RETURN_VALUE' like @column_name
  5831.             AND c.number between @group_num_lower and @group_num_upper
  5832.         ORDER BY 1, 2, 3, 18
  5833.     end
  5834. go
  5835.  
  5836. if (charindex('7.00', @@version) = 0 and
  5837.     charindex('8.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 7.0 SQL Server.'
  5844.     print 'Ignore the following errors.'
  5845. end
  5846. else
  5847.     drop proc sp_sproc_columns
  5848. go
  5849.  
  5850. /*    Procedure for 7.0 server */
  5851. CREATE PROCEDURE sp_sproc_columns (
  5852.                  @procedure_name        nvarchar(390) = '%',
  5853.                  @procedure_owner        nvarchar(384) = null,
  5854.                  @procedure_qualifier    sysname = null,
  5855.                  @column_name            nvarchar(384) = null,
  5856.                  @ODBCVer                int = 2)
  5857. AS
  5858.     DECLARE @group_num_lower smallint
  5859.     DECLARE @group_num_upper smallint
  5860.     DECLARE @semi_position int
  5861.     DECLARE @full_procedure_name    nvarchar(774)
  5862.     DECLARE @procedure_id int
  5863.  
  5864.     if @column_name is null /*    If column name not supplied, match all */
  5865.         select @column_name = '%'
  5866.     if @procedure_qualifier is not null
  5867.     begin
  5868.         if db_name() <> @procedure_qualifier
  5869.         begin
  5870.             if @procedure_qualifier = ''
  5871.             begin
  5872.                 /* in this case, we need to return an empty result set */
  5873.                 /* because the user has requested a database with an empty name */
  5874.                 select @procedure_name = ''
  5875.                 select @procedure_owner = ''
  5876.             end
  5877.             else
  5878.             begin    /* If qualifier doesn't match current database */
  5879.                 raiserror (15250, -1,-1)
  5880.                 return
  5881.             end
  5882.         end
  5883.     end
  5884.  
  5885.     if @procedure_name is null
  5886.     begin    /*    If procedure name not supplied, match all */
  5887.         select @procedure_name = '%'
  5888.     end
  5889.  
  5890.     /* first we need to extract the procedure group number, if one exists */
  5891.     select @semi_position = charindex(';',@procedure_name)
  5892.     if (@semi_position > 0)
  5893.     begin    /* If group number separator (;) found */
  5894.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  5895.         select @group_num_upper = @group_num_lower
  5896.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  5897.     end
  5898.     else
  5899.     begin    /* No group separator, so default to all groups */
  5900.         select @group_num_lower = 1
  5901.         select @group_num_upper = 32767            
  5902.     end
  5903.  
  5904.     if @procedure_owner is null
  5905.     begin    /* If unqualified procedure name */
  5906.         SELECT @full_procedure_name = quotename(@procedure_name)
  5907.     end
  5908.     else
  5909.     begin    /* Qualified procedure name */
  5910.         if @procedure_owner = ''
  5911.         begin    /* If empty owner name */
  5912.             SELECT @full_procedure_name = quotename(@procedure_owner)
  5913.         end
  5914.         else
  5915.         begin
  5916.             SELECT @full_procedure_name = quotename(@procedure_owner) +
  5917.                 '.' + quotename(@procedure_name)
  5918.         end
  5919.     end
  5920.  
  5921.     /*    Get Object ID */
  5922.     SELECT @procedure_id = object_id(@full_procedure_name)
  5923.     if ((isnull(charindex('%', @full_procedure_name),0) = 0) and
  5924.         (isnull(charindex('[', @procedure_name),0) = 0) and
  5925.         (isnull(charindex('[', @procedure_owner),0) = 0) and
  5926.         (isnull(charindex('_', @full_procedure_name),0) = 0) and
  5927.         not (@procedure_id is null))
  5928.     begin
  5929.         /* this block is for the case where there is no pattern
  5930.             matching required for the procedure name */
  5931.         SELECT
  5932.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  5933.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  5934.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  5935.             COLUMN_NAME = convert(sysname,c.name),
  5936.             COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
  5937.             d.DATA_TYPE,
  5938.             TYPE_NAME = t.name,
  5939.             convert(int,case
  5940.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  5941.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  5942.             end) "PRECISION",
  5943.             convert(int,case
  5944.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  5945.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  5946.                 else
  5947.                     isnull(d.length, c.length)
  5948.             end) LENGTH,
  5949.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  5950.             d.RADIX,
  5951.             d.NULLABLE,
  5952.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5953.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  5954.             d.SQL_DATA_TYPE,
  5955.             d.SQL_DATETIME_SUB,
  5956.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  5957.             ORDINAL_POSITION = convert(int, c.colid),
  5958.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  5959.             SS_DATA_TYPE = c.type
  5960.         FROM
  5961.             syscolumns c,
  5962.             sysobjects o,
  5963.             master.dbo.spt_datatype_info d,
  5964.             systypes t
  5965.         WHERE
  5966.             o.id = @procedure_id
  5967.             AND c.id = o.id
  5968.             AND c.xtype = d.ss_dtype
  5969.             AND c.length = isnull(d.fixlen, c.length)
  5970.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  5971.             AND isnull(d.AUTO_INCREMENT,0) = 0
  5972.             AND c.xusertype = t.xusertype
  5973.             AND c.name like @column_name
  5974.             AND c.number between @group_num_lower and @group_num_upper
  5975.         UNION ALL
  5976.         SELECT           /* return value row*/
  5977.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  5978.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  5979.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  5980.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  5981.             COLUMN_TYPE = convert(smallint, 5),
  5982.             DATA_TYPE = convert(smallint, 4),
  5983.             TYPE_NAME = convert(sysname,'int'),
  5984.             "PRECISION" = convert(int,10),
  5985.             LENGTH = convert(int,4),
  5986.             SCALE = convert(smallint,0),
  5987.             RADIX = convert(smallint,10),
  5988.             NULLABLE = convert(smallint,0),
  5989.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  5990.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  5991.             SQL_DATA_TYPE = convert(smallint, 4),
  5992.             SQL_DATETIME_SUB = convert(smallint,null),
  5993.             CHAR_OCTET_LENGTH = convert(int,null),
  5994.             ORDINAL_POSITION = convert(int,0),
  5995.             IS_NULLABLE = convert(varchar(254),'NO'),
  5996.             SS_DATA_TYPE = convert(tinyint,56)
  5997.         FROM
  5998.             syscomments c, sysobjects o
  5999.         WHERE
  6000.             o.id = @procedure_id
  6001.             AND c.id = o.id
  6002.             AND c.colid = 1
  6003.             AND o.type = 'P'                        /* Just Procedures */
  6004.             AND '@RETURN_VALUE' like @column_name
  6005.             AND c.number between @group_num_lower and @group_num_upper        
  6006.         ORDER BY 1, 2, 3, 18
  6007.     end
  6008.     else
  6009.     begin
  6010.         /* this block is for the case where there IS pattern
  6011.             matching done on the procedure name */
  6012.         if @procedure_owner is null
  6013.             select @procedure_owner = '%'
  6014.         SELECT
  6015.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6016.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6017.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6018.             COLUMN_NAME = convert(sysname,c.name),
  6019.             COLUMN_TYPE = convert(smallint,    1+c.isoutparam),
  6020.             d.DATA_TYPE,
  6021.             TYPE_NAME = t.name,
  6022.             convert(int,case
  6023.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  6024.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  6025.             end) "PRECISION",
  6026.             convert(int,case
  6027.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  6028.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  6029.                 else
  6030.                     isnull(d.length, c.length)
  6031.             end) LENGTH,
  6032.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  6033.             d.RADIX,
  6034.             d.NULLABLE,
  6035.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6036.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6037.             d.SQL_DATA_TYPE,
  6038.             d.SQL_DATETIME_SUB,
  6039.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  6040.             ORDINAL_POSITION = convert(int, c.colid),
  6041.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  6042.             SS_DATA_TYPE = c.type
  6043.         FROM
  6044.             syscolumns c,
  6045.             sysobjects o,
  6046.             master.dbo.spt_datatype_info d,
  6047.             systypes t
  6048.         WHERE
  6049.             o.name like @procedure_name
  6050.             AND user_name(o.uid) like @procedure_owner
  6051.             AND o.id = c.id
  6052.             AND c.xtype = d.ss_dtype
  6053.             AND c.length = isnull(d.fixlen, c.length)
  6054.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  6055.             AND isnull(d.AUTO_INCREMENT,0) = 0
  6056.             AND c.xusertype = t.xusertype
  6057.             AND o.type = 'P'                            /* Just Procedures */
  6058.             AND c.name like @column_name
  6059.             AND c.number between @group_num_lower and @group_num_upper
  6060.         UNION ALL
  6061.         SELECT           /* return value row*/
  6062.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6063.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6064.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  6065.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  6066.             COLUMN_TYPE = convert(smallint, 5),
  6067.             DATA_TYPE = convert(smallint, 4),
  6068.             TYPE_NAME = convert(sysname,'int'),
  6069.             "PRECISION" = convert(int,10),
  6070.             LENGTH = convert(int,4),
  6071.             SCALE = convert(smallint,0),
  6072.             RADIX = convert(smallint,10),
  6073.             NULLABLE = convert(smallint,0),
  6074.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6075.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6076.             SQL_DATA_TYPE = convert(smallint, 4),
  6077.             SQL_DATETIME_SUB = convert(smallint,null),
  6078.             CHAR_OCTET_LENGTH = convert(int,null),
  6079.             ORDINAL_POSITION = convert(int,0),
  6080.             IS_NULLABLE = convert(varchar(254),'NO'),
  6081.             SS_DATA_TYPE = convert(tinyint,56)
  6082.         FROM
  6083.             syscomments c, sysobjects o
  6084.         WHERE
  6085.             o.name like @procedure_name
  6086.             AND c.id = o.id
  6087.             AND user_name(o.uid) like @procedure_owner
  6088.             AND c.colid = 1
  6089.             AND o.type = 'P'                        /* Just Procedures */
  6090.             AND '@RETURN_VALUE' like @column_name
  6091.             AND c.number between @group_num_lower and @group_num_upper
  6092.         ORDER BY 1, 2, 3, 18
  6093.     end
  6094. go
  6095.  
  6096. if (charindex('8.00', @@version) = 0)
  6097. begin
  6098.     print ''
  6099.     print ''
  6100.     print 'Warning:'
  6101.     print 'you are installing the stored procedures '
  6102.     print 'on a pre 8.0 SQL Server.'
  6103.     print 'Ignore the following errors.'
  6104. end
  6105. else
  6106.     drop proc sp_sproc_columns
  6107. go
  6108.  
  6109. /*    Procedure for 8.0 server */
  6110. CREATE PROCEDURE sp_sproc_columns (
  6111.                  @procedure_name        nvarchar(390) = '%',
  6112.                  @procedure_owner        nvarchar(384) = null,
  6113.                  @procedure_qualifier        sysname = null,
  6114.                  @column_name            nvarchar(384) = null,
  6115.                  @ODBCVer                int = 2)
  6116. AS
  6117.     DECLARE @group_num_lower smallint
  6118.     DECLARE @group_num_upper smallint
  6119.     DECLARE @semi_position int
  6120.     DECLARE @full_procedure_name nvarchar(774)
  6121.     DECLARE @procedure_id int
  6122.  
  6123.     if @column_name is null /*    If column name not supplied, match all */
  6124.         select @column_name = '%'
  6125.     if @procedure_qualifier is not null
  6126.     begin
  6127.         if db_name() <> @procedure_qualifier
  6128.         begin
  6129.             if @procedure_qualifier = ''
  6130.             begin
  6131.                 /* in this case, we need to return an empty result set */
  6132.                 /* because the user has requested a database with an empty name */
  6133.                 select @procedure_name = ''
  6134.                 select @procedure_owner = ''
  6135.             end
  6136.             else
  6137.             begin    /* If qualifier doesn't match current database */
  6138.                 raiserror (15250, -1,-1)
  6139.                 return
  6140.             end
  6141.         end
  6142.     end
  6143.  
  6144.     if @procedure_name is null
  6145.     begin    /*    If procedure name not supplied, match all */
  6146.         select @procedure_name = '%'
  6147.     end
  6148.  
  6149.     /* first we need to extract the procedure group number, if one exists */
  6150.     select @semi_position = charindex(';',@procedure_name)
  6151.     if (@semi_position > 0)
  6152.     begin    /* If group number separator (;) found */
  6153.         select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
  6154.         select @group_num_upper = @group_num_lower
  6155.         select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
  6156.     end
  6157.     else
  6158.     begin    /* No group separator, so default to all groups */
  6159.         select @group_num_lower = 1
  6160.         select @group_num_upper = 32767            
  6161.     end
  6162.  
  6163.     if @procedure_owner is null
  6164.     begin    /* If unqualified procedure name */
  6165.         SELECT @full_procedure_name = quotename(@procedure_name)
  6166.     end
  6167.     else
  6168.     begin    /* Qualified procedure name */
  6169.         if @procedure_owner = ''
  6170.         begin    /* If empty owner name */
  6171.             SELECT @full_procedure_name = quotename(@procedure_owner)
  6172.         end
  6173.         else
  6174.         begin
  6175.             SELECT @full_procedure_name = quotename(@procedure_owner) +
  6176.                 '.' + quotename(@procedure_name)
  6177.         end
  6178.     end
  6179.  
  6180.     /*    Get Object ID */
  6181.     SELECT @procedure_id = object_id(@full_procedure_name)
  6182.     if ((isnull(charindex('%', @full_procedure_name),0) = 0) and
  6183.         (isnull(charindex('[', @procedure_name),0) = 0) and
  6184.         (isnull(charindex('[', @procedure_owner),0) = 0) and
  6185.         (isnull(charindex('_', @full_procedure_name),0) = 0) and
  6186.         not (@procedure_id is null))
  6187.     begin
  6188.         /* this block is for the case where there is no pattern
  6189.             matching required for the procedure name */
  6190.         SELECT
  6191.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6192.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6193.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6194.             COLUMN_NAME = convert(sysname,c.name),
  6195.             COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
  6196.             d.DATA_TYPE,
  6197.             TYPE_NAME = t.name,
  6198.             convert(int,case
  6199.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  6200.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  6201.             end) "PRECISION",
  6202.             convert(int,case
  6203.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  6204.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  6205.                 else
  6206.                     isnull(d.length, c.length)
  6207.             end) LENGTH,
  6208.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  6209.             d.RADIX,
  6210.             d.NULLABLE,
  6211.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6212.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6213.             d.SQL_DATA_TYPE,
  6214.             d.SQL_DATETIME_SUB,
  6215.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  6216.             ORDINAL_POSITION = convert(int, c.colid),
  6217.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  6218.             SS_DATA_TYPE = c.type
  6219.         FROM
  6220.             syscolumns c,
  6221.             sysobjects o,
  6222.             master.dbo.spt_datatype_info d,
  6223.             systypes t
  6224.         WHERE
  6225.             o.id = @procedure_id
  6226.             AND c.id = o.id
  6227.             AND c.xtype = d.ss_dtype
  6228.             AND c.length = isnull(d.fixlen, c.length)
  6229.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  6230.             AND isnull(d.AUTO_INCREMENT,0) = 0
  6231.             AND c.xusertype = t.xusertype
  6232.             AND c.name like @column_name
  6233.             AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
  6234.             AND ((c.number between @group_num_lower and @group_num_upper)
  6235.                  OR (c.number = 0 and o.type = 'FN'))
  6236.         UNION ALL
  6237.         SELECT           /* return value row*/
  6238.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6239.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6240.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6241.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  6242.             COLUMN_TYPE = convert(smallint, 5),
  6243.             DATA_TYPE = convert(smallint, 4),
  6244.             TYPE_NAME = convert(sysname,'int'),
  6245.             "PRECISION" = convert(int,10),
  6246.             LENGTH = convert(int,4),
  6247.             SCALE = convert(smallint,0),
  6248.             RADIX = convert(smallint,10),
  6249.             NULLABLE = convert(smallint,0),
  6250.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6251.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6252.             SQL_DATA_TYPE = convert(smallint, 4),
  6253.             SQL_DATETIME_SUB = convert(smallint,null),
  6254.             CHAR_OCTET_LENGTH = convert(int,null),
  6255.             ORDINAL_POSITION = convert(int,0),
  6256.             IS_NULLABLE = convert(varchar(254),'NO'),
  6257.             SS_DATA_TYPE = convert(tinyint,56)
  6258.         FROM
  6259.             syscomments c, sysobjects o
  6260.         WHERE
  6261.             o.id = @procedure_id
  6262.             AND c.id = o.id
  6263.             AND c.colid = 1
  6264.             AND o.type = 'P'            /* Procedures */
  6265.             AND '@RETURN_VALUE' like @column_name
  6266.             AND c.number between @group_num_lower and @group_num_upper
  6267.         UNION ALL
  6268.         SELECT        /* UDF return value */
  6269.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6270.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6271.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6272.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  6273.             COLUMN_TYPE = convert(smallint, 5),    /* SQL_RETURN_VALUE */
  6274.             d.DATA_TYPE,
  6275.             TYPE_NAME = t.name,
  6276.             convert(int,case
  6277.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  6278.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  6279.             end) "PRECISION",
  6280.             convert(int,case
  6281.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  6282.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  6283.                 else
  6284.                     isnull(d.length, c.length)
  6285.             end) LENGTH,
  6286.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  6287.             d.RADIX,
  6288.             NULLABLE = convert(smallint, c.isnullable),
  6289.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6290.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6291.             d.SQL_DATA_TYPE,
  6292.             d.SQL_DATETIME_SUB,
  6293.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  6294.             ORDINAL_POSITION = convert(int,0),
  6295.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  6296.             SS_DATA_TYPE = c.type
  6297.         FROM
  6298.             syscolumns c,
  6299.             sysobjects o,
  6300.             master.dbo.spt_datatype_info d,
  6301.             systypes t
  6302.         WHERE
  6303.             o.name like @procedure_name
  6304.             AND o.id = c.id
  6305.             AND c.xtype = d.ss_dtype
  6306.             AND c.length = isnull(d.fixlen, c.length)
  6307.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  6308.             AND isnull(d.AUTO_INCREMENT,0) = 0
  6309.             AND c.xusertype = t.xusertype
  6310.             AND o.type = 'FN'            /* Scalar UDF */
  6311.             AND c.name like @column_name
  6312.             AND c.colid = 0
  6313.             AND c.number = 0
  6314.         UNION ALL
  6315.         SELECT        /* Table valued functions */
  6316.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6317.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6318.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),
  6319.             COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
  6320.             COLUMN_TYPE = convert(smallint, 3),
  6321.             DATA_TYPE = convert(smallint, NULL),
  6322.             TYPE_NAME = convert(sysname, 'table'),
  6323.             "PRECISION" = convert(int,0),
  6324.             LENGTH = convert(int,0),
  6325.             SCALE = convert(smallint,0),
  6326.             RADIX = convert(smallint,0),
  6327.             NULLABLE = convert(smallint,0),
  6328.             REMARKS = convert(varchar(254), 'Result table returned by table valued function'),
  6329.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6330.             SQL_DATA_TYPE = convert(smallint, NULL),
  6331.             SQL_DATETIME_SUB = convert(smallint,null),
  6332.             CHAR_OCTET_LENGTH = convert(int,null),
  6333.             ORDINAL_POSITION = convert(int,0),
  6334.             IS_NULLABLE = convert(varchar(254),'NO'),
  6335.             SS_DATA_TYPE = convert(tinyint,0)
  6336.         FROM
  6337.             syscomments c, sysobjects o
  6338.         WHERE
  6339.             o.id = @procedure_id
  6340.             AND c.id = o.id
  6341.             AND c.colid = 1
  6342.             AND o.type IN ('TF', 'IF')
  6343.             AND '@TABLE_RETURN_VALUE' like @column_name
  6344.             AND c.number = 0
  6345.         ORDER BY 1, 2, 3, 18
  6346.     end
  6347.     else
  6348.     begin
  6349.         /* this block is for the case where there IS pattern
  6350.             matching done on the procedure name */
  6351.         if @procedure_owner is null
  6352.             select @procedure_owner = '%'
  6353.  
  6354.         SELECT
  6355.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6356.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6357.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6358.             COLUMN_NAME = convert(sysname,c.name),
  6359.             COLUMN_TYPE = convert(smallint,    1+c.isoutparam),
  6360.             d.DATA_TYPE,
  6361.             TYPE_NAME = t.name,
  6362.             convert(int,case
  6363.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  6364.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  6365.             end) "PRECISION",
  6366.             convert(int,case
  6367.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  6368.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  6369.                 else
  6370.                     isnull(d.length, c.length)
  6371.             end) LENGTH,
  6372.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  6373.             d.RADIX,
  6374.             d.NULLABLE,
  6375.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6376.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6377.             d.SQL_DATA_TYPE,
  6378.             d.SQL_DATETIME_SUB,
  6379.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  6380.             ORDINAL_POSITION = convert(int, c.colid),
  6381.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  6382.             SS_DATA_TYPE = c.type
  6383.         FROM
  6384.             syscolumns c,
  6385.             sysobjects o,
  6386.             master.dbo.spt_datatype_info d,
  6387.             systypes t
  6388.         WHERE
  6389.             o.name like @procedure_name
  6390.             AND user_name(o.uid) like @procedure_owner
  6391.             AND o.id = c.id
  6392.             AND c.xtype = d.ss_dtype
  6393.             AND c.length = isnull(d.fixlen, c.length)
  6394.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  6395.             AND isnull(d.AUTO_INCREMENT,0) = 0
  6396.             AND c.xusertype = t.xusertype
  6397.             AND c.name like @column_name
  6398.             AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
  6399.             AND ((c.number between @group_num_lower and @group_num_upper)
  6400.                  OR (c.number = 0 and o.type = 'FN'))
  6401.         UNION ALL
  6402.         SELECT           /* return value row*/
  6403.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6404.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6405.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
  6406.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  6407.             COLUMN_TYPE = convert(smallint, 5),    /* SQL_RETURN_VALUE */
  6408.             DATA_TYPE = convert(smallint, 4),
  6409.             TYPE_NAME = convert(sysname,'int'),
  6410.             "PRECISION" = convert(int,10),
  6411.             LENGTH = convert(int,4),
  6412.             SCALE = convert(smallint,0),
  6413.             RADIX = convert(smallint,10),
  6414.             NULLABLE = convert(smallint,0),
  6415.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6416.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6417.             SQL_DATA_TYPE = convert(smallint, 4),
  6418.             SQL_DATETIME_SUB = convert(smallint,null),
  6419.             CHAR_OCTET_LENGTH = convert(int,null),
  6420.             ORDINAL_POSITION = convert(int,0),
  6421.             IS_NULLABLE = convert(varchar(254),'NO'),
  6422.             SS_DATA_TYPE = convert(tinyint,56)
  6423.         FROM
  6424.             syscomments c, sysobjects o
  6425.         WHERE
  6426.             o.name like @procedure_name
  6427.             AND c.id = o.id
  6428.             AND user_name(o.uid) like @procedure_owner
  6429.             AND c.colid = 1
  6430.             AND o.type = 'P'                    /* Procedures */
  6431.             AND '@RETURN_VALUE' like @column_name
  6432.             AND c.number between @group_num_lower and @group_num_upper
  6433.         UNION ALL
  6434.         SELECT        /* UDF return value */
  6435.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6436.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6437.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  6438.             COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
  6439.             COLUMN_TYPE = convert(smallint, 5),    /* SQL_RETURN_VALUE */
  6440.             d.DATA_TYPE,
  6441.             TYPE_NAME = t.name,
  6442.             convert(int,case
  6443.                 when d.DATA_TYPE in (6,7) then d.data_precision         /* FLOAT/REAL */
  6444.                 else OdbcPrec(c.xtype,c.length,c.xprec)
  6445.             end) "PRECISION",
  6446.             convert(int,case
  6447.                 when type_name(d.ss_dtype) IN ('numeric','decimal') then    /* decimal/numeric types */
  6448.                     OdbcPrec(c.xtype,c.length,c.xprec)+2
  6449.                 else
  6450.                     isnull(d.length, c.length)
  6451.             end) LENGTH,
  6452.             SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
  6453.             d.RADIX,
  6454.             NULLABLE = convert(smallint, c.isnullable),
  6455.             REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  6456.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6457.             d.SQL_DATA_TYPE,
  6458.             d.SQL_DATETIME_SUB,
  6459.             CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
  6460.             ORDINAL_POSITION = convert(int,0),
  6461.             IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
  6462.             SS_DATA_TYPE = c.type
  6463.         FROM
  6464.             syscolumns c,
  6465.             sysobjects o,
  6466.             master.dbo.spt_datatype_info d,
  6467.             systypes t
  6468.         WHERE
  6469.             o.name like @procedure_name
  6470.             AND user_name(o.uid) like @procedure_owner
  6471.             AND o.id = c.id
  6472.             AND c.xtype = d.ss_dtype
  6473.             AND c.length = isnull(d.fixlen, c.length)
  6474.             AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
  6475.             AND isnull(d.AUTO_INCREMENT,0) = 0
  6476.             AND c.xusertype = t.xusertype
  6477.             AND o.type = 'FN'            /* Scalar UDF */
  6478.             AND c.name like @column_name
  6479.             AND c.colid = 0
  6480.             AND c.number = 0
  6481.         UNION ALL
  6482.         SELECT        /* Table valued functions */
  6483.             PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
  6484.             PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
  6485.             PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),
  6486.             COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
  6487.             COLUMN_TYPE = convert(smallint, 3),
  6488.             DATA_TYPE = convert(smallint, NULL),
  6489.             TYPE_NAME = convert(sysname, 'table'),
  6490.             "PRECISION" = convert(int,0),
  6491.             LENGTH = convert(int,0),
  6492.             SCALE = convert(smallint,0),
  6493.             RADIX = convert(smallint,0),
  6494.             NULLABLE = convert(smallint,0),
  6495.             REMARKS = convert(varchar(254), 'Result table returned by table valued function'),
  6496.             COLUMN_DEF = convert(nvarchar(4000),NULL),
  6497.             SQL_DATA_TYPE = convert(smallint, NULL),
  6498.             SQL_DATETIME_SUB = convert(smallint,null),
  6499.             CHAR_OCTET_LENGTH = convert(int,null),
  6500.             ORDINAL_POSITION = convert(int,0),
  6501.             IS_NULLABLE = convert(varchar(254),'NO'),
  6502.             SS_DATA_TYPE = convert(tinyint,0)
  6503.         FROM
  6504.             syscomments c, sysobjects o
  6505.         WHERE
  6506.             o.name like @procedure_name
  6507.             AND user_name(o.uid) like @procedure_owner
  6508.             AND c.id = o.id
  6509.             AND c.colid = 1
  6510.             AND o.type IN ('TF', 'IF')
  6511.             AND '@TABLE_RETURN_VALUE' like @column_name
  6512.             AND c.number = 0
  6513.         ORDER BY 1, 2, 3, 18
  6514.     end
  6515. go
  6516.  
  6517. grant execute on sp_sproc_columns to public
  6518. go
  6519.  
  6520. dump tran master with no_log
  6521. go
  6522.  
  6523. print 'creating sp_statistics'
  6524. go
  6525.  
  6526. /*    Procedure for pre-7.0 server */
  6527. CREATE PROCEDURE sp_statistics (
  6528.                  @table_name        varchar(32),
  6529.                  @table_owner        varchar(32) = null,
  6530.                  @table_qualifier    varchar(32) = null,
  6531.                  @index_name        varchar(32) = '%',
  6532.                  @is_unique         char(1) = 'N',
  6533.                  @accuracy            char(1) = 'Q')
  6534. AS
  6535.     set nocount on
  6536.     DECLARE @indid                int
  6537.     DECLARE @lastindid            int
  6538.     DECLARE @table_id            int
  6539.     DECLARE @full_table_name    varchar(65) /* 2*32+1 */
  6540.  
  6541.     create table #TmpIndex(
  6542.         TABLE_QUALIFIER varchar(32) NULL,
  6543.         TABLE_OWNER     varchar(32) NULL,
  6544.         TABLE_NAME        varchar(32) NOT NULL,
  6545.         INDEX_QUALIFIER varchar(32) null,
  6546.         INDEX_NAME        varchar(32) null,
  6547.         NON_UNIQUE        smallint null,
  6548.         TYPE            smallint NOT NULL,
  6549.         SEQ_IN_INDEX    smallint null,
  6550.         COLUMN_NAME     varchar(32) null,
  6551.         COLLATION        char(1) null,
  6552.         index_id        int null,
  6553.         CARDINALITY     int null,
  6554.         PAGES            int null,
  6555.         status            smallint NOT NULL)
  6556.  
  6557.     if @table_qualifier is not null
  6558.     begin
  6559.         if db_name() <> @table_qualifier
  6560.         begin    /* If qualifier doesn't match current database */
  6561.             raiserror 20001 '~~Rush_5~~'
  6562.             return
  6563.         end
  6564.     end
  6565.  
  6566.     if @accuracy not in ('Q','E')
  6567.         begin
  6568.             raiserror 20002 '~~Rush_58~~'
  6569.             return
  6570.         end
  6571.  
  6572.     if (@@trancount <> 0 and
  6573.         charindex('6.50', @@version) = 0 and
  6574.         charindex('7.00', @@version) = 0 and
  6575.         charindex('8.00', @@version) = 0)
  6576.     begin    /* If inside a transaction */
  6577.         raiserror 20003 '~~Rush_59~~'
  6578.         return
  6579.     end
  6580.  
  6581.     if @table_owner is null
  6582.     begin    /* If unqualified table name */
  6583.         SELECT @full_table_name = @table_name
  6584.     end
  6585.     else
  6586.     begin    /* Qualified table name */
  6587.         if @table_owner = ''
  6588.         begin    /* If empty owner name */
  6589.             SELECT @full_table_name = @table_owner
  6590.         end
  6591.         else
  6592.         begin
  6593.             SELECT @full_table_name = @table_owner + '.' + @table_name
  6594.         end
  6595.     end
  6596.     /*    Get Object ID */
  6597.     SELECT @table_id = object_id(@full_table_name)
  6598.  
  6599.     /*    Start at lowest index id */
  6600.     SELECT @indid = min(indid)
  6601.     FROM sysindexes
  6602.     WHERE id = @table_id
  6603.         AND indid > 0
  6604.         AND indid < 255
  6605.  
  6606.     WHILE @indid is not NULL
  6607.     BEGIN
  6608.         INSERT #TmpIndex    /* Add all columns that are in index */
  6609.             SELECT
  6610.                 DB_NAME(),                                /* TABLE_QUALIFIER */
  6611.                 USER_NAME(o.uid),                        /* TABLE_OWNER       */
  6612.                 o.name,                                 /* TABLE_NAME       */
  6613.                 o.name,                                 /* INDEX_QUALIFIER */
  6614.                 x.name,                                 /* INDEX_NAME       */
  6615.                 0,                                        /* NON_UNIQUE       */
  6616.                 1,                                        /* SQL_INDEX_CLUSTERED */
  6617.                 colid,                                    /* SEQ_IN_INDEX    */
  6618.                 INDEX_COL(@full_table_name,indid,colid),/* COLUMN_NAME       */
  6619.                 'A',                                    /* COLLATION       */
  6620.                 @indid,                                 /* index_id        */
  6621.                 x.rows,                                 /* CARDINALITY       */
  6622.                 x.dpages,                                /* PAGES           */
  6623.                 x.status                                /* status            */
  6624.             FROM sysindexes x, syscolumns c, sysobjects o
  6625.             WHERE
  6626.                 x.id = @table_id
  6627.                 AND x.id = o.id
  6628.                 AND x.id = c.id
  6629.                 AND c.colid < keycnt+(x.status&16)/16    /* all but Unique Clust indices have an extra key */
  6630.                 AND x.indid = @indid
  6631.         /*
  6632.         **      Now move @indid to the next index.
  6633.         */
  6634.         SELECT @lastindid = @indid
  6635.         SELECT @indid = NULL
  6636.  
  6637.         SELECT @indid = min(indid)
  6638.         FROM sysindexes
  6639.         WHERE id = @table_id
  6640.             AND indid > @lastindid
  6641.             AND indid < 255
  6642.     END
  6643.  
  6644.     UPDATE #TmpIndex
  6645.         SET NON_UNIQUE = 1
  6646.         WHERE status&2 <> 2 /* If non-unique index */
  6647.     UPDATE #TmpIndex
  6648.         SET
  6649.             TYPE = 3,            /* SQL_INDEX_OTHER */
  6650.             CARDINALITY = NULL,
  6651.             PAGES = NULL
  6652.         WHERE index_id > 1    /* If non-clustered index */
  6653.  
  6654.     /* now add row for table statistics */
  6655.     INSERT #TmpIndex
  6656.         SELECT
  6657.             DB_NAME(),                /* TABLE_QUALIFIER */
  6658.             USER_NAME(o.uid),        /* TABLE_OWNER       */
  6659.             o.name,                 /* TABLE_NAME       */
  6660.             null,                    /* INDEX_QUALIFIER */
  6661.             null,                    /* INDEX_NAME       */
  6662.             null,                    /* NON_UNIQUE       */
  6663.             0,                        /* SQL_TABLE_STAT  */
  6664.             null,                    /* SEQ_IN_INDEX    */
  6665.             null,                    /* COLUMN_NAME       */
  6666.             null,                    /* COLLATION       */
  6667.             0,                        /* index_id        */
  6668.             x.rows,                 /* CARDINALITY       */
  6669.             x.dpages,                /* PAGES           */
  6670.             0                        /* status           */
  6671.         FROM sysindexes x, sysobjects o
  6672.         WHERE o.id = @table_id
  6673.             AND x.id = o.id
  6674.             AND (x.indid = 0 or x.indid = 1)    /*    If there are no indexes */
  6675.                                                 /*    then table stats are in */
  6676.                                                 /*    a row with indid =0        */
  6677.  
  6678.     if @is_unique <> 'Y'    /* If all indexes desired */
  6679.         SELECT
  6680.             TABLE_QUALIFIER,
  6681.             TABLE_OWNER,
  6682.             TABLE_NAME,
  6683.             NON_UNIQUE,
  6684.             INDEX_QUALIFIER,
  6685.             INDEX_NAME,
  6686.             TYPE,
  6687.             SEQ_IN_INDEX,
  6688.             COLUMN_NAME,
  6689.             COLLATION,
  6690.             CARDINALITY,
  6691.             PAGES,
  6692.             FILTER_CONDITION = convert(varchar(128),null)
  6693.         FROM #TmpIndex
  6694.         WHERE
  6695.             INDEX_NAME like @index_name /* If matching name */
  6696.             or INDEX_NAME is null        /* If SQL_TABLE_STAT row */
  6697.         ORDER BY 4, 7, 6, 8
  6698.     else                    /* If only unique indexes desired */
  6699.         SELECT
  6700.             TABLE_QUALIFIER,
  6701.             TABLE_OWNER,
  6702.             TABLE_NAME,
  6703.             NON_UNIQUE,
  6704.             INDEX_QUALIFIER,
  6705.             INDEX_NAME,
  6706.             TYPE,
  6707.             SEQ_IN_INDEX,
  6708.             COLUMN_NAME,
  6709.             COLLATION,
  6710.             CARDINALITY,
  6711.             PAGES,
  6712.             FILTER_CONDITION = convert(varchar(128),null)
  6713.         FROM #TmpIndex
  6714.         WHERE
  6715.             (NON_UNIQUE = 0             /* If unique */
  6716.                 or NON_UNIQUE is NULL)    /* If SQL_TABLE_STAT row */
  6717.             and (INDEX_NAME like @index_name    /* If matching name */
  6718.                 or INDEX_NAME is null)    /* If SQL_TABLE_STAT row */
  6719.         ORDER BY 4, 7, 6, 8
  6720.  
  6721.     DROP TABLE #TmpIndex
  6722. go
  6723.  
  6724. if (charindex('7.00', @@version) = 0 and
  6725.     charindex('8.00', @@version) = 0)
  6726. begin
  6727.     print ''
  6728.     print ''
  6729.     print 'Warning:'
  6730.     print 'you are installing the stored procedures '
  6731.     print 'on a pre 7.0 SQL Server.'
  6732.     print 'Ignore the following errors.'
  6733. end
  6734. else
  6735.     drop proc sp_statistics
  6736. go
  6737.  
  6738. /*    Procedure for 7.0 server */
  6739. CREATE PROCEDURE sp_statistics (
  6740.                  @table_name        sysname,
  6741.                  @table_owner        sysname = null,
  6742.                  @table_qualifier    sysname = null,
  6743.                  @index_name        sysname = '%',
  6744.                  @is_unique         char(1) = 'N',
  6745.                  @accuracy            char(1) = 'Q')
  6746. AS
  6747.     set nocount on
  6748.     DECLARE @indid                int
  6749.     DECLARE @lastindid            int
  6750.     DECLARE @table_id            int
  6751.     DECLARE @full_table_name    nvarchar(257)
  6752.  
  6753.     create table #TmpIndex(
  6754.         TABLE_QUALIFIER sysname NULL,
  6755.         TABLE_OWNER     sysname NULL,
  6756.         TABLE_NAME        sysname NOT NULL,
  6757.         INDEX_QUALIFIER sysname null,
  6758.         INDEX_NAME        sysname null,
  6759.         NON_UNIQUE        smallint null,
  6760.         TYPE            smallint NOT NULL,
  6761.         SEQ_IN_INDEX    smallint null,
  6762.         COLUMN_NAME     sysname null,
  6763.         COLLATION        char(1) null,
  6764.         index_id        int null,
  6765.         CARDINALITY     int null,
  6766.         PAGES            int null,
  6767.         status            int NOT NULL)
  6768.  
  6769.     if @table_qualifier is not null
  6770.     begin
  6771.         if db_name() <> @table_qualifier
  6772.         begin    /* If qualifier doesn't match current database */
  6773.             raiserror (15250, -1,-1)
  6774.             return
  6775.         end
  6776.     end
  6777.  
  6778.     if @accuracy not in ('Q','E')
  6779.         begin
  6780.             raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')
  6781.             return
  6782.         end
  6783.  
  6784.     if @table_owner is null
  6785.     begin    /* If unqualified table name */
  6786.         SELECT @full_table_name = quotename(@table_name)
  6787.     end
  6788.     else
  6789.     begin    /* Qualified table name */
  6790.         if @table_owner = ''
  6791.         begin    /* If empty owner name */
  6792.             SELECT @full_table_name = quotename(@table_owner)
  6793.         end
  6794.         else
  6795.         begin
  6796.             SELECT @full_table_name = quotename(@table_owner) +
  6797.                 '.' + quotename(@table_name)
  6798.         end
  6799.     end
  6800.     /*    Get Object ID */
  6801.     SELECT @table_id = object_id(@full_table_name)
  6802.  
  6803.     /*    Start at lowest index id */
  6804.     SELECT @indid = min(indid)
  6805.     FROM sysindexes
  6806.     WHERE not (@table_id is null)
  6807.         AND id = @table_id
  6808.         AND indid > 0
  6809.         AND indid < 255
  6810.  
  6811.     /* Create a temp table to correct the ordinal position of the columns */
  6812.     create table #TmpColumns
  6813.     (ordinal int identity(1,1),
  6814.      colid   smallint not null)
  6815.  
  6816.     /* Load columns into the temp table */
  6817.     insert into #TmpColumns (colid)
  6818.     select c.colid
  6819.     from syscolumns c
  6820.     where c.id = @table_id
  6821.     order by c.colid
  6822.     
  6823.     WHILE @indid is not NULL
  6824.     BEGIN
  6825.         INSERT #TmpIndex    /* Add all columns that are in index */
  6826.             SELECT
  6827.                 DB_NAME(),                                /* TABLE_QUALIFIER */
  6828.                 USER_NAME(o.uid),                        /* TABLE_OWNER       */
  6829.                 o.name,                                 /* TABLE_NAME       */
  6830.                 o.name,                                 /* INDEX_QUALIFIER */
  6831.                 x.name,                                 /* INDEX_NAME       */
  6832.                 case                                    /* NON_UNIQUE       */
  6833.                     WHEN x.status&2 <> 2 then 1            /* Nonunique index */
  6834.                     else 0                                /* Unique index    */
  6835.                 end,
  6836.                 case                                    /* TYPE            */
  6837.                     when @indid > 1 then 3                /* Non-Clustered   */
  6838.                     else 1                                /* Clustered index */
  6839.                 end,
  6840.                 tc.ordinal,                                    /* SEQ_IN_INDEX    */
  6841.                 INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME       */
  6842.                 'A',                                    /* COLLATION       */
  6843.                 @indid,                                 /* index_id        */
  6844.                 case                                    /* CARDINALITY       */
  6845.                     when @indid > 1 then NULL            /* Non-Clustered   */
  6846.                     else x.rows                         /* Clustered index */
  6847.                 end,
  6848.                 case                                    /* PAGES           */
  6849.                     when @indid > 1 then NULL            /* Non-Clustered   */
  6850.                     else x.dpages                        /* Clustered index */
  6851.                 end,
  6852.                 x.status                                /* status            */
  6853.             FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc
  6854.             WHERE
  6855.                 not (@table_id is null)
  6856.                 AND x.id = @table_id
  6857.                 AND x.id = o.id
  6858.                 AND x.id = c.id
  6859.                 AND tc.colid = c.colid
  6860.                 AND tc.ordinal < keycnt+(x.status&18)/18    /* all but Unique Clust indices have an extra key */
  6861.                 AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL
  6862.                 AND indid = @indid
  6863.                 AND (x.status&2 = 2
  6864.                     OR @is_unique <> 'Y')
  6865.                 AND (x.status&32) = 0
  6866.         /*
  6867.         **      Now move @indid to the next index.
  6868.         */
  6869.         SELECT @lastindid = @indid
  6870.         SELECT @indid = NULL
  6871.  
  6872.         SELECT @indid = min(indid)
  6873.         FROM sysindexes
  6874.         WHERE not (@table_id is null)
  6875.             AND id = @table_id
  6876.             AND indid > @lastindid
  6877.             AND indid < 255
  6878.     END
  6879.  
  6880.     /* now add row for table statistics */
  6881.     INSERT #TmpIndex
  6882.         SELECT
  6883.             DB_NAME(),                /* TABLE_QUALIFIER */
  6884.             USER_NAME(o.uid),        /* TABLE_OWNER       */
  6885.             o.name,                 /* TABLE_NAME       */
  6886.             null,                    /* INDEX_QUALIFIER */
  6887.             null,                    /* INDEX_NAME       */
  6888.             null,                    /* NON_UNIQUE       */
  6889.             0,                        /* SQL_TABLE_STAT  */
  6890.             null,                    /* SEQ_IN_INDEX    */
  6891.             null,                    /* COLUMN_NAME       */
  6892.             null,                    /* COLLATION       */
  6893.             0,                        /* index_id        */
  6894.             x.rows,                 /* CARDINALITY       */
  6895.             x.dpages,                /* PAGES           */
  6896.             0                        /* status           */
  6897.         FROM sysindexes x, sysobjects o
  6898.         WHERE not (@table_id is null)
  6899.             AND o.id = @table_id
  6900.             AND x.id = o.id
  6901.             AND (x.indid = 0 or x.indid = 1)    /*    If there are no indexes */
  6902.                                                 /*    then table stats are in */
  6903.                                                 /*    a row with indid =0        */
  6904.  
  6905.     SELECT
  6906.         TABLE_QUALIFIER,
  6907.         TABLE_OWNER,
  6908.         TABLE_NAME,
  6909.         NON_UNIQUE,
  6910.         INDEX_QUALIFIER,
  6911.         INDEX_NAME,
  6912.         TYPE,
  6913.         SEQ_IN_INDEX,
  6914.         COLUMN_NAME,
  6915.         COLLATION,
  6916.         CARDINALITY,
  6917.         PAGES,
  6918.         FILTER_CONDITION = convert(varchar(128),null)
  6919.     FROM #TmpIndex
  6920.     WHERE
  6921.         INDEX_NAME like @index_name /* If matching name */
  6922.         or INDEX_NAME is null        /* If SQL_TABLE_STAT row */
  6923.     ORDER BY 4, 7, 6, 8
  6924.  
  6925.     DROP TABLE #TmpIndex, #TmpColumns
  6926. go
  6927.  
  6928. if (charindex('8.00', @@version) = 0)
  6929. begin
  6930.     print ''
  6931.     print ''
  6932.     print 'Warning:'
  6933.     print 'you are installing the stored procedures '
  6934.     print 'on a pre 8.0 SQL Server.'
  6935.     print 'Ignore the following errors.'
  6936. end
  6937. else
  6938.     drop proc sp_statistics
  6939. go
  6940.  
  6941. /*    Procedure for 8.0 server */
  6942. CREATE PROCEDURE sp_statistics (
  6943.                  @table_name        sysname,
  6944.                  @table_owner        sysname = null,
  6945.                  @table_qualifier    sysname = null,
  6946.                  @index_name        sysname = '%',
  6947.                  @is_unique         char(1) = 'N',
  6948.                  @accuracy            char(1) = 'Q')
  6949. AS
  6950.     set nocount on
  6951.     DECLARE @indid                int
  6952.     DECLARE @lastindid            int
  6953.     DECLARE @table_id            int
  6954.     DECLARE @full_table_name    nvarchar(257)
  6955.  
  6956.     create table #TmpIndex(
  6957.         TABLE_QUALIFIER sysname collate database_default NULL,
  6958.         TABLE_OWNER     sysname collate database_default NULL,
  6959.         TABLE_NAME        sysname collate database_default NOT NULL,
  6960.         INDEX_QUALIFIER sysname collate database_default null,
  6961.         INDEX_NAME        sysname collate database_default null,
  6962.         NON_UNIQUE        smallint null,
  6963.         TYPE            smallint NOT NULL,
  6964.         SEQ_IN_INDEX    smallint null,
  6965.         COLUMN_NAME     sysname collate database_default null,
  6966.         COLLATION        char(1) collate database_default null,
  6967.         index_id        int null,
  6968.         CARDINALITY     int null,
  6969.         PAGES            int null,
  6970.         status            int NOT NULL)
  6971.  
  6972.     if @table_qualifier is not null
  6973.     begin
  6974.         if db_name() <> @table_qualifier
  6975.         begin    /* If qualifier doesn't match current database */
  6976.             raiserror (15250, -1,-1)
  6977.             return
  6978.         end
  6979.     end
  6980.  
  6981.     if @accuracy not in ('Q','E')
  6982.         begin
  6983.             raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')
  6984.             return
  6985.         end
  6986.  
  6987.     if @table_owner is null
  6988.     begin    /* If unqualified table name */
  6989.         SELECT @full_table_name = quotename(@table_name)
  6990.     end
  6991.     else
  6992.     begin    /* Qualified table name */
  6993.         if @table_owner = ''
  6994.         begin    /* If empty owner name */
  6995.             SELECT @full_table_name = quotename(@table_owner)
  6996.         end
  6997.         else
  6998.         begin
  6999.             SELECT @full_table_name = quotename(@table_owner) +
  7000.                 '.' + quotename(@table_name)
  7001.         end
  7002.     end
  7003.     /*    Get Object ID */
  7004.     SELECT @table_id = object_id(@full_table_name)
  7005.  
  7006.     /*    Start at lowest index id */
  7007.     SELECT @indid = min(indid)
  7008.     FROM sysindexes
  7009.     WHERE not (@table_id is null)
  7010.         AND id = @table_id
  7011.         AND indid > 0
  7012.         AND indid < 255
  7013.  
  7014.     /* Create a temp table to correct the ordinal position of the columns */
  7015.     create table #TmpColumns
  7016.     (ordinal int identity(1,1),
  7017.      colid   smallint not null)
  7018.  
  7019.     /* Load columns into the temp table */
  7020.     insert into #TmpColumns (colid)
  7021.     select c.colid
  7022.     from syscolumns c
  7023.     where c.id = @table_id
  7024.     order by c.colid
  7025.     
  7026.     WHILE @indid is not NULL
  7027.     BEGIN
  7028.         INSERT #TmpIndex    /* Add all columns that are in index */
  7029.             SELECT
  7030.                 DB_NAME(),                                /* TABLE_QUALIFIER */
  7031.                 USER_NAME(o.uid),                        /* TABLE_OWNER       */
  7032.                 o.name,                                 /* TABLE_NAME       */
  7033.                 o.name,                                 /* INDEX_QUALIFIER */
  7034.                 x.name,                                 /* INDEX_NAME       */
  7035.                 case                                    /* NON_UNIQUE       */
  7036.                     WHEN x.status&2 <> 2 then 1            /* Nonunique index */
  7037.                     else 0                                /* Unique index    */
  7038.                 end,
  7039.                 case                                    /* TYPE            */
  7040.                     when @indid > 1 then 3                /* Non-Clustered   */
  7041.                     else 1                                /* Clustered index */
  7042.                 end,
  7043.                 tc.ordinal,                                    /* SEQ_IN_INDEX    */
  7044.                 INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME       */
  7045.                 'A',                                    /* COLLATION       */
  7046.                 @indid,                                 /* index_id        */
  7047.                 case                                    /* CARDINALITY       */
  7048.                     when @indid > 1 then NULL            /* Non-Clustered   */
  7049.                     else x.rows                         /* Clustered index */
  7050.                 end,
  7051.                 case                                    /* PAGES           */
  7052.                     when @indid > 1 then NULL            /* Non-Clustered   */
  7053.                     else x.dpages                        /* Clustered index */
  7054.                 end,
  7055.                 x.status                                /* status            */
  7056.             FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc
  7057.             WHERE
  7058.                 not (@table_id is null)
  7059.                 AND x.id = @table_id
  7060.                 AND x.id = o.id
  7061.                 AND x.id = c.id
  7062.                 AND tc.colid = c.colid
  7063.                 AND tc.ordinal < keycnt+(x.status&18)/18    /* all but Unique Clust indices have an extra key */
  7064.                 AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL
  7065.                 AND indid = @indid
  7066.                 AND (x.status&2 = 2
  7067.                     OR @is_unique <> 'Y')
  7068.                 AND (x.status&32) = 0
  7069.         /*
  7070.         **      Now move @indid to the next index.
  7071.         */
  7072.         SELECT @lastindid = @indid
  7073.         SELECT @indid = NULL
  7074.  
  7075.         SELECT @indid = min(indid)
  7076.         FROM sysindexes
  7077.         WHERE not (@table_id is null)
  7078.             AND id = @table_id
  7079.             AND indid > @lastindid
  7080.             AND indid < 255
  7081.     END
  7082.  
  7083.     /* now add row for table statistics */
  7084.     INSERT #TmpIndex
  7085.         SELECT
  7086.             DB_NAME(),                /* TABLE_QUALIFIER */
  7087.             USER_NAME(o.uid),        /* TABLE_OWNER       */
  7088.             o.name,                 /* TABLE_NAME       */
  7089.             null,                    /* INDEX_QUALIFIER */
  7090.             null,                    /* INDEX_NAME       */
  7091.             null,                    /* NON_UNIQUE       */
  7092.             0,                        /* SQL_TABLE_STAT  */
  7093.             null,                    /* SEQ_IN_INDEX    */
  7094.             null,                    /* COLUMN_NAME       */
  7095.             null,                    /* COLLATION       */
  7096.             0,                        /* index_id        */
  7097.             x.rows,                 /* CARDINALITY       */
  7098.             x.dpages,                /* PAGES           */
  7099.             0                        /* status           */
  7100.         FROM sysindexes x, sysobjects o
  7101.         WHERE not (@table_id is null)
  7102.             AND o.id = @table_id
  7103.             AND x.id = o.id
  7104.             AND (x.indid = 0 or x.indid = 1)    /*    If there are no indexes */
  7105.                                                 /*    then table stats are in */
  7106.                                                 /*    a row with indid =0        */
  7107.  
  7108.     SELECT
  7109.         TABLE_QUALIFIER,
  7110.         TABLE_OWNER,
  7111.         TABLE_NAME,
  7112.         NON_UNIQUE,
  7113.         INDEX_QUALIFIER,
  7114.         INDEX_NAME,
  7115.         TYPE,
  7116.         SEQ_IN_INDEX,
  7117.         COLUMN_NAME,
  7118.         COLLATION,
  7119.         CARDINALITY,
  7120.         PAGES,
  7121.         FILTER_CONDITION = convert(varchar(128),null)
  7122.     FROM #TmpIndex
  7123.     WHERE
  7124.         INDEX_NAME like @index_name /* If matching name */
  7125.         or INDEX_NAME is null        /* If SQL_TABLE_STAT row */
  7126.     ORDER BY 4, 7, 6, 8
  7127.  
  7128.     DROP TABLE #TmpIndex, #TmpColumns
  7129. go
  7130.  
  7131. grant execute on sp_statistics to public
  7132. go
  7133.  
  7134. dump tran master with no_log
  7135. go
  7136.  
  7137. print 'creating sp_stored_procedures'
  7138. go
  7139.  
  7140.  
  7141. /* pre 8.0 version */
  7142. create procedure sp_stored_procedures(
  7143.                         @sp_name        varchar(102) = null,
  7144.                         @sp_owner        varchar(96) = null,
  7145.                         @sp_qualifier    varchar(32) = null)
  7146. as
  7147.     declare @proc_type smallint
  7148.  
  7149.     if @sp_qualifier is not null
  7150.     begin
  7151.         if db_name() <> @sp_qualifier
  7152.         begin
  7153.             if @sp_qualifier = ''
  7154.             begin
  7155.                 /* in this case, we need to return an empty result set */
  7156.                 /* because the user has requested a database with an empty name */
  7157.                 select @sp_name = ''
  7158.                 select @sp_owner = ''
  7159.             end else
  7160.             begin    /* If qualifier doesn't match current database */
  7161.                 raiserror 20001 '~~Rush_51~~'
  7162.                 return
  7163.             end
  7164.         end
  7165.     end
  7166.  
  7167.     if @sp_name is null
  7168.     begin  /*  If procedure name not supplied, match all */
  7169.         select @sp_name = '%'
  7170.     end
  7171.     else begin
  7172.         if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
  7173.         begin
  7174.             if exists (select * from sysobjects
  7175.                 where uid = user_id()
  7176.                     and name = @sp_name
  7177.                     and type = 'P') /* Object type of Procedure */
  7178.             begin
  7179.                 select @sp_owner = user_name()
  7180.             end
  7181.         end
  7182.     end
  7183.     if @sp_owner is null    /*    If procedure owner not supplied, match all */
  7184.         select @sp_owner = '%'
  7185.  
  7186.     select @proc_type=2        /* Return 2 for 4.2 and later servers. */
  7187.  
  7188.     select
  7189.         PROCEDURE_QUALIFIER = convert(varchar(32),db_name()),
  7190.         PROCEDURE_OWNER = convert(varchar(32),user_name(o.uid)),
  7191.         PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
  7192.         NUM_INPUT_PARAMS = -1,    /* Constant since value unknown */
  7193.         NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
  7194.         NUM_RESULT_SETS = -1,    /* Constant since value unknown */
  7195.         REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  7196.         PROCEDURE_TYPE = @proc_type
  7197.     from
  7198.         sysobjects o,syscomments c,sysusers u
  7199.     where
  7200.         o.name like @sp_name
  7201.         and c.colid = 1
  7202.         and user_name(o.uid) like @sp_owner
  7203.         and o.type = 'P'        /* Object type of Procedure */
  7204.         and c.id = o.id
  7205.         and u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  7206.         and (suser_id() = 1     /* User is the System Administrator */
  7207.             or o.uid = user_id()    /* User created the object */
  7208.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  7209.             or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  7210.              from sysprotects p
  7211.              /* outer join to correlate with all rows in sysobjects */
  7212.              where p.id =* o.id
  7213.                  /*  get rows for public,current user,user's group */
  7214.                  and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
  7215.                  /* check for SELECT,EXECUTE privilege */
  7216.                  and (action in (193,224)))&1    /* more magic...normalize GRANT */
  7217.             ) = 1     /* final magic...compare Grants    */
  7218.         )
  7219.     order by 1, 2, 3
  7220. go
  7221.  
  7222. grant execute on sp_stored_procedures to public
  7223. go
  7224.  
  7225.  
  7226. if (charindex('7.00', @@version) > 0 or
  7227.     charindex('8.00', @@version) > 0)
  7228.     drop procedure sp_stored_procedures
  7229. else
  7230. begin
  7231.     print ''
  7232.     print ''
  7233.     print 'Warning:'
  7234.     print 'you are installing the stored procedures '
  7235.     print 'on a pre 7.0 SQL Server.'
  7236.     print 'Ignore the following errors.'
  7237. end
  7238. go
  7239.  
  7240.  
  7241. /* 7.0 version */
  7242. create procedure sp_stored_procedures(
  7243.                         @sp_name        nvarchar(390) = null,
  7244.                         @sp_owner        nvarchar(384) = null,
  7245.                         @sp_qualifier    sysname = null)
  7246. as
  7247.     declare @proc_type smallint
  7248.  
  7249.     if @sp_qualifier is not null
  7250.     begin
  7251.         if db_name() <> @sp_qualifier
  7252.         begin
  7253.             if @sp_qualifier = ''
  7254.             begin
  7255.                 /* in this case, we need to return an empty result set */
  7256.                 /* because the user has requested a database with an empty name */
  7257.                 select @sp_name = ''
  7258.                 select @sp_owner = ''
  7259.             end else
  7260.             begin    /* If qualifier doesn't match current database */
  7261.                 raiserror (15250, -1,-1)
  7262.                 return
  7263.             end
  7264.         end
  7265.     end
  7266.  
  7267.     if @sp_name is null
  7268.     begin  /*  If procedure name not supplied, match all */
  7269.         select @sp_name = '%'
  7270.     end
  7271.     else begin
  7272.         if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
  7273.         begin
  7274.             if exists (select * from sysobjects
  7275.                 where uid = user_id()
  7276.                     and name = @sp_name
  7277.                     and type = 'P') /* Object type of Procedure */
  7278.             begin
  7279.                 select @sp_owner = user_name()
  7280.             end
  7281.         end
  7282.     end
  7283.     if @sp_owner is null    /*    If procedure owner not supplied, match all */
  7284.         select @sp_owner = '%'
  7285.  
  7286.     select @proc_type=2        /* Return 2 for 4.2 and later servers. */
  7287.  
  7288.     select
  7289.         PROCEDURE_QUALIFIER = convert(sysname,db_name()),
  7290.         PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),
  7291.         PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  7292.         NUM_INPUT_PARAMS = -1,    /* Constant since value unknown */
  7293.         NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
  7294.         NUM_RESULT_SETS = -1,    /* Constant since value unknown */
  7295.         REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  7296.         PROCEDURE_TYPE = @proc_type
  7297.     from
  7298.         sysobjects o,syscomments c
  7299.     where
  7300.         o.name like @sp_name
  7301.         and c.colid = 1
  7302.         and user_name(o.uid) like @sp_owner
  7303.         and o.type = 'P'        /* Object type of Procedure */
  7304.         and c.id = o.id
  7305.         and permissions (o.id)&32 <> 0
  7306.     order by 1, 2, 3
  7307. go
  7308.  
  7309. grant execute on sp_stored_procedures to public
  7310. go
  7311.  
  7312. if (charindex('8.00', @@version) > 0)
  7313.     drop procedure sp_stored_procedures
  7314. else
  7315. begin
  7316.     print ''
  7317.     print ''
  7318.     print 'Warning:'
  7319.     print 'you are installing the stored procedures '
  7320.     print 'on a pre 8.0 SQL Server.'
  7321.     print 'Ignore the following errors.'
  7322. end
  7323. go
  7324.  
  7325.  
  7326. /* 8.0 version */
  7327. create procedure sp_stored_procedures(
  7328.                         @sp_name    nvarchar(390) = null,
  7329.                         @sp_owner    nvarchar(384) = null,
  7330.                         @sp_qualifier    sysname = null)
  7331. as
  7332.     declare @proc_type smallint
  7333.  
  7334.     if @sp_qualifier is not null
  7335.     begin
  7336.         if db_name() <> @sp_qualifier
  7337.         begin
  7338.             if @sp_qualifier = ''
  7339.             begin
  7340.                 /* in this case, we need to return an empty result set */
  7341.                 /* because the user has requested a database with an empty name */
  7342.                 select @sp_name = ''
  7343.                 select @sp_owner = ''
  7344.             end else
  7345.             begin    /* If qualifier doesn't match current database */
  7346.                 raiserror (15250, -1,-1)
  7347.                 return
  7348.             end
  7349.         end
  7350.     end
  7351.  
  7352.     if @sp_name is null
  7353.     begin  /*  If procedure name not supplied, match all */
  7354.         select @sp_name = '%'
  7355.     end
  7356.     else
  7357.     begin
  7358.     if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
  7359.     begin
  7360.         if exists (select * from sysobjects
  7361.             where uid = user_id()
  7362.                 and name = @sp_name
  7363.                 and type in ('P', 'FN', 'TF', 'IF'))        /* Procedures, scalar UDF, table UDF */
  7364.         begin
  7365.             select @sp_owner = user_name()
  7366.         end
  7367.     end
  7368.     end
  7369.     
  7370.     if @sp_owner is null        /* If procedure owner not supplied, match all */
  7371.     select @sp_owner = '%'
  7372.  
  7373.     select @proc_type=2            /* Return 2 for 4.2 and later servers. */
  7374.  
  7375.     select
  7376.         PROCEDURE_QUALIFIER = convert(sysname,db_name()),
  7377.         PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),
  7378.         PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  7379.         NUM_INPUT_PARAMS = -1,    /* Constant since value unknown */
  7380.         NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
  7381.         NUM_RESULT_SETS = -1,    /* Constant since value unknown */
  7382.         REMARKS = convert(varchar(254),null),    /* Remarks are NULL */
  7383.         PROCEDURE_TYPE = @proc_type
  7384.     from
  7385.         sysobjects o,syscomments c
  7386.     where
  7387.         o.name like @sp_name
  7388.         and c.colid = 1
  7389.         and user_name(o.uid) like @sp_owner
  7390.         and o.type in ('P', 'FN', 'TF', 'IF')        /* Object type of Procedure, scalar UDF, table UDF */
  7391.         and c.id = o.id
  7392.         and permissions (o.id)&32 <> 0
  7393.     order by 1, 2, 3
  7394. go
  7395.  
  7396. grant execute on sp_stored_procedures to public
  7397. go
  7398.  
  7399. dump tran master with no_log
  7400. go
  7401.  
  7402.  
  7403. print 'creating sp_table_privileges'
  7404. go
  7405.  
  7406. /*    Procedure for pre 6.50 server */
  7407. CREATE PROCEDURE sp_table_privileges (
  7408.             @table_name         varchar(90),
  7409.             @table_owner        varchar(90) = null,
  7410.             @table_qualifier    varchar(32) = null)
  7411. as
  7412.     set nocount on
  7413.  
  7414.     declare @table_id    int,
  7415.             @owner_id     int,
  7416.             @full_table_name char(181)
  7417.     declare @refconst int
  7418.  
  7419.     select @refconst = 1
  7420.     if    (charindex('6.00', @@version) = 0)
  7421.         select @refconst = NULL
  7422.  
  7423.     if @table_qualifier is not null
  7424.     begin
  7425.         if db_name() != @table_qualifier
  7426.         begin    /* If qualifier doesn't match current database */
  7427.             raiserror 20001 'Table qualifier must be name of current database'
  7428.             return
  7429.         end
  7430.     end
  7431.     if @table_owner is null
  7432.     begin    /* If unqualified table name */
  7433.         SELECT @full_table_name = @table_name
  7434.     end
  7435.     else
  7436.     begin    /* Qualified table name */
  7437.         SELECT @full_table_name = @table_owner + '.' + @table_name
  7438.     end
  7439.     /*    Get Object ID */
  7440.     SELECT @table_id = object_id(@full_table_name)
  7441.  
  7442.     if @@trancount != 0
  7443.     begin    /* If inside a transaction */
  7444.         raiserror 20003 'The procedure ''sp_table_privileges'' cannot be executed from within a transaction.'
  7445.         return
  7446.     end
  7447.     create table #table_priv1(
  7448.         table_qualifier            varchar(32) NOT NULL,
  7449.         table_owner             varchar(32) NOT NULL,
  7450.         table_name                varchar(32) NOT NULL,
  7451.         grantor                 varchar(32) NOT NULL,
  7452.         grantee                 varchar(32) NOT NULL,
  7453.         select_privilege        int NOT NULL,
  7454.         insert_privilege        int NOT NULL,
  7455.         update_privilege        int NOT NULL,
  7456.         delete_privilege        int NOT NULL,
  7457.         references_privilege    int NULL,
  7458.         is_grantable            varchar(3) NOT NULL,
  7459.         uid                     int NOT NULL,
  7460.         gid                     int NOT NULL)
  7461.  
  7462.     insert into #table_priv1
  7463.         select distinct
  7464.             db_name(),
  7465.             user_name(o.uid),
  7466.             o.name,
  7467.             user_name(o.uid),
  7468.             u.name,
  7469.             0,
  7470.             0,
  7471.             0,
  7472.             0,
  7473.             @refconst,
  7474.             'no',
  7475.             u.uid,
  7476.             u.gid
  7477.         from sysusers u, sysobjects o
  7478.         where o.id = @table_id and u.uid != u.gid
  7479.            and sysstat & 0xf in (1,2,3)    /* only valid for system tables,
  7480.                                            ** user tables, and views. */
  7481.  
  7482.     /*
  7483.     ** now add row for table owner
  7484.     */
  7485.     if exists (
  7486.         select *
  7487.             from #table_priv1
  7488.             where grantor = grantee)
  7489.     begin
  7490.         update #table_priv1
  7491.         set
  7492.             select_privilege = 1,
  7493.             update_privilege = 1,
  7494.             insert_privilege = 1,
  7495.             delete_privilege = 1,
  7496.             references_privilege = 1,
  7497.             is_grantable = 'yes'
  7498.         where grantor = grantee
  7499.     end
  7500.     else
  7501.     begin
  7502.         insert into #table_priv1
  7503.             select    db_name(),
  7504.                 user_name(o.uid),
  7505.                 o.name,
  7506.                 user_name(o.uid),
  7507.                 user_name(o.uid),
  7508.                 1,
  7509.                 1,
  7510.                 1,
  7511.                 1,
  7512.                 @refconst,
  7513.                 'yes',
  7514.                 o.uid,
  7515.                 u.gid
  7516.             from sysobjects o, sysusers u
  7517.             where o.id = @table_id and u.uid = o.uid
  7518.             and sysstat & 0xf in (1,2,3)    /* only valid for system tables,
  7519.                                            ** user tables, and views. */
  7520.  
  7521.     end
  7522.  
  7523.     update #table_priv1
  7524.     set select_privilege = 1
  7525.     where
  7526.         exists (
  7527.             select * from sysprotects
  7528.             where
  7529.                 id = @table_id
  7530.                 and (#table_priv1.uid = uid
  7531.                     or #table_priv1.gid = uid
  7532.                     or uid = 0)
  7533.                 and protecttype = 205
  7534.                 and action = 193)
  7535.         and not exists (
  7536.             select * from sysprotects
  7537.             where
  7538.                 id = @table_id
  7539.                 and (#table_priv1.uid = uid
  7540.                     or #table_priv1.gid = uid
  7541.                     or uid = 0)
  7542.                 and protecttype = 206
  7543.                 and action = 193)
  7544.  
  7545.     update #table_priv1
  7546.     set insert_privilege = 1
  7547.     where
  7548.         exists (
  7549.             select * from sysprotects
  7550.             where
  7551.                 id = @table_id
  7552.                 and (#table_priv1.uid = uid
  7553.                     or #table_priv1.gid = uid
  7554.                     or uid = 0)
  7555.                 and protecttype = 205
  7556.                 and action = 195)
  7557.         and not exists (
  7558.             select * from sysprotects
  7559.             where
  7560.                 id = @table_id
  7561.                 and (#table_priv1.uid = uid
  7562.                     or #table_priv1.gid = uid
  7563.                     or uid = 0)
  7564.                 and protecttype = 206
  7565.                 and action = 195)
  7566.  
  7567.     update #table_priv1
  7568.     set delete_privilege = 1
  7569.     where
  7570.         exists (
  7571.             select * from sysprotects
  7572.             where
  7573.                 id = @table_id
  7574.                 and (#table_priv1.uid = uid
  7575.                     or #table_priv1.gid = uid
  7576.                     or uid = 0)
  7577.                 and protecttype = 205
  7578.                 and action = 196)
  7579.         and not exists (select * from sysprotects
  7580.             where
  7581.                 id = @table_id
  7582.                 and (#table_priv1.uid = uid
  7583.                     or #table_priv1.gid = uid
  7584.                     or uid = 0)
  7585.                 and protecttype = 206
  7586.                 and action = 196)
  7587.  
  7588.     update #table_priv1
  7589.     set update_privilege = 1
  7590.     where
  7591.         exists (
  7592.             select * from sysprotects
  7593.             where
  7594.                 id = @table_id
  7595.                 and (#table_priv1.uid = uid
  7596.                     or #table_priv1.gid = uid
  7597.                     or uid = 0)
  7598.                 and protecttype = 205
  7599.                 and action = 197)
  7600.         and not exists (
  7601.             select * from sysprotects
  7602.             where
  7603.                 id = @table_id
  7604.                 and (#table_priv1.uid = uid
  7605.                     or #table_priv1.gid = uid
  7606.                     or uid = 0)
  7607.                 and protecttype = 206
  7608.                 and action = 197)
  7609.  
  7610.     update #table_priv1
  7611.     set references_privilege = 1
  7612.     where
  7613.         exists (
  7614.             select * from sysprotects
  7615.             where
  7616.                 id = @table_id
  7617.                 and (#table_priv1.uid = uid
  7618.                     or #table_priv1.gid = uid
  7619.                     or uid = 0)
  7620.                 and protecttype = 205
  7621.                 and action = 26)
  7622.         and not exists (
  7623.             select * from sysprotects
  7624.             where
  7625.                 id = @table_id
  7626.                 and (#table_priv1.uid = uid
  7627.                     or #table_priv1.gid = uid
  7628.                     or uid = 0)
  7629.                 and protecttype = 206
  7630.                 and action = 26)
  7631.  
  7632.     create table #table_priv2(
  7633.         table_qualifier varchar(32) NULL,
  7634.         table_owner     varchar(32) NULL,
  7635.         table_name        varchar(32) NOT NULL,
  7636.         grantor         varchar(32) NULL,
  7637.         grantee         varchar(32) NOT NULL,
  7638.         privilege        varchar(32) NOT NULL,
  7639.         is_grantable    varchar(3) NULL)
  7640.  
  7641.     insert into #table_priv2
  7642.         select
  7643.             table_qualifier,
  7644.             table_owner,
  7645.             table_name,
  7646.             grantor,
  7647.             grantee,
  7648.             'SELECT',
  7649.             is_grantable
  7650.         from #table_priv1
  7651.         where select_privilege = 1
  7652.  
  7653.  
  7654.     insert into #table_priv2
  7655.         select
  7656.             table_qualifier,
  7657.             table_owner,
  7658.             table_name,
  7659.             grantor,
  7660.             grantee,
  7661.             'INSERT',
  7662.             is_grantable
  7663.         from #table_priv1
  7664.         where insert_privilege = 1
  7665.  
  7666.  
  7667.     insert into #table_priv2
  7668.         select
  7669.             table_qualifier,
  7670.             table_owner,
  7671.             table_name,
  7672.             grantor,
  7673.             grantee,
  7674.             'DELETE',
  7675.             is_grantable
  7676.         from #table_priv1
  7677.         where delete_privilege = 1
  7678.  
  7679.  
  7680.     insert into #table_priv2
  7681.         select
  7682.             table_qualifier,
  7683.             table_owner,
  7684.             table_name,
  7685.             grantor,
  7686.             grantee,
  7687.             'UPDATE',
  7688.             is_grantable
  7689.         from #table_priv1
  7690.         where update_privilege = 1
  7691.  
  7692.     insert into #table_priv2
  7693.         select
  7694.             table_qualifier,
  7695.             table_owner,
  7696.             table_name,
  7697.             grantor,
  7698.             grantee,
  7699.             'REFERENCES',
  7700.             is_grantable
  7701.         from #table_priv1
  7702.         where references_privilege = 1
  7703.  
  7704.  
  7705.     select * from #table_priv2
  7706.     order by table_owner,table_name,privilege,grantee
  7707. /*    order by 2,3,6,5 Can't use since fails on 4.21a server */
  7708. go
  7709.  
  7710. if (charindex('6.50', @@version) = 0 and
  7711.     charindex('7.00', @@version) = 0 and
  7712.     charindex('8.00', @@version) = 0)
  7713. begin
  7714.     print ''
  7715.     print ''
  7716.     print 'Warning:'
  7717.     print 'you are installing the stored procedures '
  7718.     print 'on a pre 6.50 SQL Server.'
  7719.     print 'Ignore the following errors.'
  7720. end
  7721. else
  7722.     drop proc sp_table_privileges
  7723. go
  7724.  
  7725.  
  7726. /*    Procedure for 6.50 server */
  7727. CREATE PROCEDURE sp_table_privileges (
  7728.             @table_name         varchar(96),
  7729.             @table_owner        varchar(96) = null,
  7730.             @table_qualifier    varchar(32) = null)
  7731. as
  7732.  
  7733.     if @table_qualifier is not null
  7734.     begin
  7735.         if db_name() <> @table_qualifier
  7736.         begin    /* If qualifier doesn't match current database */
  7737.             raiserror (15250, -1,-1)
  7738.             return
  7739.         end
  7740.     end
  7741.     if @table_name is null
  7742.         select @table_name = '%'
  7743.     if @table_owner is null /* If no owner supplied, force wildcard */
  7744.         select @table_owner = '%'
  7745.  
  7746.     select
  7747.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  7748.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  7749.         convert(varchar(32),object_name(o.id)) TABLE_NAME,
  7750.         convert(varchar(32),user_name(p.grantor)) GRANTOR,
  7751.         convert(varchar(32),user_name(u.uid)) GRANTEE,
  7752.         convert(varchar(32),case p.action
  7753.              when 193 then 'SELECT'
  7754.              when 195 then 'INSERT'
  7755.              when 196 then 'DELETE'
  7756.              when 197 then 'UPDATE'
  7757.              else 'REFERENCES'
  7758.         end) PRIVILEGE,
  7759.         convert(varchar(3),case when p.protecttype = 205 then 'NO'
  7760.             else 'YES'
  7761.         end) IS_GRANTABLE
  7762.     from sysprotects p, sysobjects o, sysusers u
  7763.     where
  7764.         p.id = o.id
  7765.         and o.type in ('U','V','S')
  7766.         and object_name(o.id) like @table_name
  7767.         and user_name(o.uid) like @table_owner
  7768.             /* expand groups */
  7769.         and ((p.uid = u.uid and u.uid <> u.gid) or
  7770.              (p.uid = u.gid and u.uid <> u.gid))
  7771.         and p.protecttype <> 206    /* only grant rows */
  7772.         and p.action in (26,193,195,196,197)
  7773.         and o.uid <> u.uid            /* no rows for owner */
  7774.         and not exists (            /* exclude revoke'd privileges */
  7775.             select *
  7776.             from sysprotects p1
  7777.             where
  7778.                 p1.protecttype = 206
  7779.                 and p1.action = p.action
  7780.                 and p1.id = p.id
  7781.                 and p1.uid = u.uid)
  7782.     union
  7783.     select    /*    Add rows for table owner */
  7784.         convert(varchar(32),db_name()) TABLE_QUALIFIER,
  7785.         convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
  7786.         convert(varchar(32),object_name(o.id)) TABLE_NAME,
  7787.         convert(varchar(32),user_name(u.uid)) GRANTOR,
  7788.         convert(varchar(32),user_name(o.uid)) GRANTEE,
  7789.         convert(varchar(32),case v.number
  7790.             when 193 then 'SELECT'
  7791.             when 195 then 'INSERT'
  7792.             when 196 then 'DELETE'
  7793.             when 197 then 'UPDATE'
  7794.             else 'REFERENCES'
  7795.         end) PRIVILEGE,
  7796.         convert(varchar(3),'YES') IS_GRANTABLE
  7797.     from sysobjects o, master.dbo.spt_values v, sysusers u
  7798.     where
  7799.         object_name(o.id) like @table_name
  7800.         and o.type in ('U','V','S')
  7801.         and user_name(o.uid) like @table_owner
  7802.         and u.uid = 1        /* grantor is dbo of database */
  7803.         and v.type = 'P'    /* cross product to get all exposed privileges */
  7804.         and v.number in (26,193,195,196,197)
  7805.         and not exists (    /* exclude revoke'd privileges */
  7806.             select *
  7807.             from sysprotects p1
  7808.             where
  7809.                 p1.protecttype = 206
  7810.                 and p1.action = v.number
  7811.                 and p1.id = o.id
  7812.                 and p1.uid = o.uid)
  7813.     order by 2,3,6,5
  7814. go
  7815.  
  7816.  
  7817. if (charindex('7.00', @@version) > 0 or
  7818.     charindex('8.00', @@version) > 0)
  7819.     drop proc sp_table_privileges
  7820. else
  7821. begin
  7822.     print ''
  7823.     print ''
  7824.     print 'Warning:'
  7825.     print 'you are installing the stored procedures '
  7826.     print 'on a pre 7.0 SQL Server.'
  7827.     print 'Ignore the following errors.'
  7828. end
  7829. go
  7830.  
  7831. /*    Procedure for 7.0 and later servers */
  7832. CREATE PROCEDURE sp_table_privileges (
  7833.             @table_name         nvarchar(384),
  7834.             @table_owner        nvarchar(384) = null,
  7835.             @table_qualifier    sysname = null)
  7836. as
  7837.  
  7838.     if @table_qualifier is not null
  7839.     begin
  7840.         if db_name() <> @table_qualifier
  7841.         begin    /* If qualifier doesn't match current database */
  7842.             raiserror (15250, -1,-1)
  7843.             return
  7844.         end
  7845.     end
  7846.     if @table_name is null
  7847.         select @table_name = '%'
  7848.     if @table_owner is null /* If no owner supplied, force wildcard */
  7849.         select @table_owner = '%'
  7850.  
  7851.     select
  7852.         convert(sysname,db_name()) TABLE_QUALIFIER,
  7853.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  7854.         convert(sysname,object_name(o.id)) TABLE_NAME,
  7855.         convert(sysname,user_name(p.grantor)) GRANTOR,
  7856.         convert(sysname,user_name(u.uid)) GRANTEE,
  7857.         convert(varchar(32),case p.action
  7858.              when 193 then 'SELECT'
  7859.              when 195 then 'INSERT'
  7860.              when 196 then 'DELETE'
  7861.              when 197 then 'UPDATE'
  7862.              else 'REFERENCES'
  7863.         end) PRIVILEGE,
  7864.         convert(varchar(3),case when p.protecttype = 205 then 'NO'
  7865.             else 'YES'
  7866.         end) IS_GRANTABLE
  7867.     from sysprotects p, sysobjects o, sysusers u, sysmembers m
  7868.     where
  7869.         p.id = o.id
  7870.         and o.type in ('U','V','S')
  7871.         and object_name(o.id) like @table_name
  7872.         and user_name(o.uid) like @table_owner
  7873.             /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  7874.         and (u.uid > 0 and u.uid < 16384)
  7875.         and ((p.uid = u.uid) or
  7876.              (p.uid = m.groupuid and u.uid = m.memberuid))
  7877.         and p.protecttype <> 206    /* only grant rows */
  7878.         and p.action in (26,193,195,196,197)
  7879.         and o.uid <> u.uid            /* no rows for owner */
  7880.         and not exists (            /* exclude revoke'd privileges */
  7881.             select *
  7882.             from sysprotects p1
  7883.             where
  7884.                 p1.protecttype = 206
  7885.                 and p1.action = p.action
  7886.                 and p1.id = p.id
  7887.                 and p1.uid = u.uid)
  7888.     union
  7889.     select    /*    Add rows for table owner */
  7890.         convert(sysname,db_name()) TABLE_QUALIFIER,
  7891.         convert(sysname,user_name(o.uid)) TABLE_OWNER,
  7892.         convert(sysname,object_name(o.id)) TABLE_NAME,
  7893.         convert(sysname,user_name(u.uid)) GRANTOR,
  7894.         convert(sysname,user_name(o.uid)) GRANTEE,
  7895.         convert(varchar(32),case v.number
  7896.             when 193 then 'SELECT'
  7897.             when 195 then 'INSERT'
  7898.             when 196 then 'DELETE'
  7899.             when 197 then 'UPDATE'
  7900.             else 'REFERENCES'
  7901.         end) PRIVILEGE,
  7902.         convert(varchar(3),'YES') IS_GRANTABLE
  7903.     from sysobjects o, master.dbo.spt_values v, sysusers u
  7904.     where
  7905.         object_name(o.id) like @table_name
  7906.         and o.type in ('U','V','S')
  7907.         and user_name(o.uid) like @table_owner
  7908.         and u.uid = 1        /* grantor is 'dbo' of database */
  7909.         and v.type = N'P'    /* cross product to get all exposed privileges */
  7910.         and v.number in (26,193,195,196,197)
  7911.         and not exists (    /* exclude revoke'd privileges */
  7912.             select *
  7913.             from sysprotects p1
  7914.             where
  7915.                 p1.protecttype = 206
  7916.                 and p1.action = v.number
  7917.                 and p1.id = o.id
  7918.                 and p1.uid = o.uid)
  7919.     order by 2,3,6,5
  7920. go
  7921.  
  7922. grant execute on sp_table_privileges to public
  7923. go
  7924.  
  7925. dump tran master with no_log
  7926. go
  7927.  
  7928. print 'creating sp_tables'
  7929. go
  7930.  
  7931. /*    Procedure for 6.50 and earlier servers */
  7932. create procedure sp_tables(
  7933.                @table_name        varchar(96)    = null,
  7934.                @table_owner     varchar(96)    = null,
  7935.                @table_qualifier varchar(32)    = null,
  7936.                @table_type        varchar(100) = null)
  7937. as
  7938.     declare @type1 varchar(3)
  7939.     declare @tableindex int
  7940.  
  7941.  
  7942.     /* Special feature #1:    enumerate databases when owner and name
  7943.          are blank but qualifier is explicitly '%'.  */
  7944.     if @table_qualifier = '%' and
  7945.         @table_owner = '' and
  7946.         @table_name = ''
  7947.     begin    /* If enumerating databases */
  7948.         select
  7949.             TABLE_QUALIFIER = convert(varchar(32),d.name),
  7950.             TABLE_OWNER = convert(varchar(32),null),
  7951.             TABLE_NAME = convert(varchar(32),null),
  7952.             TABLE_TYPE = convert(varchar(32),null),
  7953.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  7954.         from master.dbo.sysdatabases d
  7955.         where d.name <> 'model'    /* eliminate MODEL database */
  7956.         order by 1
  7957.     end
  7958.  
  7959.     /* Special feature #2:    enumerate owners when qualifier and name
  7960.          are blank but owner is explicitly '%'.  */
  7961.     else if @table_qualifier = '' and
  7962.         @table_owner = '%' and
  7963.         @table_name = ''
  7964.     begin    /* If enumerating owners */
  7965.         select distinct
  7966.             TABLE_QUALIFIER = convert(varchar(32),null),
  7967.             TABLE_OWNER = convert(varchar(32),user_name(uid)),
  7968.             TABLE_NAME = convert(varchar(32),null),
  7969.             TABLE_TYPE = convert(varchar(32),null),
  7970.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  7971.         from sysobjects
  7972.         order by 2
  7973.     end
  7974.  
  7975.     /* Special feature #3:    enumerate table types when qualifier, owner and
  7976.          name are blank but table type is explicitly '%'.    */
  7977.     else if @table_qualifier = '' and
  7978.         @table_owner = '' and
  7979.         @table_name = '' and
  7980.         @table_type = '%'
  7981.     begin    /* If enumerating table types */
  7982.         select
  7983.             TABLE_QUALIFIER = convert(varchar(32),null),
  7984.             TABLE_OWNER = convert(varchar(32),null),
  7985.             TABLE_NAME = convert(varchar(32),null),
  7986.             TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE       VIEW',(colid-1)*12+1,12))),
  7987.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  7988.         from sysobjects o, syscolumns c
  7989.         where o.id=c.id and o.name='sysusers' and colid<=3
  7990.     end
  7991.  
  7992.     else
  7993.     begin /* end of special features - do normal processing */
  7994.         if @table_qualifier is not null
  7995.         begin
  7996.             if db_name() <> @table_qualifier
  7997.             begin
  7998.                 if @table_qualifier = ''
  7999.                 begin  /* If empty qualifier supplied */
  8000.                     /* Force an empty result set */
  8001.                     select @table_name = ''
  8002.                     select @table_owner = ''
  8003.                 end
  8004.                 else
  8005.                 begin    /* If qualifier doesn't match current database */
  8006.                     raiserror 20001 '~~Rush_5~~'
  8007.                     return
  8008.                 end
  8009.             end
  8010.         end
  8011.         if @table_type is null
  8012.         begin    /* Select all ODBC supported table types */
  8013.             select @type1 = 'SUV'
  8014.         end
  8015.         else
  8016.         begin
  8017.             /*    TableType is case sensitive if CS server */
  8018.             select @type1 = null
  8019.             if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
  8020.                 select @type1 = @type1 + 'S'    /* Add System Tables */
  8021.             if (charindex('''TABLE''',@table_type) <> 0)
  8022.                 select @type1 = @type1 + 'U'    /* Add User Tables */
  8023.             if (charindex('''VIEW''',@table_type) <> 0)
  8024.                 select @type1 = @type1 + 'V'    /* Add Views */
  8025.         end
  8026.         if @table_name is null
  8027.         begin    /*    If table name not supplied, match all */
  8028.             select @table_name = '%'
  8029.         end
  8030.         else
  8031.         begin
  8032.             if (@table_owner is null) and (charindex('%', @table_name) = 0)
  8033.             begin    /* If owner not specified and table is specified */
  8034.                 if exists (select * from sysobjects
  8035.                     where uid = user_id()
  8036.                     and name = @table_name
  8037.                     and (type = 'U' or type = 'V' or type = 'S'))
  8038.                 begin    /* Override supplied owner w/owner of table */
  8039.                     select @table_owner = user_name()
  8040.                 end
  8041.             end
  8042.         end
  8043.         if @table_owner is null /* If no owner supplied, force wildcard */
  8044.             select @table_owner = '%'
  8045.         select
  8046.             TABLE_QUALIFIER = convert(varchar(32),db_name()),
  8047.             TABLE_OWNER = convert(varchar(32),user_name(o.uid)),
  8048.             TABLE_NAME = convert(varchar(32),o.name),    /* make nullable */
  8049.             TABLE_TYPE = convert(varchar(32),rtrim(
  8050.                 substring('SYSTEM TABLE            TABLE       VIEW       ',
  8051.                     (ascii(o.type)-83)*12+1,12))),    /* 'S'=0,'U'=2,'V'=3 */
  8052.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  8053.         from sysusers u, sysobjects o
  8054.         where
  8055.             o.name like @table_name
  8056.             and user_name(o.uid) like @table_owner
  8057.             and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
  8058.             and u.uid = user_id() /* constrain sysusers uid for use in subquery */
  8059.             and (
  8060.                 suser_id() = 1     /* User is the System Administrator */
  8061.                 or o.uid = user_id()     /* User created the object */
  8062.                 /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  8063.                 or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  8064.                     from sysprotects p
  8065.                     /* outer join to correlate with all rows in sysobjects */
  8066.                     where p.id =* o.id
  8067.                         /* get rows for public,current user,user's group */
  8068.                         and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
  8069.                         /* check for SELECT,EXECUTE privilege */
  8070.                         and (action in (193,224)))&1     /* more magic...normalize GRANT */
  8071.                     ) = 1    /* final magic...compare Grants      */
  8072.             )
  8073.         order by 4, 1, 2, 3
  8074.     end
  8075. go
  8076.  
  8077. if (charindex('7.00', @@version) > 0 or
  8078.     charindex('8.00', @@version) > 0)
  8079.     drop procedure sp_tables
  8080. else
  8081. begin
  8082.     print ''
  8083.     print ''
  8084.     print 'Warning:'
  8085.     print 'you are installing the stored procedures '
  8086.     print 'on a pre 8.0 SQL Server.'
  8087.     print 'Ignore the following errors.'
  8088. end
  8089. go
  8090.  
  8091. /*    Procedure for 8.0 server */
  8092. create procedure sp_tables(
  8093.                @table_name        nvarchar(384)    = null,
  8094.                @table_owner     nvarchar(384)    = null,
  8095.                @table_qualifier sysname    = null,
  8096.                @table_type        varchar(100) = null)
  8097. as
  8098.     declare @type1 varchar(3)
  8099.     declare @tableindex int
  8100.  
  8101.  
  8102.     /* Special feature #1:    enumerate databases when owner and name
  8103.          are blank but qualifier is explicitly '%'.  */
  8104.     if @table_qualifier = '%' and
  8105.         @table_owner = '' and
  8106.         @table_name = ''
  8107.     begin    /* If enumerating databases */
  8108.         select
  8109.             TABLE_QUALIFIER = convert(sysname,d.name),
  8110.             TABLE_OWNER = convert(sysname,null),
  8111.             TABLE_NAME = convert(sysname,null),
  8112.             TABLE_TYPE = convert(varchar(32),null),
  8113.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  8114.         from master.dbo.sysdatabases d
  8115.         where d.name <> 'model'    /* eliminate MODEL database */
  8116.         order by 1
  8117.     end
  8118.  
  8119.     /* Special feature #2:    enumerate owners when qualifier and name
  8120.          are blank but owner is explicitly '%'.  */
  8121.     else if @table_qualifier = '' and
  8122.         @table_owner = '%' and
  8123.         @table_name = ''
  8124.     begin    /* If enumerating owners */
  8125.         select distinct
  8126.             TABLE_QUALIFIER = convert(sysname,null),
  8127.             TABLE_OWNER = convert(sysname,user_name(uid)),
  8128.             TABLE_NAME = convert(sysname,null),
  8129.             TABLE_TYPE = convert(varchar(32),null),
  8130.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  8131.         from sysobjects
  8132.         order by 2
  8133.     end
  8134.  
  8135.     /* Special feature #3:    enumerate table types when qualifier, owner and
  8136.          name are blank but table type is explicitly '%'.    */
  8137.     else if @table_qualifier = '' and
  8138.         @table_owner = '' and
  8139.         @table_name = '' and
  8140.         @table_type = '%'
  8141.     begin    /* If enumerating table types */
  8142.         select
  8143.             TABLE_QUALIFIER = convert(sysname,null),
  8144.             TABLE_OWNER = convert(sysname,null),
  8145.             TABLE_NAME = convert(sysname,null),
  8146.             TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE       VIEW',(colid-1)*12+1,12))),
  8147.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  8148.         from sysobjects o, syscolumns c
  8149.         where o.id=c.id and o.name='sysusers' and colid<=3
  8150.     end
  8151.  
  8152.     else
  8153.     begin /* end of special features - do normal processing */
  8154.         if @table_qualifier is not null
  8155.         begin
  8156.             if db_name() <> @table_qualifier
  8157.             begin
  8158.                 if @table_qualifier = ''
  8159.                 begin  /* If empty qualifier supplied */
  8160.                     /* Force an empty result set */
  8161.                     select @table_name = ''
  8162.                     select @table_owner = ''
  8163.                 end
  8164.                 else
  8165.                 begin    /* If qualifier doesn't match current database */
  8166.                     raiserror (15250, -1,-1)
  8167.                     return
  8168.                 end
  8169.             end
  8170.         end
  8171.         if @table_type is null
  8172.         begin    /* Select all ODBC supported table types */
  8173.             select @type1 = 'SUV'
  8174.         end
  8175.         else
  8176.         begin
  8177.             /*    TableType is case sensitive if CS server */
  8178.             select @type1 = ''
  8179.             if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
  8180.                 select @type1 = @type1 + 'S'    /* Add System Tables */
  8181.             if (charindex('''TABLE''',@table_type) <> 0)
  8182.                 select @type1 = @type1 + 'U'    /* Add User Tables */
  8183.             if (charindex('''VIEW''',@table_type) <> 0)
  8184.                 select @type1 = @type1 + 'V'    /* Add Views */
  8185.         end
  8186.         if @table_name is null
  8187.         begin    /*    If table name not supplied, match all */
  8188.             select @table_name = '%'
  8189.         end
  8190.         else
  8191.         begin
  8192.             if (@table_owner is null) and (charindex('%', @table_name) = 0)
  8193.             begin    /* If owner not specified and table is specified */
  8194.                 if exists (select * from sysobjects
  8195.                     where uid = user_id()
  8196.                     and name = @table_name
  8197.                     and (type = 'U' or type = 'V' or type = 'S'))
  8198.                 begin    /* Override supplied owner w/owner of table */
  8199.                     select @table_owner = user_name()
  8200.                 end
  8201.             end
  8202.         end
  8203.         if @table_owner is null /* If no owner supplied, force wildcard */
  8204.             select @table_owner = '%'
  8205.         select
  8206.             TABLE_QUALIFIER = convert(sysname,db_name()),
  8207.             TABLE_OWNER = convert(sysname,user_name(o.uid)),
  8208.             TABLE_NAME = convert(sysname,o.name),    /* make nullable */
  8209.             TABLE_TYPE = convert(varchar(32),rtrim(
  8210.                 substring('SYSTEM TABLE            TABLE       VIEW       ',
  8211.                     (ascii(o.type)-83)*12+1,12))),    /* 'S'=0,'U'=2,'V'=3 */
  8212.             REMARKS = convert(varchar(254),null)    /* Remarks are NULL */
  8213.         from sysobjects o
  8214.         where
  8215.             o.name like @table_name
  8216.             and user_name(o.uid) like @table_owner
  8217.             and o.type in ('U','V','S')
  8218.             and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
  8219.             and permissions (o.id)&4096 <> 0
  8220.         order by 4, 1, 2, 3
  8221.     end
  8222. go
  8223.  
  8224.  
  8225. grant execute on sp_tables to public
  8226. go
  8227.  
  8228. dump tran master with no_log
  8229. go
  8230.  
  8231. /*-----------------------------------------------------------------------------*/
  8232. /*-------------- CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/
  8233. /*-----------------------------------------------------------------------------*/
  8234.  
  8235. if object_id('sp_linkedservers', 'P') is not null
  8236.     drop proc sp_linkedservers
  8237. go
  8238. raiserror(15339,-1,-1,'sp_linkedservers')
  8239. go
  8240. create proc sp_linkedservers as
  8241.     select
  8242.         SRV_NAME = srvname,
  8243.         SRV_PROVIDERNAME = providername,
  8244.         SRV_PRODUCT = srvproduct,
  8245.         SRV_DATASOURCE = datasource,
  8246.         SRV_PROVIDERSTRING = providerstring,
  8247.         SRV_LOCATION = location,
  8248.         SRV_CAT = catalog
  8249.     from master.dbo.sysservers
  8250.     order by 1
  8251. go
  8252. grant execute on sp_linkedservers to public
  8253. go
  8254.  
  8255.  
  8256. if object_id('sp_catalogs', 'P') is not null
  8257.     drop proc sp_catalogs
  8258. go
  8259. raiserror(15339,-1,-1,'sp_catalogs')
  8260. go
  8261. create procedure sp_catalogs(
  8262.     @server_name        sysname)
  8263. as
  8264.     select
  8265.         CATALOG_NAME,
  8266.         convert (nvarchar(255),DESCRIPTION)
  8267.     from master.dbo.SYSREMOTE_CATALOGS < @server_name >
  8268.     order by CATALOG_NAME
  8269. go
  8270. grant execute on sp_catalogs to public
  8271. go
  8272.  
  8273.  
  8274. if object_id('sp_tables_ex', 'P') is not null
  8275.     drop proc sp_tables_ex
  8276. go
  8277. raiserror(15339,-1,-1,'sp_tables_ex')
  8278. go
  8279. create procedure sp_tables_ex(
  8280.     @table_server        sysname,
  8281.     @table_name            sysname = null,
  8282.     @table_schema        sysname = null,
  8283.     @table_catalog        sysname = null,
  8284.     @table_type            sysname = null)
  8285. as
  8286.     declare @table_catalog_param        sysname
  8287.     if ((isnull(charindex('%', @table_catalog),0) = 0) and
  8288.         (isnull(charindex('[', @table_catalog),0) = 0) and
  8289.         (isnull(charindex('_', @table_catalog),0) = 0))
  8290.         select @table_catalog_param = @table_catalog
  8291.     else
  8292.         select @table_catalog_param = null
  8293.  
  8294.     if ((isnull(charindex('%', @table_name),0) = 0) and
  8295.         (isnull(charindex('[', @table_name),0) = 0) and
  8296.         (isnull(charindex('_', @table_name),0) = 0))
  8297.     begin    /*    If no wild carding */
  8298.         select
  8299.             TABLE_CAT = TABLE_CATALOG,
  8300.             TABLE_SCHEM = TABLE_SCHEMA,
  8301.             TABLE_NAME = TABLE_NAME,
  8302.             TABLE_TYPE = TABLE_TYPE,
  8303.             REMARKS = convert(nvarchar(255),DESCRIPTION)
  8304.         from master.dbo.SYSREMOTE_TABLES <
  8305.                     @table_server,
  8306.                     @table_catalog_param,
  8307.                     NULL,
  8308.                     @table_name,
  8309.                     NULL >
  8310.         where (TABLE_SCHEMA like @table_schema
  8311.             or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  8312.             and (TABLE_CATALOG like @table_catalog
  8313.             or     @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))
  8314.             and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0
  8315.             or     @table_type is NULL)
  8316.         order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
  8317.     end
  8318.     else
  8319.     begin    /*    If wild carding */
  8320.         select
  8321.             TABLE_CAT = TABLE_CATALOG,
  8322.             TABLE_SCHEM = TABLE_SCHEMA,
  8323.             TABLE_NAME = TABLE_NAME,
  8324.             TABLE_TYPE = TABLE_TYPE,
  8325.             REMARKS = convert(nvarchar(255),DESCRIPTION)
  8326.         from master.dbo.SYSREMOTE_TABLES <
  8327.                     @table_server,
  8328.                     @table_catalog_param,
  8329.                     NULL,
  8330.                     NULL,
  8331.                     NULL >
  8332.         where (TABLE_SCHEMA like @table_schema
  8333.             or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  8334.             and (TABLE_CATALOG like @table_catalog
  8335.             or     @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))
  8336.             and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0
  8337.             or     @table_type is NULL)
  8338.             and TABLE_NAME like @table_name
  8339.         order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
  8340.     end
  8341. go
  8342. grant execute on sp_tables_ex to public
  8343. go
  8344.  
  8345.  
  8346. if object_id('sp_columns_ex', 'P') is not null
  8347.     drop proc sp_columns_ex
  8348. go
  8349.  
  8350. /* 7.0 version */
  8351. raiserror(15339,-1,-1,'sp_columns_ex')
  8352. go
  8353.  
  8354. create procedure sp_columns_ex(
  8355.     @table_server        sysname,
  8356.     @table_name            sysname = null,
  8357.     @table_schema        sysname = null,
  8358.     @table_catalog        sysname = null,
  8359.     @column_name        sysname = null,
  8360.     @ODBCVer            int = 2)
  8361. as
  8362.  
  8363.     set nocount on
  8364.     declare
  8365.     @DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1),    @DBCOLUMNFLAGS_ISLONG    binary(1),
  8366.     @DBCOLUMNFLAGS_ISROWVER    binary(2)
  8367.  
  8368.     select
  8369.     @DBCOLUMNFLAGS_ISFIXEDLENGTH    = 0x10,    @DBCOLUMNFLAGS_ISLONG    = 0x80,
  8370.     @DBCOLUMNFLAGS_ISROWVER    = 0x0200
  8371.  
  8372.     declare    
  8373.     @DBTYPE_I2 smallint,            @DBTYPE_I4 smallint,
  8374.     @DBTYPE_R4 smallint,            @DBTYPE_R8 smallint,
  8375.     @DBTYPE_CY smallint,            @DBTYPE_DATE smallint,
  8376.     @DBTYPE_BSTR smallint,            @DBTYPE_BOOL smallint,
  8377.     @DBTYPE_VARNUMERIC smallint,    @DBTYPE_DECIMAL smallint,
  8378.     @DBTYPE_UI1 smallint,            @DBTYPE_BYREF smallint,
  8379.     @DBTYPE_I1 smallint,            @DBTYPE_UI2 smallint,
  8380.     @DBTYPE_UI4 smallint,            @DBTYPE_I8 smallint,
  8381.     @DBTYPE_UI8 smallint,            @DBTYPE_GUID smallint,
  8382.     @DBTYPE_BYTES smallint,            @DBTYPE_STR smallint,
  8383.     @DBTYPE_WSTR smallint,            @DBTYPE_NUMERIC smallint,
  8384.     @DBTYPE_DBDATE smallint,        @DBTYPE_DBTIME smallint,
  8385.     @DBTYPE_DBTIMESTAMP smallint
  8386.  
  8387.     select
  8388.     @DBTYPE_I2            = 2,    @DBTYPE_I4            = 3,
  8389.     @DBTYPE_R4            = 4,    @DBTYPE_R8            = 5,
  8390.     @DBTYPE_CY            = 6,    @DBTYPE_DATE        = 7,
  8391.     @DBTYPE_BSTR        = 8,    @DBTYPE_BOOL        = 11,
  8392.     @DBTYPE_VARNUMERIC    = 139,    @DBTYPE_DECIMAL        = 14,
  8393.     @DBTYPE_UI1            = 17,    @DBTYPE_BYREF        = 16384,
  8394.     @DBTYPE_I1            = 16,    @DBTYPE_UI2            = 18,
  8395.     @DBTYPE_UI4            = 19,    @DBTYPE_I8            = 20,
  8396.     @DBTYPE_UI8            = 21,    @DBTYPE_GUID        = 72,
  8397.     @DBTYPE_BYTES        = 128,    @DBTYPE_STR            = 129,
  8398.     @DBTYPE_WSTR        = 130,    @DBTYPE_NUMERIC        = 131,
  8399.     @DBTYPE_DBDATE        = 133,    @DBTYPE_DBTIME        = 134,    
  8400.     @DBTYPE_DBTIMESTAMP    = 135
  8401.  
  8402.     declare    
  8403.     @ODS_SMALLINT_NOT_NULL tinyint,    @ODS_INT_NULL tinyint,
  8404.     @ODS_INT_NOT_NULL tinyint,        @ODS_TINYINT_NOT_NULL tinyint,
  8405.     @ODS_REAL_NOT_NULL tinyint,        @ODS_FLOAT_NULL tinyint,
  8406.     @ODS_FLOAT_NOT_NULL tinyint,    @ODS_MONEY_NULL tinyint,
  8407.     @ODS_MONEY_NOT_NULL tinyint,    @ODS_DATETIME_NULL tinyint,
  8408.     @ODS_DATETIME_NOT_NULL tinyint,    @ODS_TEXT tinyint,
  8409.     @ODS_BIT tinyint,                @ODS_DECIMAL tinyint,
  8410.     @ODS_NUMERIC tinyint,            @ODS_GUID tinyint,
  8411.     @ODS_IMAGE tinyint,                @ODS_TIMESTAMP tinyint,
  8412.     @ODS_BINARY_NULL tinyint,        @ODS_BINARY_NOT_NULL tinyint,
  8413.     @ODS_VARBINARY tinyint,            @ODS_CHAR_NULL tinyint,
  8414.     @ODS_CHAR_NOT_NULL tinyint,        @ODS_VARCHAR tinyint
  8415.  
  8416.     select     
  8417.     @ODS_IMAGE = 34,            @ODS_TEXT = 35,
  8418.     @ODS_GUID = 36,                @ODS_BINARY_NULL = 37,            
  8419.     @ODS_VARBINARY = 37,        @ODS_INT_NULL = 38,
  8420.     @ODS_CHAR_NULL = 39,        @ODS_VARCHAR = 39,
  8421.     @ODS_TIMESTAMP = 45,        @ODS_BINARY_NOT_NULL = 45,
  8422.     @ODS_CHAR_NOT_NULL = 47,    @ODS_TINYINT_NOT_NULL = 48,
  8423.     @ODS_BIT = 50,                @ODS_SMALLINT_NOT_NULL = 52,    
  8424.     @ODS_INT_NOT_NULL = 56,        @ODS_REAL_NOT_NULL = 59,        
  8425.     @ODS_MONEY_NOT_NULL = 60,    @ODS_DATETIME_NOT_NULL = 61,    
  8426.     @ODS_FLOAT_NOT_NULL = 62,    @ODS_DECIMAL = 106,
  8427.     @ODS_NUMERIC = 108,            @ODS_FLOAT_NULL = 109,
  8428.     @ODS_MONEY_NULL = 110,        @ODS_DATETIME_NULL = 111
  8429.  
  8430.     declare 
  8431.     @ODBC_GUID smallint,        @ODBC_NTEXT smallint,
  8432.     @ODBC_NVARCHAR smallint,    @ODBC_NCHAR smallint,
  8433.     @ODBC_BIT smallint,            @ODBC_TINYINT smallint,
  8434.     @ODBC_IMAGE smallint,        @ODBC_VARBINARY smallint,
  8435.     @ODBC_TIMESTAMP smallint,    @ODBC_BINARY smallint,
  8436.     @ODBC_TEXT smallint,        @ODBC_CHAR smallint,
  8437.     @ODBC_NUMERIC smallint,        @ODBC_DECIMAL smallint,
  8438.     @ODBC_MONEY smallint,        @ODBC_INT smallint,        
  8439.     @ODBC_SMALLINT smallint,    @ODBC_FLOAT smallint,    
  8440.     @ODBC_REAL smallint,        @ODBC_VARCHAR smallint,
  8441.     @ODBC_DATETIME smallint
  8442.  
  8443.     select
  8444.     @ODBC_GUID        = -11,    @ODBC_NTEXT        = -10,
  8445.     @ODBC_NVARCHAR    = -9,    @ODBC_NCHAR        = -8,
  8446.     @ODBC_BIT        = -7,    @ODBC_TINYINT    = -6,
  8447.     @ODBC_IMAGE        = -4,    @ODBC_VARBINARY    = -3,
  8448.     @ODBC_TIMESTAMP    = -2,    @ODBC_BINARY    = -2,
  8449.     @ODBC_TEXT        = -1,    @ODBC_CHAR        = 1,
  8450.     @ODBC_NUMERIC    = 2,    @ODBC_DECIMAL    = 3,
  8451.     @ODBC_MONEY        = 3,    @ODBC_INT        = 4,        
  8452.     @ODBC_SMALLINT    = 5,    @ODBC_FLOAT        = 6,    
  8453.     @ODBC_REAL        = 7,    @ODBC_VARCHAR    = 12,
  8454.     @ODBC_DATETIME    =    
  8455.     case @ODBCVer
  8456.         when 2 then 11
  8457.         else 93
  8458.     end
  8459.  
  8460.     create table #tmp_columns
  8461.     (    TABLE_CAT sysname  NULL,
  8462.         TABLE_SCHEM sysname  NULL,
  8463.         TABLE_NAME sysname NOT NULL,
  8464.         COLUMN_NAME sysname  NULL,
  8465.         DATA_TYPE smallint NOT NULL,
  8466.         TYPE_NAME sysname   NULL,
  8467.         COLUMN_SIZE int NULL,
  8468.         BUFFER_LENGTH int NULL,
  8469.         DECIMAL_DIGITS smallint NULL,
  8470.         NUM_PREC_RADIX smallint NULL,
  8471.         NULLABLE smallint NOT NULL,
  8472.         REMARKS nvarchar(255)  NULL,
  8473.             COLUMN_DEF nvarchar(128)  NULL,
  8474.             SQL_DATA_TYPE smallint null,
  8475.             SQL_DATETIME_SUB smallint NULL,
  8476.         CHAR_OCTET_LENGTH int NULL,
  8477.         ORDINAL_POSITION smallint,
  8478.         IS_NULLABLE varchar(254)  NOT NULL,
  8479.         SS_DATA_TYPE tinyint null,
  8480.         COLUMN_FLAGS int NOT NULL)
  8481.  
  8482.     if ((isnull(charindex('%', @table_name),0) = 0) and
  8483.         (isnull(charindex('[', @table_name),0) = 0) and
  8484.         (isnull(charindex('_', @table_name),0) = 0))
  8485.     begin    /*    If no wild carding */
  8486.         insert into #tmp_columns
  8487.         select
  8488.             TABLE_CAT = c.TABLE_CATALOG,
  8489.             TABLE_SCHEM = c.TABLE_SCHEMA,
  8490.             TABLE_NAME = c.TABLE_NAME,
  8491.             COLUMN_NAME = c.COLUMN_NAME,
  8492.             DATA_TYPE =
  8493.             case c.DATA_TYPE & ~@DBTYPE_BYREF
  8494.                 when @DBTYPE_I2                then @ODBC_SMALLINT
  8495.                 when @DBTYPE_I4                then @ODBC_INT
  8496.                 when @DBTYPE_R4                then @ODBC_REAL
  8497.                 when @DBTYPE_R8                then @ODBC_FLOAT
  8498.                 when @DBTYPE_CY                then @ODBC_MONEY
  8499.                 when @DBTYPE_DATE            then @ODBC_DATETIME
  8500.                 when @DBTYPE_DBDATE            then @ODBC_DATETIME
  8501.                 when @DBTYPE_DBTIME            then @ODBC_DATETIME
  8502.                 when @DBTYPE_DBTIMESTAMP    then @ODBC_DATETIME
  8503.                 when @DBTYPE_BOOL            then @ODBC_BIT
  8504.                 when @DBTYPE_DECIMAL        then @ODBC_DECIMAL
  8505.                 when @DBTYPE_UI1            then @ODBC_TINYINT
  8506.                 when @DBTYPE_I1                then @ODBC_NUMERIC
  8507.                 when @DBTYPE_UI2            then @ODBC_NUMERIC
  8508.                 when @DBTYPE_UI4            then @ODBC_NUMERIC
  8509.                 when @DBTYPE_I8                then @ODBC_NUMERIC
  8510.                 when @DBTYPE_UI8            then @ODBC_NUMERIC
  8511.                 when @DBTYPE_NUMERIC        then @ODBC_NUMERIC
  8512.                 when @DBTYPE_VARNUMERIC        then @ODBC_NUMERIC
  8513.                 when @DBTYPE_GUID            then @ODBC_GUID
  8514.                 when @DBTYPE_BYTES then
  8515.                     case
  8516.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
  8517.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  8518.                                 (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  8519.                                  p.COLUMN_SIZE = 8
  8520.                             then @ODBC_TIMESTAMP
  8521.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  8522.                             then @ODBC_BINARY
  8523.                         else @ODBC_VARBINARY
  8524.                     end
  8525.                 when @DBTYPE_STR then
  8526.                     case
  8527.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
  8528.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
  8529.                         else @ODBC_VARCHAR
  8530.                     end
  8531.                 when @DBTYPE_WSTR then
  8532.                     case
  8533.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8534.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  8535.                         else @ODBC_NVARCHAR
  8536.                     end
  8537.                 when @DBTYPE_BSTR then
  8538.                     case
  8539.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8540.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  8541.                         else @ODBC_NVARCHAR
  8542.                     end
  8543.                 else @ODBC_NVARCHAR     /*    Unknown OleDB datatype */
  8544.             end,
  8545.             TYPE_NAME = p.TYPE_NAME,
  8546.             COLUMN_SIZE =
  8547.                 COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
  8548.             BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
  8549.             DECIMAL_DIGITS = c.NUMERIC_SCALE,
  8550.             NUM_PREC_RADIX = NULL,
  8551.             NULLABLE = convert(smallint, c.IS_NULLABLE),
  8552.             REMARKS = convert(nvarchar(255),c.DESCRIPTION),
  8553.             COLUMN_DEF = c.COLUMN_DEFAULT,
  8554.             SQL_DATA_TYPE = NULL,
  8555.             SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
  8556.             CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
  8557.             ORDINAL_POSITION = c.ORDINAL_POSITION,
  8558.             IS_NULLABLE =
  8559.             case c.IS_NULLABLE
  8560.                 when 1 then 'YES'
  8561.                 else 'NO'
  8562.             end,
  8563.             SS_DATA_TYPE = NULL,
  8564.             COLUMN_FLAGS = c.COLUMN_FLAGS
  8565.         from master.dbo.SYSREMOTE_COLUMNS <
  8566.                     @table_server,
  8567.                     @table_catalog,
  8568.                     NULL,
  8569.                     @table_name,
  8570.                     NULL > c,
  8571.                 master.dbo.SYSREMOTE_PROVIDER_TYPES <
  8572.                     @table_server > p
  8573.                     /* LUXOR/KAGERA don't support restricting DATA_TYPE */
  8574.             where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
  8575.                 (TABLE_SCHEMA like @table_schema
  8576.                 or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  8577.                 and (c.COLUMN_NAME like @column_name
  8578.                 or     @column_name is NULL)
  8579.     end
  8580.     else
  8581.     begin    /*    If wild carding */
  8582.         insert into #tmp_columns
  8583.         select
  8584.             TABLE_CAT = c.TABLE_CATALOG,
  8585.             TABLE_SCHEM = c.TABLE_SCHEMA,
  8586.             TABLE_NAME = c.TABLE_NAME,
  8587.             COLUMN_NAME = c.COLUMN_NAME,
  8588.             DATA_TYPE =
  8589.             case c.DATA_TYPE & ~@DBTYPE_BYREF
  8590.                 when @DBTYPE_I2                then @ODBC_SMALLINT
  8591.                 when @DBTYPE_I4                then @ODBC_INT
  8592.                 when @DBTYPE_R4                then @ODBC_REAL
  8593.                 when @DBTYPE_R8                then @ODBC_FLOAT
  8594.                 when @DBTYPE_CY                then @ODBC_MONEY
  8595.                 when @DBTYPE_DATE            then @ODBC_DATETIME
  8596.                 when @DBTYPE_DBDATE            then @ODBC_DATETIME
  8597.                 when @DBTYPE_DBTIME            then @ODBC_DATETIME
  8598.                 when @DBTYPE_DBTIMESTAMP    then @ODBC_DATETIME
  8599.                 when @DBTYPE_BOOL            then @ODBC_BIT
  8600.                 when @DBTYPE_DECIMAL        then @ODBC_DECIMAL
  8601.                 when @DBTYPE_UI1            then @ODBC_TINYINT
  8602.                 when @DBTYPE_I1                then @ODBC_NUMERIC
  8603.                 when @DBTYPE_UI2            then @ODBC_NUMERIC
  8604.                 when @DBTYPE_UI4            then @ODBC_NUMERIC
  8605.                 when @DBTYPE_I8                then @ODBC_NUMERIC
  8606.                 when @DBTYPE_UI8            then @ODBC_NUMERIC
  8607.                 when @DBTYPE_NUMERIC        then @ODBC_NUMERIC
  8608.                 when @DBTYPE_VARNUMERIC        then @ODBC_NUMERIC
  8609.                 when @DBTYPE_GUID            then @ODBC_GUID
  8610.                 when @DBTYPE_BYTES then
  8611.                     case
  8612.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
  8613.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  8614.                                 (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  8615.                                  p.COLUMN_SIZE = 8
  8616.                             then @ODBC_TIMESTAMP
  8617.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  8618.                             then @ODBC_BINARY
  8619.                         else @ODBC_VARBINARY
  8620.                     end
  8621.                 when @DBTYPE_STR then
  8622.                     case
  8623.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
  8624.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
  8625.                         else @ODBC_VARCHAR
  8626.                     end
  8627.                 when @DBTYPE_WSTR then
  8628.                     case
  8629.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8630.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  8631.                         else @ODBC_NVARCHAR
  8632.                     end
  8633.                 when @DBTYPE_BSTR then
  8634.                     case
  8635.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8636.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  8637.                         else @ODBC_NVARCHAR
  8638.                     end
  8639.                 else @ODBC_NVARCHAR     /*    Unknown OleDB datatype */
  8640.             end,
  8641.             TYPE_NAME = p.TYPE_NAME,
  8642.             COLUMN_SIZE =
  8643.                 COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
  8644.             BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
  8645.             DECIMAL_DIGITS = c.NUMERIC_SCALE,
  8646.             NUM_PREC_RADIX = NULL,
  8647.             NULLABLE = convert(smallint, c.IS_NULLABLE),
  8648.             REMARKS = convert(nvarchar(255),c.DESCRIPTION),
  8649.             COLUMN_DEF = c.COLUMN_DEFAULT,
  8650.             SQL_DATA_TYPE = NULL,
  8651.             SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
  8652.             CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
  8653.             ORDINAL_POSITION = c.ORDINAL_POSITION,
  8654.             IS_NULLABLE =
  8655.             case c.IS_NULLABLE
  8656.                 when 1 then 'YES'
  8657.                 else 'NO'
  8658.             end,
  8659.             SS_DATA_TYPE = NULL,
  8660.             COLUMN_FLAGS = c.COLUMN_FLAGS
  8661.         from master.dbo.SYSREMOTE_COLUMNS <
  8662.                     @table_server,
  8663.                     @table_catalog,
  8664.                     NULL,
  8665.                     NULL,
  8666.                     NULL > c,
  8667.                 master.dbo.SYSREMOTE_PROVIDER_TYPES <
  8668.                     @table_server > p
  8669.                     /* LUXOR/KAGERA don't support restricting DATA_TYPE */
  8670.             where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
  8671.                 (TABLE_SCHEMA like @table_schema
  8672.                 or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  8673.                 and (c.COLUMN_NAME like @column_name
  8674.                 or     @column_name is NULL)
  8675.                 and c.TABLE_NAME like @table_name
  8676.     end
  8677.  
  8678.     update #tmp_columns
  8679.     set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,
  8680.         SQL_DATETIME_SUB =
  8681.         case
  8682.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3
  8683.             else #tmp_columns.SQL_DATETIME_SUB
  8684.         end,
  8685.         TYPE_NAME = 
  8686.         case 
  8687.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  8688.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  8689.                     BUFFER_LENGTH = 8
  8690.                 then 'timestamp'
  8691.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
  8692.                     #tmp_columns.SQL_DATETIME_SUB = 0
  8693.                 then 'smalldatetime'
  8694.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and
  8695.                     #tmp_columns.COLUMN_SIZE = 10
  8696.                 then 'smallmoney'
  8697.             when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and
  8698.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or
  8699.                  #tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)
  8700.                 then spt_dt.TYPE_NAME
  8701.             else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME)
  8702.         end,
  8703.         COLUMN_SIZE =
  8704.         case
  8705.             when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */
  8706.                 spt_dt.data_precision
  8707.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
  8708.                     #tmp_columns.SQL_DATETIME_SUB = 0
  8709.                 then 16
  8710.             else #tmp_columns.COLUMN_SIZE
  8711.         end,
  8712.         BUFFER_LENGTH =
  8713.         case
  8714.             when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then    /* decimal/numeric types */
  8715.                 COLUMN_SIZE+2
  8716.             when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length
  8717.             else #tmp_columns.BUFFER_LENGTH
  8718.         end,
  8719.         DECIMAL_DIGITS =
  8720.         case
  8721.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME
  8722.                 then #tmp_columns.SQL_DATETIME_SUB
  8723.             else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)
  8724.         end,
  8725.         NUM_PREC_RADIX = spt_dt.RADIX,
  8726.         SS_DATA_TYPE = 
  8727.         case
  8728.             when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT ) 
  8729.                 and #tmp_columns.NULLABLE = 1
  8730.                     then @ODS_INT_NULL
  8731.             when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0 
  8732.                 then @ODS_TINYINT_NOT_NULL
  8733.             when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT    and #tmp_columns.NULLABLE = 0
  8734.                 then @ODS_SMALLINT_NOT_NULL
  8735.             when #tmp_columns.DATA_TYPE = @ODBC_INT  and #tmp_columns.NULLABLE = 0
  8736.                 then @ODS_INT_NOT_NULL
  8737.             when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1
  8738.                 then @ODS_FLOAT_NULL
  8739.             when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0
  8740.                 then @ODS_REAL_NOT_NULL
  8741.             when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0
  8742.                 then @ODS_FLOAT_NOT_NULL
  8743.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1 
  8744.                 then @ODS_MONEY_NULL
  8745.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0 
  8746.                 then @ODS_MONEY_NOT_NULL
  8747.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1
  8748.                 then @ODS_DATETIME_NULL
  8749.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0
  8750.                 then @ODS_DATETIME_NOT_NULL
  8751.             when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT
  8752.             when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT
  8753.             when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then  @ODS_DECIMAL    
  8754.             when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then  @ODS_NUMERIC
  8755.             when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID
  8756.             when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then  @ODS_IMAGE
  8757.             when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP
  8758.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  8759.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  8760.                     BUFFER_LENGTH = 8
  8761.                 then @ODS_TIMESTAMP
  8762.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE =    1
  8763.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  8764.                 then  @ODS_BINARY_NULL
  8765.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE =    0
  8766.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  8767.                 then @ODS_BINARY_NOT_NULL
  8768.             when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY
  8769.                 then @ODS_VARBINARY    
  8770.             when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1
  8771.                 then @ODS_CHAR_NULL
  8772.             when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0
  8773.                 then @ODS_CHAR_NOT_NULL
  8774.             when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR
  8775.             else null
  8776.         end
  8777.         from master.dbo.spt_datatype_info spt_dt
  8778.         where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE
  8779.             AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)
  8780.             and isnull(spt_dt.AUTO_INCREMENT,0) = 0
  8781.             and not spt_dt.TYPE_NAME = 'smalldatetime'
  8782.  
  8783.     select
  8784.             TABLE_CAT,            TABLE_SCHEM,        TABLE_NAME,
  8785.             COLUMN_NAME,        DATA_TYPE,            TYPE_NAME,
  8786.             COLUMN_SIZE,        BUFFER_LENGTH,        DECIMAL_DIGITS,
  8787.             NUM_PREC_RADIX,        NULLABLE,            REMARKS,
  8788.             COLUMN_DEF,            SQL_DATA_TYPE,        SQL_DATETIME_SUB,
  8789.             CHAR_OCTET_LENGTH,    ORDINAL_POSITION,    IS_NULLABLE,
  8790.             SS_DATA_TYPE
  8791.         from #tmp_columns
  8792.         order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
  8793.  
  8794.         drop table #tmp_columns
  8795.  
  8796. go
  8797. if (charindex('8.00', @@version) > 0)
  8798.     drop procedure sp_columns_ex
  8799. else
  8800. begin
  8801.     print ''
  8802.     print ''
  8803.     print 'Warning:'
  8804.     print 'you are installing the stored procedures '
  8805.     print 'on a pre 8.0 SQL Server.'
  8806.     print 'Ignore the following errors.'
  8807. end
  8808. go
  8809.  
  8810. /* 8.0 version */
  8811. raiserror(15339,-1,-1,'sp_columns_ex')
  8812. go
  8813. create procedure sp_columns_ex(
  8814.     @table_server        sysname,
  8815.     @table_name            sysname = null,
  8816.     @table_schema        sysname = null,
  8817.     @table_catalog        sysname = null,
  8818.     @column_name        sysname = null,
  8819.     @ODBCVer            int = 2)
  8820. as
  8821.  
  8822.     set nocount on
  8823.     declare
  8824.     @DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1),    @DBCOLUMNFLAGS_ISLONG    binary(1),
  8825.     @DBCOLUMNFLAGS_ISROWVER    binary(2)
  8826.  
  8827.     select
  8828.     @DBCOLUMNFLAGS_ISFIXEDLENGTH    = 0x10,    @DBCOLUMNFLAGS_ISLONG    = 0x80,
  8829.     @DBCOLUMNFLAGS_ISROWVER    = 0x0200
  8830.  
  8831.     declare    
  8832.     @DBTYPE_I2 smallint,            @DBTYPE_I4 smallint,
  8833.     @DBTYPE_R4 smallint,            @DBTYPE_R8 smallint,
  8834.     @DBTYPE_CY smallint,            @DBTYPE_DATE smallint,
  8835.     @DBTYPE_BSTR smallint,            @DBTYPE_BOOL smallint,
  8836.     @DBTYPE_VARNUMERIC smallint,    @DBTYPE_DECIMAL smallint,
  8837.     @DBTYPE_UI1 smallint,            @DBTYPE_BYREF smallint,
  8838.     @DBTYPE_I1 smallint,            @DBTYPE_UI2 smallint,
  8839.     @DBTYPE_UI4 smallint,            @DBTYPE_I8 smallint,
  8840.     @DBTYPE_UI8 smallint,            @DBTYPE_GUID smallint,
  8841.     @DBTYPE_BYTES smallint,            @DBTYPE_STR smallint,
  8842.     @DBTYPE_WSTR smallint,            @DBTYPE_NUMERIC smallint,
  8843.     @DBTYPE_DBDATE smallint,        @DBTYPE_DBTIME smallint,
  8844.     @DBTYPE_DBTIMESTAMP smallint
  8845.  
  8846.     select
  8847.     @DBTYPE_I2            = 2,    @DBTYPE_I4            = 3,
  8848.     @DBTYPE_R4            = 4,    @DBTYPE_R8            = 5,
  8849.     @DBTYPE_CY            = 6,    @DBTYPE_DATE        = 7,
  8850.     @DBTYPE_BSTR        = 8,    @DBTYPE_BOOL        = 11,
  8851.     @DBTYPE_VARNUMERIC    = 139,    @DBTYPE_DECIMAL        = 14,
  8852.     @DBTYPE_UI1            = 17,    @DBTYPE_BYREF        = 16384,
  8853.     @DBTYPE_I1            = 16,    @DBTYPE_UI2            = 18,
  8854.     @DBTYPE_UI4            = 19,    @DBTYPE_I8            = 20,
  8855.     @DBTYPE_UI8            = 21,    @DBTYPE_GUID        = 72,
  8856.     @DBTYPE_BYTES        = 128,    @DBTYPE_STR            = 129,
  8857.     @DBTYPE_WSTR        = 130,    @DBTYPE_NUMERIC        = 131,
  8858.     @DBTYPE_DBDATE        = 133,    @DBTYPE_DBTIME        = 134,    
  8859.     @DBTYPE_DBTIMESTAMP    = 135
  8860.  
  8861.     declare    
  8862.     @ODS_SMALLINT_NOT_NULL tinyint,    @ODS_INT_NULL tinyint,
  8863.     @ODS_INT_NOT_NULL tinyint,        @ODS_TINYINT_NOT_NULL tinyint,
  8864.     @ODS_REAL_NOT_NULL tinyint,        @ODS_FLOAT_NULL tinyint,
  8865.     @ODS_FLOAT_NOT_NULL tinyint,    @ODS_MONEY_NULL tinyint,
  8866.     @ODS_MONEY_NOT_NULL tinyint,    @ODS_DATETIME_NULL tinyint,
  8867.     @ODS_DATETIME_NOT_NULL tinyint,    @ODS_TEXT tinyint,
  8868.     @ODS_BIT tinyint,                @ODS_DECIMAL tinyint,
  8869.     @ODS_NUMERIC tinyint,            @ODS_GUID tinyint,
  8870.     @ODS_IMAGE tinyint,                @ODS_TIMESTAMP tinyint,
  8871.     @ODS_BINARY_NULL tinyint,        @ODS_BINARY_NOT_NULL tinyint,
  8872.     @ODS_VARBINARY tinyint,            @ODS_CHAR_NULL tinyint,
  8873.     @ODS_CHAR_NOT_NULL tinyint,        @ODS_VARCHAR tinyint
  8874.  
  8875.     select     
  8876.     @ODS_IMAGE = 34,            @ODS_TEXT = 35,
  8877.     @ODS_GUID = 36,                @ODS_BINARY_NULL = 37,            
  8878.     @ODS_VARBINARY = 37,        @ODS_INT_NULL = 38,
  8879.     @ODS_CHAR_NULL = 39,        @ODS_VARCHAR = 39,
  8880.     @ODS_TIMESTAMP = 45,        @ODS_BINARY_NOT_NULL = 45,
  8881.     @ODS_CHAR_NOT_NULL = 47,    @ODS_TINYINT_NOT_NULL = 48,
  8882.     @ODS_BIT = 50,                @ODS_SMALLINT_NOT_NULL = 52,    
  8883.     @ODS_INT_NOT_NULL = 56,        @ODS_REAL_NOT_NULL = 59,        
  8884.     @ODS_MONEY_NOT_NULL = 60,    @ODS_DATETIME_NOT_NULL = 61,    
  8885.     @ODS_FLOAT_NOT_NULL = 62,    @ODS_DECIMAL = 106,
  8886.     @ODS_NUMERIC = 108,            @ODS_FLOAT_NULL = 109,
  8887.     @ODS_MONEY_NULL = 110,        @ODS_DATETIME_NULL = 111
  8888.  
  8889.     declare 
  8890.     @ODBC_GUID smallint,        @ODBC_NTEXT smallint,
  8891.     @ODBC_NVARCHAR smallint,    @ODBC_NCHAR smallint,
  8892.     @ODBC_BIT smallint,            @ODBC_TINYINT smallint,
  8893.     @ODBC_IMAGE smallint,        @ODBC_VARBINARY smallint,
  8894.     @ODBC_TIMESTAMP smallint,    @ODBC_BINARY smallint,
  8895.     @ODBC_TEXT smallint,        @ODBC_CHAR smallint,
  8896.     @ODBC_NUMERIC smallint,        @ODBC_DECIMAL smallint,
  8897.     @ODBC_MONEY smallint,        @ODBC_INT smallint,        
  8898.     @ODBC_SMALLINT smallint,    @ODBC_FLOAT smallint,    
  8899.     @ODBC_REAL smallint,        @ODBC_VARCHAR smallint,
  8900.     @ODBC_DATETIME smallint
  8901.  
  8902.     select
  8903.     @ODBC_GUID        = -11,    @ODBC_NTEXT        = -10,
  8904.     @ODBC_NVARCHAR    = -9,    @ODBC_NCHAR        = -8,
  8905.     @ODBC_BIT        = -7,    @ODBC_TINYINT    = -6,
  8906.     @ODBC_IMAGE        = -4,    @ODBC_VARBINARY    = -3,
  8907.     @ODBC_TIMESTAMP    = -2,    @ODBC_BINARY    = -2,
  8908.     @ODBC_TEXT        = -1,    @ODBC_CHAR        = 1,
  8909.     @ODBC_NUMERIC    = 2,    @ODBC_DECIMAL    = 3,
  8910.     @ODBC_MONEY        = 3,    @ODBC_INT        = 4,        
  8911.     @ODBC_SMALLINT    = 5,    @ODBC_FLOAT        = 6,    
  8912.     @ODBC_REAL        = 7,    @ODBC_VARCHAR    = 12,
  8913.     @ODBC_DATETIME    =    
  8914.     case @ODBCVer
  8915.         when 2 then 11
  8916.         else 93
  8917.     end
  8918.  
  8919.     create table #tmp_columns
  8920.     (    TABLE_CAT sysname collate database_default NULL,
  8921.         TABLE_SCHEM sysname collate database_default NULL,
  8922.         TABLE_NAME sysname    collate database_default NOT NULL,
  8923.         COLUMN_NAME sysname collate database_default NULL,
  8924.         DATA_TYPE smallint NOT NULL,
  8925.         TYPE_NAME sysname  collate database_default NULL,
  8926.         COLUMN_SIZE int NULL,
  8927.         BUFFER_LENGTH int NULL,
  8928.         DECIMAL_DIGITS smallint NULL,
  8929.         NUM_PREC_RADIX smallint NULL,
  8930.         NULLABLE smallint NOT NULL,
  8931.         REMARKS nvarchar(255) collate database_default NULL,
  8932.             COLUMN_DEF nvarchar(128) collate database_default NULL,
  8933.             SQL_DATA_TYPE smallint null,
  8934.             SQL_DATETIME_SUB smallint NULL,
  8935.         CHAR_OCTET_LENGTH int NULL,
  8936.         ORDINAL_POSITION smallint,
  8937.         IS_NULLABLE varchar(254) collate database_default NOT NULL,
  8938.         SS_DATA_TYPE tinyint null,
  8939.         COLUMN_FLAGS int NOT NULL)
  8940.  
  8941.     if ((isnull(charindex('%', @table_name),0) = 0) and
  8942.         (isnull(charindex('[', @table_name),0) = 0) and
  8943.         (isnull(charindex('_', @table_name),0) = 0))
  8944.     begin    /*    If no wild carding */
  8945.         insert into #tmp_columns
  8946.         select
  8947.             TABLE_CAT = c.TABLE_CATALOG,
  8948.             TABLE_SCHEM = c.TABLE_SCHEMA,
  8949.             TABLE_NAME = c.TABLE_NAME,
  8950.             COLUMN_NAME = c.COLUMN_NAME,
  8951.             DATA_TYPE =
  8952.             case c.DATA_TYPE & ~@DBTYPE_BYREF
  8953.                 when @DBTYPE_I2                then @ODBC_SMALLINT
  8954.                 when @DBTYPE_I4                then @ODBC_INT
  8955.                 when @DBTYPE_R4                then @ODBC_REAL
  8956.                 when @DBTYPE_R8                then @ODBC_FLOAT
  8957.                 when @DBTYPE_CY                then @ODBC_MONEY
  8958.                 when @DBTYPE_DATE            then @ODBC_DATETIME
  8959.                 when @DBTYPE_DBDATE            then @ODBC_DATETIME
  8960.                 when @DBTYPE_DBTIME            then @ODBC_DATETIME
  8961.                 when @DBTYPE_DBTIMESTAMP    then @ODBC_DATETIME
  8962.                 when @DBTYPE_BOOL            then @ODBC_BIT
  8963.                 when @DBTYPE_DECIMAL        then @ODBC_DECIMAL
  8964.                 when @DBTYPE_UI1            then @ODBC_TINYINT
  8965.                 when @DBTYPE_I1                then @ODBC_NUMERIC
  8966.                 when @DBTYPE_UI2            then @ODBC_NUMERIC
  8967.                 when @DBTYPE_UI4            then @ODBC_NUMERIC
  8968.                 when @DBTYPE_I8                then @ODBC_NUMERIC
  8969.                 when @DBTYPE_UI8            then @ODBC_NUMERIC
  8970.                 when @DBTYPE_NUMERIC        then @ODBC_NUMERIC
  8971.                 when @DBTYPE_VARNUMERIC        then @ODBC_NUMERIC
  8972.                 when @DBTYPE_GUID            then @ODBC_GUID
  8973.                 when @DBTYPE_BYTES then
  8974.                     case
  8975.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
  8976.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  8977.                                 (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  8978.                                  p.COLUMN_SIZE = 8
  8979.                             then @ODBC_TIMESTAMP
  8980.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  8981.                             then @ODBC_BINARY
  8982.                         else @ODBC_VARBINARY
  8983.                     end
  8984.                 when @DBTYPE_STR then
  8985.                     case
  8986.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
  8987.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
  8988.                         else @ODBC_VARCHAR
  8989.                     end
  8990.                 when @DBTYPE_WSTR then
  8991.                     case
  8992.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8993.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  8994.                         else @ODBC_NVARCHAR
  8995.                     end
  8996.                 when @DBTYPE_BSTR then
  8997.                     case
  8998.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  8999.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  9000.                         else @ODBC_NVARCHAR
  9001.                     end
  9002.                 else @ODBC_NVARCHAR     /*    Unknown OleDB datatype */
  9003.             end,
  9004.             TYPE_NAME = p.TYPE_NAME,
  9005.             COLUMN_SIZE =
  9006.                 COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
  9007.             BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
  9008.             DECIMAL_DIGITS = c.NUMERIC_SCALE,
  9009.             NUM_PREC_RADIX = NULL,
  9010.             NULLABLE = convert(smallint, c.IS_NULLABLE),
  9011.             REMARKS = convert(nvarchar(255),c.DESCRIPTION),
  9012.             COLUMN_DEF = c.COLUMN_DEFAULT,
  9013.             SQL_DATA_TYPE = NULL,
  9014.             SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
  9015.             CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
  9016.             ORDINAL_POSITION = c.ORDINAL_POSITION,
  9017.             IS_NULLABLE =
  9018.             case c.IS_NULLABLE
  9019.                 when 1 then 'YES'
  9020.                 else 'NO'
  9021.             end,
  9022.             SS_DATA_TYPE = NULL,
  9023.             COLUMN_FLAGS = c.COLUMN_FLAGS
  9024.         from master.dbo.SYSREMOTE_COLUMNS <
  9025.                     @table_server,
  9026.                     @table_catalog,
  9027.                     NULL,
  9028.                     @table_name,
  9029.                     NULL > c,
  9030.                 master.dbo.SYSREMOTE_PROVIDER_TYPES <
  9031.                     @table_server > p
  9032.                     /* LUXOR/KAGERA don't support restricting DATA_TYPE */
  9033.             where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
  9034.                 (TABLE_SCHEMA like @table_schema
  9035.                 or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  9036.                 and (c.COLUMN_NAME like @column_name
  9037.                 or     @column_name is NULL)
  9038.     end
  9039.     else
  9040.     begin    /*    If wild carding */
  9041.         insert into #tmp_columns
  9042.         select
  9043.             TABLE_CAT = c.TABLE_CATALOG,
  9044.             TABLE_SCHEM = c.TABLE_SCHEMA,
  9045.             TABLE_NAME = c.TABLE_NAME,
  9046.             COLUMN_NAME = c.COLUMN_NAME,
  9047.             DATA_TYPE =
  9048.             case c.DATA_TYPE & ~@DBTYPE_BYREF
  9049.                 when @DBTYPE_I2                then @ODBC_SMALLINT
  9050.                 when @DBTYPE_I4                then @ODBC_INT
  9051.                 when @DBTYPE_R4                then @ODBC_REAL
  9052.                 when @DBTYPE_R8                then @ODBC_FLOAT
  9053.                 when @DBTYPE_CY                then @ODBC_MONEY
  9054.                 when @DBTYPE_DATE            then @ODBC_DATETIME
  9055.                 when @DBTYPE_DBDATE            then @ODBC_DATETIME
  9056.                 when @DBTYPE_DBTIME            then @ODBC_DATETIME
  9057.                 when @DBTYPE_DBTIMESTAMP    then @ODBC_DATETIME
  9058.                 when @DBTYPE_BOOL            then @ODBC_BIT
  9059.                 when @DBTYPE_DECIMAL        then @ODBC_DECIMAL
  9060.                 when @DBTYPE_UI1            then @ODBC_TINYINT
  9061.                 when @DBTYPE_I1                then @ODBC_NUMERIC
  9062.                 when @DBTYPE_UI2            then @ODBC_NUMERIC
  9063.                 when @DBTYPE_UI4            then @ODBC_NUMERIC
  9064.                 when @DBTYPE_I8                then @ODBC_NUMERIC
  9065.                 when @DBTYPE_UI8            then @ODBC_NUMERIC
  9066.                 when @DBTYPE_NUMERIC        then @ODBC_NUMERIC
  9067.                 when @DBTYPE_VARNUMERIC        then @ODBC_NUMERIC
  9068.                 when @DBTYPE_GUID            then @ODBC_GUID
  9069.                 when @DBTYPE_BYTES then
  9070.                     case
  9071.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
  9072.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  9073.                                 (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  9074.                                  p.COLUMN_SIZE = 8
  9075.                             then @ODBC_TIMESTAMP
  9076.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  9077.                             then @ODBC_BINARY
  9078.                         else @ODBC_VARBINARY
  9079.                     end
  9080.                 when @DBTYPE_STR then
  9081.                     case
  9082.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
  9083.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
  9084.                         else @ODBC_VARCHAR
  9085.                     end
  9086.                 when @DBTYPE_WSTR then
  9087.                     case
  9088.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  9089.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  9090.                         else @ODBC_NVARCHAR
  9091.                     end
  9092.                 when @DBTYPE_BSTR then
  9093.                     case
  9094.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
  9095.                         when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
  9096.                         else @ODBC_NVARCHAR
  9097.                     end
  9098.                 else @ODBC_NVARCHAR     /*    Unknown OleDB datatype */
  9099.             end,
  9100.             TYPE_NAME = p.TYPE_NAME,
  9101.             COLUMN_SIZE =
  9102.                 COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
  9103.             BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
  9104.             DECIMAL_DIGITS = c.NUMERIC_SCALE,
  9105.             NUM_PREC_RADIX = NULL,
  9106.             NULLABLE = convert(smallint, c.IS_NULLABLE),
  9107.             REMARKS = convert(nvarchar(255),c.DESCRIPTION),
  9108.             COLUMN_DEF = c.COLUMN_DEFAULT,
  9109.             SQL_DATA_TYPE = NULL,
  9110.             SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
  9111.             CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
  9112.             ORDINAL_POSITION = c.ORDINAL_POSITION,
  9113.             IS_NULLABLE =
  9114.             case c.IS_NULLABLE
  9115.                 when 1 then 'YES'
  9116.                 else 'NO'
  9117.             end,
  9118.             SS_DATA_TYPE = NULL,
  9119.             COLUMN_FLAGS = c.COLUMN_FLAGS
  9120.         from master.dbo.SYSREMOTE_COLUMNS <
  9121.                     @table_server,
  9122.                     @table_catalog,
  9123.                     NULL,
  9124.                     NULL,
  9125.                     NULL > c,
  9126.                 master.dbo.SYSREMOTE_PROVIDER_TYPES <
  9127.                     @table_server > p
  9128.                     /* LUXOR/KAGERA don't support restricting DATA_TYPE */
  9129.             where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
  9130.                 (TABLE_SCHEMA like @table_schema
  9131.                 or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  9132.                 and (c.COLUMN_NAME like @column_name
  9133.                 or     @column_name is NULL)
  9134.                 and c.TABLE_NAME like @table_name
  9135.     end
  9136.  
  9137.     update #tmp_columns
  9138.     set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,
  9139.         SQL_DATETIME_SUB =
  9140.         case
  9141.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3
  9142.             else #tmp_columns.SQL_DATETIME_SUB
  9143.         end,
  9144.         TYPE_NAME = 
  9145.         case 
  9146.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  9147.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  9148.                     BUFFER_LENGTH = 8
  9149.                 then 'timestamp'
  9150.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
  9151.                     #tmp_columns.SQL_DATETIME_SUB = 0
  9152.                 then 'smalldatetime'
  9153.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and
  9154.                     #tmp_columns.COLUMN_SIZE = 10
  9155.                 then 'smallmoney'
  9156.             when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and
  9157.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or
  9158.                  #tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)
  9159.                 then spt_dt.TYPE_NAME collate database_default
  9160.             else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME collate database_default)
  9161.         end,
  9162.         COLUMN_SIZE =
  9163.         case
  9164.             when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */
  9165.                 spt_dt.data_precision
  9166.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
  9167.                     #tmp_columns.SQL_DATETIME_SUB = 0
  9168.                 then 16
  9169.             else #tmp_columns.COLUMN_SIZE
  9170.         end,
  9171.         BUFFER_LENGTH =
  9172.         case
  9173.             when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then    /* decimal/numeric types */
  9174.                 COLUMN_SIZE+2
  9175.             when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length
  9176.             else #tmp_columns.BUFFER_LENGTH
  9177.         end,
  9178.         DECIMAL_DIGITS =
  9179.         case
  9180.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME
  9181.                 then #tmp_columns.SQL_DATETIME_SUB
  9182.             else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)
  9183.         end,
  9184.         NUM_PREC_RADIX = spt_dt.RADIX,
  9185.         SS_DATA_TYPE = 
  9186.         case
  9187.             when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT ) 
  9188.                 and #tmp_columns.NULLABLE = 1
  9189.                     then @ODS_INT_NULL
  9190.             when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0 
  9191.                 then @ODS_TINYINT_NOT_NULL
  9192.             when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT    and #tmp_columns.NULLABLE = 0
  9193.                 then @ODS_SMALLINT_NOT_NULL
  9194.             when #tmp_columns.DATA_TYPE = @ODBC_INT  and #tmp_columns.NULLABLE = 0
  9195.                 then @ODS_INT_NOT_NULL
  9196.             when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1
  9197.                 then @ODS_FLOAT_NULL
  9198.             when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0
  9199.                 then @ODS_REAL_NOT_NULL
  9200.             when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0
  9201.                 then @ODS_FLOAT_NOT_NULL
  9202.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1 
  9203.                 then @ODS_MONEY_NULL
  9204.             when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0 
  9205.                 then @ODS_MONEY_NOT_NULL
  9206.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1
  9207.                 then @ODS_DATETIME_NULL
  9208.             when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0
  9209.                 then @ODS_DATETIME_NOT_NULL
  9210.             when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT
  9211.             when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT
  9212.             when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then  @ODS_DECIMAL    
  9213.             when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then  @ODS_NUMERIC
  9214.             when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID
  9215.             when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then  @ODS_IMAGE
  9216.             when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP
  9217.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
  9218.                     (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
  9219.                     BUFFER_LENGTH = 8
  9220.                 then @ODS_TIMESTAMP
  9221.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE =    1
  9222.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  9223.                 then  @ODS_BINARY_NULL
  9224.             when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE =    0
  9225.                 and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
  9226.                 then @ODS_BINARY_NOT_NULL
  9227.             when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY
  9228.                 then @ODS_VARBINARY    
  9229.             when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1
  9230.                 then @ODS_CHAR_NULL
  9231.             when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0
  9232.                 then @ODS_CHAR_NOT_NULL
  9233.             when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR
  9234.             else null
  9235.         end
  9236.         from master.dbo.spt_datatype_info spt_dt
  9237.         where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE
  9238.             AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)
  9239.             and isnull(spt_dt.AUTO_INCREMENT,0) = 0
  9240.             and not spt_dt.TYPE_NAME = 'smalldatetime'
  9241.  
  9242.     select
  9243.             TABLE_CAT,            TABLE_SCHEM,        TABLE_NAME,
  9244.             COLUMN_NAME,        DATA_TYPE,            TYPE_NAME,
  9245.             COLUMN_SIZE,        BUFFER_LENGTH,        DECIMAL_DIGITS,
  9246.             NUM_PREC_RADIX,        NULLABLE,            REMARKS,
  9247.             COLUMN_DEF,            SQL_DATA_TYPE,        SQL_DATETIME_SUB,
  9248.             CHAR_OCTET_LENGTH,    ORDINAL_POSITION,    IS_NULLABLE,
  9249.             SS_DATA_TYPE
  9250.         from #tmp_columns
  9251.         order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
  9252.  
  9253.         drop table #tmp_columns
  9254.  
  9255. go
  9256. grant execute on sp_columns_ex to public
  9257. go
  9258.  
  9259.  
  9260. if object_id('sp_table_privileges_ex', 'P') is not null
  9261.     drop proc sp_table_privileges_ex
  9262. go
  9263. raiserror(15339,-1,-1,'sp_table_privileges_ex')
  9264. go
  9265. create procedure sp_table_privileges_ex(
  9266.     @table_server        sysname,
  9267.     @table_name            sysname = null,
  9268.     @table_schema        sysname = null,
  9269.     @table_catalog        sysname = null)
  9270. as
  9271.     select
  9272.         TABLE_CAT = TABLE_CATALOG,
  9273.         TABLE_SCHEM = TABLE_SCHEMA,
  9274.         TABLE_NAME = TABLE_NAME,
  9275.         GRANTOR = GRANTOR,
  9276.         GRANTEE = GRANTEE,
  9277.         PRIVILEGE = PRIVILEGE_TYPE,
  9278.         IS_GRANTABLE = 
  9279.         case IS_GRANTABLE
  9280.             when 1 then 'YES'
  9281.             when 0 then 'NO'
  9282.             else null
  9283.         end
  9284.     from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
  9285.                 @table_server,
  9286.                 @table_catalog,
  9287.                 NULL,
  9288.                 NULL >
  9289.     where (TABLE_SCHEMA like @table_schema
  9290.         or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
  9291.         and (TABLE_NAME like @table_name
  9292.         or     @table_name is NULL)
  9293.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, PRIVILEGE
  9294. go
  9295. grant execute on sp_table_privileges_ex to public
  9296. go
  9297.  
  9298.  
  9299. if object_id('sp_column_privileges_ex', 'P') is not null
  9300.     drop proc sp_column_privileges_ex
  9301. go
  9302. raiserror(15339,-1,-1,'sp_column_privileges_ex')
  9303. go
  9304. create procedure sp_column_privileges_ex(
  9305.     @table_server        sysname,
  9306.     @table_name            sysname = null,
  9307.     @table_schema        sysname = null,
  9308.     @table_catalog        sysname = null,
  9309.     @column_name        sysname = null)
  9310. as
  9311.     select
  9312.         TABLE_CAT = TABLE_CATALOG,
  9313.         TABLE_SCHEM = TABLE_SCHEMA,
  9314.         TABLE_NAME = TABLE_NAME,
  9315.         COLUMN_NAME = COLUMN_NAME,
  9316.         GRANTOR = GRANTOR,
  9317.         GRANTEE = GRANTEE,
  9318.         PRIVILEGE = PRIVILEGE_TYPE,
  9319.         IS_GRANTABLE = 
  9320.         case IS_GRANTABLE
  9321.             when 1 then 'YES'
  9322.             when 0 then 'NO'
  9323.             else null
  9324.         end
  9325.     from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
  9326.         @table_server,
  9327.         @table_catalog,
  9328.         @table_schema,
  9329.         @table_name,
  9330.         NULL >
  9331.     where (COLUMN_NAME like @column_name
  9332.         or @column_name is NULL)
  9333.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE
  9334. go
  9335. grant execute on sp_column_privileges_ex to public
  9336. go
  9337.  
  9338.  
  9339. if object_id('sp_indexes', 'P') is not null
  9340.     drop proc sp_indexes
  9341. go
  9342. raiserror(15339,-1,-1,'sp_indexes')
  9343. go
  9344. create procedure sp_indexes(
  9345.     @table_server        sysname,
  9346.     @table_name            sysname = null,
  9347.     @table_schema        sysname = null,
  9348.     @table_catalog        sysname = null,
  9349.     @index_name            sysname = null,
  9350.     @is_unique          bit = null)
  9351. as
  9352.     select
  9353.         TABLE_CAT = TABLE_CATALOG,
  9354.         TABLE_SCHEM = TABLE_SCHEMA,
  9355.         TABLE_NAME = TABLE_NAME,
  9356.             NON_UNIQUE = convert(smallint, 1 - [UNIQUE]),
  9357.         INDEX_QUALIFIER = TABLE_NAME,
  9358.         INDEX_NAME = INDEX_NAME,
  9359.             TYPE =
  9360.         case [CLUSTERED]
  9361.             when 1 then 1
  9362.             else 3
  9363.         end,
  9364.         ORDINAL_POSITION = ORDINAL_POSITION,
  9365.             COLUMN_NAME = COLUMN_NAME,
  9366.         ASC_OR_DESC = 
  9367.         case [COLLATION]
  9368.             when 1 then 'A'
  9369.             when 2 then 'D'
  9370.             else null
  9371.         end,
  9372.             CARDINALITY = CARDINALITY,
  9373.         PAGES = 
  9374.         case [CLUSTERED]
  9375.             when 1 then PAGES
  9376.             else NULL
  9377.         end,
  9378.             FILTER_CONDITION = FILTER_CONDITION
  9379.     from master.dbo.SYSREMOTE_INDEXES <
  9380.                 @table_server,
  9381.                 @table_catalog,
  9382.                 @table_schema,
  9383.                         @index_name,
  9384.                 NULL,            /* TYPE (index type) */
  9385.                 @table_name >
  9386.     where @is_unique is null or @is_unique = [UNIQUE]
  9387.     order by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME, ORDINAL_POSITION
  9388. go
  9389. grant execute on sp_indexes to public
  9390. go
  9391.  
  9392.  
  9393. if object_id('sp_foreignkeys', 'P') is not null
  9394.     drop proc sp_foreignkeys
  9395. go
  9396. raiserror(15339,-1,-1,'sp_foreignkeys')
  9397. go
  9398. create procedure sp_foreignkeys(
  9399.     @table_server        sysname,
  9400.     @pktab_name         sysname = null,
  9401.     @pktab_schema       sysname = null,
  9402.     @pktab_catalog      sysname = null,
  9403.     @fktab_name         sysname = null,
  9404.     @fktab_schema       sysname = null,
  9405.     @fktab_catalog      sysname = null)
  9406. as
  9407.     select
  9408.         PKTABLE_CAT = PK_TABLE_CATALOG,
  9409.         PKTABLE_SCHEM = PK_TABLE_SCHEMA,
  9410.         PKTABLE_NAME = PK_TABLE_NAME,
  9411.         PKCOLUMN_NAME = PK_COLUMN_NAME,
  9412.         FKTABLE_CAT = FK_TABLE_CATALOG,
  9413.         FKTABLE_SCHEM = FK_TABLE_SCHEMA,
  9414.         FKTABLE_NAME = FK_TABLE_NAME,
  9415.         FKCOLUMN_NAME = FK_COLUMN_NAME,
  9416.         KEY_SEQ = ORDINAL,
  9417.         UPDATE_RULE = 
  9418.         case UPDATE_RULE
  9419.             when 'CASCADE' then 0
  9420.             when 'NO ACTION' then 1
  9421.             when 'SET NULL' then 2
  9422.             else null
  9423.         end,
  9424.         DELETE_RULE = 
  9425.         case DELETE_RULE
  9426.             when 'CASCADE' then 0
  9427.             when 'NO ACTION' then 1
  9428.             when 'SET NULL' then 2
  9429.             else null
  9430.         end,
  9431.         FK_NAME = convert(sysname, NULL),
  9432.         PK_NAME = convert(sysname, NULL),
  9433.         DEFERRABILITY = convert(smallint, null)
  9434.  
  9435.     from master.dbo.SYSREMOTE_FOREIGN_KEYS <
  9436.                 @table_server,
  9437.                 @pktab_catalog,
  9438.                 @pktab_schema,
  9439.                 @pktab_name,
  9440.                 @fktab_catalog,
  9441.                 @fktab_schema,
  9442.                 @fktab_name >
  9443.     order by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, KEY_SEQ
  9444. go
  9445. grant execute on sp_foreignkeys to public
  9446. go
  9447.  
  9448.  
  9449. if object_id('sp_primarykeys', 'P') is not null
  9450.     drop proc sp_primarykeys
  9451. go
  9452. raiserror(15339,-1,-1,'sp_primarykeys')
  9453. go
  9454. create procedure sp_primarykeys(
  9455.     @table_server        sysname,
  9456.     @table_name         sysname = null,
  9457.     @table_schema       sysname = null,
  9458.     @table_catalog      sysname = null)
  9459. as
  9460.     select
  9461.         TABLE_CAT = TABLE_CATALOG,
  9462.         TABLE_SCHEM = TABLE_SCHEMA,
  9463.         TABLE_NAME = TABLE_NAME,
  9464.         COLUMN_NAME = COLUMN_NAME,
  9465.         KEY_SEQ = ORDINAL,
  9466.         PK_NAME = convert(sysname, NULL)
  9467.     from master.dbo.SYSREMOTE_PRIMARY_KEYS <
  9468.                 @table_server,
  9469.                 @table_catalog,
  9470.                 @table_schema,
  9471.                 @table_name >
  9472.     order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, KEY_SEQ
  9473. go
  9474. grant execute on sp_primarykeys to public
  9475. go
  9476.  
  9477. /*-------------- END CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/
  9478.  
  9479.  
  9480. dump tran master with no_log
  9481. go
  9482.  
  9483. if (charindex('6.50', @@version) = 0 and
  9484.     charindex('7.00', @@version) = 0 and
  9485.     charindex('8.00', @@version) = 0)
  9486. begin
  9487.     print ''
  9488.     print ''
  9489.     print 'Warning:'
  9490.     print 'you are installing the stored procedures '
  9491.     print 'on a pre 6.50 SQL Server.'
  9492.     print 'Ignore the following errors.'
  9493. end
  9494.  
  9495. print 'creating sp_ddopen'
  9496. go
  9497.  
  9498. /*    Procedure for pre-6.50 server */
  9499. create procedure sp_ddopen(
  9500.                @handle            int output,
  9501.                @procname        sysname,
  9502.                @scrollopt        int output,
  9503.                @ccopt            int output,
  9504.                @rows            int output,
  9505.                @p1                varchar(255) = null,
  9506.                @p2                varchar(255) = null,
  9507.                @p3                varchar(255) = null,
  9508.                @p4                varchar(255) = null,
  9509.                @p5                varchar(255) = null,
  9510.                @p6                varchar(255) = null,
  9511.                @p7                int = null,
  9512.                @ODBCVer         int = 2)
  9513. as
  9514.     set nocount on
  9515.     declare @ret int
  9516.  
  9517.     if @procname = 'sp_column_privileges'
  9518.     begin
  9519.         create table #spcolpriv (
  9520.             TABLE_QUALIFIER varchar(32) null,
  9521.             TABLE_OWNER varchar(32) null,
  9522.             TABLE_NAME varchar(32)    not null,
  9523.             COLUMN_NAME varchar(32) not null,
  9524.             GRANTOR varchar(32) null,
  9525.             GRANTEE varchar(32) not null,
  9526.             PRIVILEGE varchar(32) not null,
  9527.             IS_GRANTABLE varchar(3) null
  9528.             )
  9529.         insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
  9530.         exec @ret = sp_cursoropen @handle output,
  9531.             'select * from #spcolpriv',
  9532.             @scrollopt output, @ccopt output, @rows output
  9533.         drop table #spcolpriv
  9534.     end
  9535.     else if @procname = 'sp_columns'
  9536.     begin
  9537.         create table #spcolumns (
  9538.             TABLE_QUALIFIER varchar(32) null,
  9539.             TABLE_OWNER varchar(32) null,
  9540.             TABLE_NAME varchar(32)    not null,
  9541.             COLUMN_NAME varchar(32) not null,
  9542.             DATA_TYPE smallint not null,
  9543.             TYPE_NAME varchar(32) not null,
  9544.             "PRECISION" int null,
  9545.             LENGTH int null,
  9546.             SCALE smallint null,
  9547.             RADIX smallint null,
  9548.             NULLABLE smallint not null,
  9549.             REMARKS varchar(254) null,
  9550.             COLUMN_DEF varchar(255) null,
  9551.             SQL_DATA_TYPE smallint not null,
  9552.             SQL_DATETIME_SUB smallint null,
  9553.             CHAR_OCTET_LENGTH int null,
  9554.             ORDINAL_POSITION int not null,
  9555.             IS_NULLABLE varchar(254) null,
  9556.             SS_DATA_TYPE tinyint null
  9557.             )
  9558.         insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
  9559.         exec @ret = sp_cursoropen @handle output,
  9560.             'select * from #spcolumns',
  9561.             @scrollopt output, @ccopt output, @rows output
  9562.         drop table #spcolumns
  9563.     end
  9564.     else if @procname = 'sp_datatype_info'
  9565.     begin
  9566.         create table #spdatatypeinfo (
  9567.             TYPE_NAME            varchar(32)  not null,
  9568.             DATA_TYPE            smallint not null,
  9569.             "PRECISION"            int null,
  9570.             LITERAL_PREFIX        varchar(32)    null,
  9571.             LITERAL_SUFFIX        varchar(32)    null,
  9572.             CREATE_PARAMS        varchar(32)    null,
  9573.             NULLABLE            smallint   not null,
  9574.             CASE_SENSITIVE        smallint   not null,
  9575.             SEARCHABLE            smallint   not null,
  9576.             UNSIGNED_ATTRIBUTE    smallint   null,
  9577.             MONEY    smallint    not null,
  9578.             AUTO_INCREMENT        smallint    null,
  9579.             LOCAL_TYPE_NAME     varchar(32) null,
  9580.             MINIMUM_SCALE        smallint     null,
  9581.             MAXIMUM_SCALE        smallint   null,
  9582.             SQL_DATA_TYPE        smallint      not null,
  9583.             SQL_DATETIME_SUB    smallint   null,
  9584.             NUM_PREC_RADIX        int     null,
  9585.             INTERVAL_PRECISION    smallint    NULL,
  9586.             USERTYPE            smallint not null)
  9587.         insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
  9588.         exec @ret = sp_cursoropen @handle output,
  9589.             'select * from #spdatatypeinfo',
  9590.             @scrollopt output, @ccopt output, @rows output
  9591.         drop table #spdatatypeinfo
  9592.     end
  9593.     else if @procname = 'sp_fkeys'
  9594.     begin
  9595.         create table #spfkeys (
  9596.             PKTABLE_QUALIFIER varchar(32)     null,
  9597.             PKTABLE_OWNER varchar(32)    null,
  9598.             PKTABLE_NAME varchar(32)  not null,
  9599.             PKCOLUMN_NAME varchar(32)    not null,
  9600.             FKTABLE_QUALIFIER varchar(32)    null,
  9601.             FKTABLE_OWNER varchar(32)    null,
  9602.             FKTABLE_NAME varchar(32)  not null,
  9603.             FKCOLUMN_NAME varchar(32)    not null,
  9604.             KEY_SEQ smallint not null,
  9605.             UPDATE_RULE smallint null,
  9606.             DELETE_RULE smallint null,
  9607.             FK_NAME varchar(32) null,
  9608.             PK_NAME varchar(32) null,
  9609.             DEFERRABILITY smallint null
  9610.             )
  9611.         insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
  9612.         exec @ret = sp_cursoropen @handle output,
  9613.             'select * from #spfkeys',
  9614.             @scrollopt output, @ccopt output, @rows output
  9615.         drop table #spfkeys
  9616.     end
  9617.     else if @procname = 'sp_pkeys'
  9618.     begin
  9619.         create table #sppkeys (
  9620.             TABLE_QUALIFIER varchar(32)   null,
  9621.             TABLE_OWNER varchar(32)   null,
  9622.             TABLE_NAME varchar(32)    not null,
  9623.             COLUMN_NAME varchar(32)  not null,
  9624.             KEY_SEQ smallint not null,
  9625.             PK_NAME varchar(32) null
  9626.             )
  9627.         insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
  9628.         exec @ret = sp_cursoropen @handle output,
  9629.             'select * from #sppkeys',
  9630.             @scrollopt output, @ccopt output, @rows output
  9631.         drop table #sppkeys
  9632.     end
  9633.     else if @procname = 'sp_special_columns'
  9634.     begin
  9635.         create table #spspeccol (
  9636.             SCOPE smallint null,
  9637.             COLUMN_NAME varchar(32) not null,
  9638.             DATA_TYPE smallint not null,
  9639.             TYPE_NAME varchar(32) not null,
  9640.             "PRECISION" int null,
  9641.             LENGTH int null,
  9642.             SCALE smallint null,
  9643.             PSEUDO_COLUMN smallint null
  9644.             )
  9645.         insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
  9646.         exec @ret = sp_cursoropen @handle output,
  9647.             'select * from #spspeccol',
  9648.             @scrollopt output, @ccopt output, @rows output
  9649.         drop table #spspeccol
  9650.     end
  9651.     else if @procname = 'sp_sproc_columns'
  9652.     begin
  9653.         create table #spproccol (
  9654.             PROCEDURE_QUALIFIER varchar(32)  null,
  9655.             PROCEDURE_OWNER varchar(32)  null,
  9656.             PROCEDURE_NAME varchar(32)    not null,
  9657.             COLUMN_NAME varchar(32) not null,
  9658.             COLUMN_TYPE smallint not null,
  9659.             DATA_TYPE smallint not null,
  9660.             TYPE_NAME varchar(32) not null,
  9661.             "PRECISION" int null,
  9662.             LENGTH int null,
  9663.             SCALE smallint null,
  9664.             RADIX smallint null,
  9665.             NULLABLE smallint not null,
  9666.             REMARKS varchar(254) null,
  9667.             COLUMN_DEF varchar(255) null,
  9668.             SQL_DATA_TYPE smallint not null,
  9669.             SQL_DATETIME_SUB smallint null,
  9670.             CHAR_OCTET_LENGTH int null,
  9671.             ORDINAL_POSITION int not null,
  9672.             IS_NULLABLE varchar(254) null,
  9673.             SS_DATA_TYPE tinyint null
  9674.             )
  9675.         insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
  9676.         exec @ret = sp_cursoropen @handle output,
  9677.             'select * from #spproccol',
  9678.             @scrollopt output, @ccopt output, @rows output
  9679.         drop table #spproccol
  9680.     end
  9681.     else if @procname = 'sp_statistics'
  9682.     begin
  9683.         create table #spstatistics (
  9684.             TABLE_QUALIFIER varchar(32)   null,
  9685.             TABLE_OWNER varchar(32)   null,
  9686.             TABLE_NAME varchar(32)    not null,
  9687.             NON_UNIQUE smallint null,
  9688.             INDEX_QUALIFIER varchar(32) null,
  9689.             INDEX_NAME varchar(32)    null,
  9690.             TYPE smallint not null,
  9691.             SEQ_IN_INDEX smallint null,
  9692.             COLUMN_NAME varchar(32) null,
  9693.             COLLATION char(1) null,
  9694.             CARDINALITY int null,
  9695.             PAGES int null,
  9696.             FILTER_CONDITION varchar(128) null
  9697.             )
  9698.         insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
  9699.         exec @ret = sp_cursoropen @handle output,
  9700.             'select * from #spstatistics',
  9701.             @scrollopt output, @ccopt output, @rows output
  9702.         drop table #spstatistics
  9703.     end
  9704.     else if @procname = 'sp_stored_procedures'
  9705.     begin
  9706.         create table #spprocedures (
  9707.             PROCEDURE_QUALIFIER varchar(32)  null,
  9708.             PROCEDURE_OWNER varchar(32)  null,
  9709.             PROCEDURE_NAME varchar(32)    not null,
  9710.             NUM_INPUT_PARAMS int null,
  9711.             NUM_OUTPUT_PARAMS int null,
  9712.             NUM_RESULT_SETS int null,
  9713.             REMARKS varchar(254) null,
  9714.             PROCEDURE_TYPE smallint null
  9715.             )
  9716.         insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
  9717.         exec @ret = sp_cursoropen @handle output,
  9718.             'select * from #spprocedures',
  9719.             @scrollopt output, @ccopt output, @rows output
  9720.         drop table #spprocedures
  9721.     end
  9722.     else if @procname = 'sp_table_privileges'
  9723.     begin
  9724.         create table #sptabpriv (
  9725.             TABLE_QUALIFIER varchar(32) null,
  9726.             TABLE_OWNER varchar(32) null,
  9727.             TABLE_NAME varchar(32)    not null,
  9728.             GRANTOR varchar(32) null,
  9729.             GRANTEE varchar(32) not null,
  9730.             PRIVILEGE varchar(32) not null,
  9731.             IS_GRANTABLE varchar(3) null
  9732.             )
  9733.         insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
  9734.         exec @ret = sp_cursoropen @handle output,
  9735.             'select * from #sptabpriv',
  9736.             @scrollopt output, @ccopt output, @rows output
  9737.         drop table #sptabpriv
  9738.     end
  9739.     else if @procname = 'sp_tables'
  9740.     begin
  9741.         create table #sptables (
  9742.             TABLE_QUALIFIER varchar(32) null,
  9743.             TABLE_OWNER varchar(32) null,
  9744.             TABLE_NAME varchar(32)    null,
  9745.             TABLE_TYPE     varchar(32) null,
  9746.             REMARKS varchar(254) null)
  9747.         insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
  9748.         exec @ret = sp_cursoropen @handle output,
  9749.             'select * from #sptables',
  9750.             @scrollopt output, @ccopt output, @rows output
  9751.         drop table #sptables
  9752.     end
  9753.     else
  9754.         print 'Unknown sp_ddopen procedure'
  9755.     select @ret = isnull(@ret,0)
  9756.     return isnull(@ret,0)
  9757. go
  9758.  
  9759. if (charindex('7.00', @@version) > 0 or
  9760.     charindex('8.00', @@version) > 0)
  9761.     drop procedure sp_ddopen
  9762. else
  9763. begin
  9764.     print ''
  9765.     print ''
  9766.     print 'Warning:'
  9767.     print 'you are installing the stored procedures '
  9768.     print 'on a pre 7.0 SQL Server.'
  9769.     print 'Ignore the following errors.'
  9770. end
  9771. go
  9772.  
  9773. /*    Procedure for 7.0 server */
  9774. create procedure sp_ddopen; 1(
  9775.                @handle            int output,
  9776.                @procname        sysname,
  9777.                @scrollopt        int output,
  9778.                @ccopt            int output,
  9779.                @rows            int output,
  9780.                @p1                nvarchar(774) = null,
  9781.                @p2                nvarchar(774) = null,
  9782.                @p3                nvarchar(774) = null,
  9783.                @p4                nvarchar(774) = null,
  9784.                @p5                nvarchar(774) = null,
  9785.                @p6                nvarchar(774) = null,
  9786.                @p7                int = null,
  9787.                @ODBCVer         int = 2)
  9788. as
  9789.     set nocount on
  9790.     declare @ret int
  9791.  
  9792.     if @procname = 'sp_column_privileges'
  9793.     begin
  9794.         exec @ret = sp_ddopen;2 @handle output, 
  9795.                             @scrollopt output, 
  9796.                             @ccopt output, 
  9797.                             @rows output, 
  9798.                             @p1,
  9799.                             @p2,
  9800.                             @p3,
  9801.                             @p4
  9802.     end
  9803.     else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'
  9804.     begin
  9805.         exec @ret = sp_ddopen;3 @handle output,
  9806.                             @procname,
  9807.                             @scrollopt output, 
  9808.                             @ccopt output, 
  9809.                             @rows output, 
  9810.                             @p1,
  9811.                             @p2,
  9812.                             @p3,
  9813.                             @p4,
  9814.                             @p5,
  9815.                             @ODBCVer
  9816.     end
  9817.     else if @procname = 'sp_datatype_info'
  9818.     begin
  9819.         exec @ret = sp_ddopen;4 @handle output,
  9820.                             @scrollopt output, 
  9821.                             @ccopt output, 
  9822.                             @rows output, 
  9823.                             @p7,
  9824.                             @ODBCVer
  9825.     end
  9826.     else if @procname = 'sp_fkeys'
  9827.     begin
  9828.         exec @ret = sp_ddopen;5 @handle output, 
  9829.                             @scrollopt output, 
  9830.                             @ccopt output, 
  9831.                             @rows output, 
  9832.                             @p1,
  9833.                             @p2,
  9834.                             @p3,
  9835.                             @p4,
  9836.                             @p5,
  9837.                             @p6
  9838.     end
  9839.     else if @procname = 'sp_pkeys'
  9840.     begin
  9841.         exec @ret = sp_ddopen;6 @handle output, 
  9842.                             @scrollopt output, 
  9843.                             @ccopt output, 
  9844.                             @rows output, 
  9845.                             @p1,
  9846.                             @p2,
  9847.                             @p3
  9848.     end
  9849.     else if @procname = 'sp_special_columns'
  9850.     begin
  9851.         exec @ret = sp_ddopen;7 @handle output, 
  9852.                             @scrollopt output, 
  9853.                             @ccopt output, 
  9854.                             @rows output, 
  9855.                             @p1,
  9856.                             @p2,
  9857.                             @p3,
  9858.                             @p4,
  9859.                             @p5,
  9860.                             @p6,
  9861.                             @ODBCVer
  9862.     end
  9863.     else if @procname = 'sp_sproc_columns'
  9864.     begin
  9865.         exec @ret = sp_ddopen;8 @handle output, 
  9866.                             @scrollopt output, 
  9867.                             @ccopt output, 
  9868.                             @rows output, 
  9869.                             @p1,
  9870.                             @p2,
  9871.                             @p3,
  9872.                             @p4,
  9873.                             @ODBCVer
  9874.     end
  9875.     else if @procname = 'sp_statistics'
  9876.     begin
  9877.         exec @ret = sp_ddopen;9 @handle output, 
  9878.                             @scrollopt output, 
  9879.                             @ccopt output, 
  9880.                             @rows output, 
  9881.                             @p1,
  9882.                             @p2,
  9883.                             @p3,
  9884.                             @p4,
  9885.                             @p5,
  9886.                             @p6
  9887.     end
  9888.     else if @procname = 'sp_stored_procedures'
  9889.     begin
  9890.         exec @ret = sp_ddopen;10 @handle output, 
  9891.                              @scrollopt output, 
  9892.                              @ccopt output, 
  9893.                              @rows output, 
  9894.                              @p1,
  9895.                              @p2,
  9896.                              @p3
  9897.     end
  9898.     else if @procname = 'sp_table_privileges'
  9899.     begin
  9900.         exec @ret = sp_ddopen;11 @handle output, 
  9901.                              @scrollopt output, 
  9902.                              @ccopt output, 
  9903.                              @rows output, 
  9904.                              @p1,
  9905.                              @p2,
  9906.                              @p3
  9907.     end
  9908.     else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'
  9909.     begin
  9910.         exec @ret = sp_ddopen;12 @handle output,
  9911.                             @procname,
  9912.                             @scrollopt output, 
  9913.                             @ccopt output, 
  9914.                             @rows output, 
  9915.                             @p1,
  9916.                             @p2,
  9917.                             @p3,
  9918.                             @p4,
  9919.                             @p5
  9920.     end
  9921.     else
  9922.         print 'Unknown sp_ddopen procedure'
  9923.     select @ret = isnull(@ret,0)
  9924.     return isnull(@ret,0)
  9925. go
  9926.  
  9927.  
  9928. if (charindex('7.00', @@version) = 0 and
  9929.     charindex('8.00', @@version) = 0)
  9930. begin
  9931.     print ''
  9932.     print ''
  9933.     print 'Warning:'
  9934.     print 'you are installing the stored procedures '
  9935.     print 'on a pre 7.0 SQL Server.'
  9936.     print 'Ignore the following errors.'
  9937. end
  9938. go
  9939.  
  9940. create procedure sp_ddopen; 2(
  9941.                @handle            int output,
  9942.                @scrollopt        int output,
  9943.                @ccopt            int output,
  9944.                @rows            int output,
  9945.                @p1                nvarchar(774),
  9946.                @p2                nvarchar(774),
  9947.                @p3                nvarchar(774),
  9948.                @p4                nvarchar(774))
  9949. as
  9950.     set nocount on
  9951.     declare @ret int
  9952.  
  9953.     create table #spcolpriv (
  9954.         TABLE_QUALIFIER sysname null,
  9955.         TABLE_OWNER sysname null,
  9956.         TABLE_NAME sysname not null,
  9957.         COLUMN_NAME sysname not null,
  9958.         GRANTOR sysname null,
  9959.         GRANTEE sysname not null,
  9960.         PRIVILEGE varchar(32) not null,
  9961.         IS_GRANTABLE varchar(3) null
  9962.         )
  9963.     insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
  9964.     exec @ret = sp_cursoropen @handle output,
  9965.         'select * from #spcolpriv',
  9966.         @scrollopt output, @ccopt output, @rows output
  9967.     drop table #spcolpriv
  9968.     return @ret
  9969. go
  9970.  
  9971.  
  9972. if (charindex('7.00', @@version) = 0 and
  9973.     charindex('8.00', @@version) = 0)
  9974. begin
  9975.     print ''
  9976.     print ''
  9977.     print 'Warning:'
  9978.     print 'you are installing the stored procedures '
  9979.     print 'on a pre 7.0 SQL Server.'
  9980.     print 'Ignore the following errors.'
  9981. end
  9982. go
  9983.  
  9984. create procedure sp_ddopen; 3(
  9985.                @handle            int output,
  9986.                @procname        sysname,
  9987.                @scrollopt        int output,
  9988.                @ccopt            int output,
  9989.                @rows            int output,
  9990.                @p1                nvarchar(774),
  9991.                @p2                nvarchar(774),
  9992.                @p3                nvarchar(774),
  9993.                @p4                nvarchar(774),
  9994.                @p5                nvarchar(774),
  9995.                @ODBCVer         int)
  9996. as
  9997.     set nocount on
  9998.     declare @ret int
  9999.  
  10000.     create table #spcolumns (
  10001.         TABLE_QUALIFIER sysname null,
  10002.         TABLE_OWNER sysname null,
  10003.         TABLE_NAME sysname not null,
  10004.         COLUMN_NAME sysname not null,
  10005.         DATA_TYPE smallint not null,
  10006.         TYPE_NAME sysname not null,
  10007.         "PRECISION" int null,
  10008.         LENGTH int null,
  10009.         SCALE smallint null,
  10010.         RADIX smallint null,
  10011.         NULLABLE smallint not null,
  10012.         REMARKS varchar(254) null,
  10013.         COLUMN_DEF nvarchar(3000) null,
  10014.         SQL_DATA_TYPE smallint not null,
  10015.         SQL_DATETIME_SUB smallint null,
  10016.         CHAR_OCTET_LENGTH int null,
  10017.         ORDINAL_POSITION int not null,
  10018.         IS_NULLABLE varchar(254) null,
  10019.         SS_DATA_TYPE tinyint null
  10020.         )
  10021.  
  10022.     if @procname = 'sp_columns'
  10023.     begin
  10024.         insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
  10025.     end
  10026.     else
  10027.     begin
  10028.         insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer
  10029.     end
  10030.     exec @ret = sp_cursoropen @handle output,
  10031.         'select * from #spcolumns',
  10032.         @scrollopt output, @ccopt output, @rows output
  10033.     drop table #spcolumns
  10034.     return @ret
  10035. go
  10036.  
  10037.  
  10038.  
  10039. if (charindex('7.00', @@version) = 0 and
  10040.     charindex('8.00', @@version) = 0)
  10041. begin
  10042.     print ''
  10043.     print ''
  10044.     print 'Warning:'
  10045.     print 'you are installing the stored procedures '
  10046.     print 'on a pre 7.0 SQL Server.'
  10047.     print 'Ignore the following errors.'
  10048. end
  10049. go
  10050.  
  10051. create procedure sp_ddopen; 4(
  10052.                @handle            int output,
  10053.                @scrollopt        int output,
  10054.                @ccopt            int output,
  10055.                @rows            int output,
  10056.                @p7                int,
  10057.                @ODBCVer         int)
  10058. as
  10059.     set nocount on
  10060.     declare @ret int
  10061.  
  10062.     create table #spdatatypeinfo (
  10063.         TYPE_NAME            sysname  not null,
  10064.         DATA_TYPE            smallint not null,
  10065.         "PRECISION"            int null,
  10066.         LITERAL_PREFIX        varchar(32)    null,
  10067.         LITERAL_SUFFIX        varchar(32)    null,
  10068.         CREATE_PARAMS        varchar(32)    null,
  10069.         NULLABLE            smallint   not null,
  10070.         CASE_SENSITIVE        smallint   not null,
  10071.         SEARCHABLE            smallint   not null,
  10072.         UNSIGNED_ATTRIBUTE    smallint   null,
  10073.         MONEY    smallint    not null,
  10074.         AUTO_INCREMENT        smallint    null,
  10075.         LOCAL_TYPE_NAME     sysname null,
  10076.         MINIMUM_SCALE        smallint     null,
  10077.         MAXIMUM_SCALE        smallint   null,
  10078.         SQL_DATA_TYPE        smallint      not null,
  10079.         SQL_DATETIME_SUB    smallint   null,
  10080.         NUM_PREC_RADIX        int     null,
  10081.         INTERVAL_PRECISION    smallint    NULL,
  10082.         USERTYPE            smallint not null)
  10083.  
  10084.     insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
  10085.     exec @ret = sp_cursoropen @handle output,
  10086.         'select * from #spdatatypeinfo',
  10087.         @scrollopt output, @ccopt output, @rows output
  10088.     drop table #spdatatypeinfo
  10089.     return @ret
  10090. go
  10091.  
  10092.  
  10093.  
  10094. if (charindex('7.00', @@version) = 0 and
  10095.     charindex('8.00', @@version) = 0)
  10096. begin
  10097.     print ''
  10098.     print ''
  10099.     print 'Warning:'
  10100.     print 'you are installing the stored procedures '
  10101.     print 'on a pre 7.0 SQL Server.'
  10102.     print 'Ignore the following errors.'
  10103. end
  10104. go
  10105.  
  10106. create procedure sp_ddopen; 5(
  10107.                @handle            int output,
  10108.                @scrollopt        int output,
  10109.                @ccopt            int output,
  10110.                @rows            int output,
  10111.                @p1                nvarchar(774),
  10112.                @p2                nvarchar(774),
  10113.                @p3                nvarchar(774),
  10114.                @p4                nvarchar(774),
  10115.                @p5                nvarchar(774),
  10116.                @p6                nvarchar(774))
  10117. as
  10118.     set nocount on
  10119.     declare @ret int
  10120.  
  10121.     create table #spfkeys (
  10122.         PKTABLE_QUALIFIER sysname     null,
  10123.         PKTABLE_OWNER sysname    null,
  10124.         PKTABLE_NAME sysname  not null,
  10125.         PKCOLUMN_NAME sysname  not null,
  10126.         FKTABLE_QUALIFIER sysname    null,
  10127.         FKTABLE_OWNER sysname    null,
  10128.         FKTABLE_NAME sysname  not null,
  10129.         FKCOLUMN_NAME sysname  not null,
  10130.         KEY_SEQ smallint not null,
  10131.         UPDATE_RULE smallint null,
  10132.         DELETE_RULE smallint null,
  10133.         FK_NAME sysname null,
  10134.         PK_NAME sysname null,
  10135.         DEFERRABILITY smallint null
  10136.         )
  10137.     insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
  10138.     exec @ret = sp_cursoropen @handle output,
  10139.         'select * from #spfkeys',
  10140.         @scrollopt output, @ccopt output, @rows output
  10141.     drop table #spfkeys
  10142.     return @ret
  10143. go
  10144.  
  10145.  
  10146.  
  10147. if (charindex('7.00', @@version) = 0 and
  10148.     charindex('8.00', @@version) = 0)
  10149. begin
  10150.     print ''
  10151.     print ''
  10152.     print 'Warning:'
  10153.     print 'you are installing the stored procedures '
  10154.     print 'on a pre 7.0 SQL Server.'
  10155.     print 'Ignore the following errors.'
  10156. end
  10157. go
  10158.  
  10159. create procedure sp_ddopen; 6(
  10160.                @handle            int output,
  10161.                @scrollopt        int output,
  10162.                @ccopt            int output,
  10163.                @rows            int output,
  10164.                @p1                nvarchar(774),
  10165.                @p2                nvarchar(774),
  10166.                @p3                nvarchar(774))
  10167. as
  10168.     set nocount on
  10169.     declare @ret int
  10170.  
  10171.     create table #sppkeys (
  10172.         TABLE_QUALIFIER sysname   null,
  10173.         TABLE_OWNER sysname   null,
  10174.         TABLE_NAME sysname    not null,
  10175.         COLUMN_NAME sysname  not null,
  10176.         KEY_SEQ smallint not null,
  10177.         PK_NAME sysname null
  10178.         )
  10179.     insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
  10180.     exec @ret = sp_cursoropen @handle output,
  10181.         'select * from #sppkeys',
  10182.         @scrollopt output, @ccopt output, @rows output
  10183.     drop table #sppkeys
  10184.     return @ret
  10185. go
  10186.  
  10187.  
  10188.  
  10189. if (charindex('7.00', @@version) = 0 and
  10190.     charindex('8.00', @@version) = 0)
  10191. begin
  10192.     print ''
  10193.     print ''
  10194.     print 'Warning:'
  10195.     print 'you are installing the stored procedures '
  10196.     print 'on a pre 7.0 SQL Server.'
  10197.     print 'Ignore the following errors.'
  10198. end
  10199. go
  10200.  
  10201. create procedure sp_ddopen; 7(
  10202.                @handle            int output,
  10203.                @scrollopt        int output,
  10204.                @ccopt            int output,
  10205.                @rows            int output,
  10206.                @p1                nvarchar(774),
  10207.                @p2                nvarchar(774),
  10208.                @p3                nvarchar(774),
  10209.                @p4                nvarchar(774),
  10210.                @p5                nvarchar(774),
  10211.                @p6                nvarchar(774),
  10212.                @ODBCVer         int)
  10213. as
  10214.     set nocount on
  10215.     declare @ret int
  10216.  
  10217.     create table #spspeccol (
  10218.         SCOPE smallint null,
  10219.         COLUMN_NAME sysname not null,
  10220.         DATA_TYPE smallint not null,
  10221.         TYPE_NAME sysname not null,
  10222.         "PRECISION" int null,
  10223.         LENGTH int null,
  10224.         SCALE smallint null,
  10225.         PSEUDO_COLUMN smallint null
  10226.         )
  10227.     insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
  10228.     exec @ret = sp_cursoropen @handle output,
  10229.         'select * from #spspeccol',
  10230.         @scrollopt output, @ccopt output, @rows output
  10231.     drop table #spspeccol
  10232.     return @ret
  10233. go
  10234.  
  10235.  
  10236.  
  10237. if (charindex('7.00', @@version) = 0 and
  10238.     charindex('8.00', @@version) = 0)
  10239. begin
  10240.     print ''
  10241.     print ''
  10242.     print 'Warning:'
  10243.     print 'you are installing the stored procedures '
  10244.     print 'on a pre 7.0 SQL Server.'
  10245.     print 'Ignore the following errors.'
  10246. end
  10247. go
  10248.  
  10249. create procedure sp_ddopen; 8(
  10250.                @handle            int output,
  10251.                @scrollopt        int output,
  10252.                @ccopt            int output,
  10253.                @rows            int output,
  10254.                @p1                nvarchar(774),
  10255.                @p2                nvarchar(774),
  10256.                @p3                nvarchar(774),
  10257.                @p4                nvarchar(774),
  10258.                @ODBCVer         int)
  10259. as
  10260.     set nocount on
  10261.     declare @ret int
  10262.  
  10263.     create table #spproccol (
  10264.         PROCEDURE_QUALIFIER sysname  null,
  10265.         PROCEDURE_OWNER sysname  null,
  10266.         PROCEDURE_NAME sysname not null,
  10267.         COLUMN_NAME sysname not null,
  10268.         COLUMN_TYPE smallint not null,
  10269.         DATA_TYPE smallint not null,
  10270.         TYPE_NAME sysname not null,
  10271.         "PRECISION" int null,
  10272.         LENGTH int null,
  10273.         SCALE smallint null,
  10274.         RADIX smallint null,
  10275.         NULLABLE smallint not null,
  10276.         REMARKS varchar(254) null,
  10277.         COLUMN_DEF nvarchar(3000) null,
  10278.         SQL_DATA_TYPE smallint not null,
  10279.         SQL_DATETIME_SUB smallint null,
  10280.         CHAR_OCTET_LENGTH int null,
  10281.         ORDINAL_POSITION int not null,
  10282.         IS_NULLABLE varchar(254) null,
  10283.         SS_DATA_TYPE tinyint null
  10284.         )
  10285.     insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
  10286.     exec @ret = sp_cursoropen @handle output,
  10287.         'select * from #spproccol',
  10288.         @scrollopt output, @ccopt output, @rows output
  10289.     drop table #spproccol
  10290.     return @ret
  10291. go
  10292.  
  10293.  
  10294.  
  10295. if (charindex('7.00', @@version) = 0 and
  10296.     charindex('8.00', @@version) = 0)
  10297. begin
  10298.     print ''
  10299.     print ''
  10300.     print 'Warning:'
  10301.     print 'you are installing the stored procedures '
  10302.     print 'on a pre 7.0 SQL Server.'
  10303.     print 'Ignore the following errors.'
  10304. end
  10305. go
  10306.  
  10307. create procedure sp_ddopen; 9(
  10308.                @handle            int output,
  10309.                @scrollopt        int output,
  10310.                @ccopt            int output,
  10311.                @rows            int output,
  10312.                @p1                nvarchar(774),
  10313.                @p2                nvarchar(774),
  10314.                @p3                nvarchar(774),
  10315.                @p4                nvarchar(774),
  10316.                @p5                nvarchar(774),
  10317.                @p6                nvarchar(774))
  10318. as
  10319.     set nocount on
  10320.     declare @ret int
  10321.  
  10322.     create table #spstatistics (
  10323.         TABLE_QUALIFIER sysname   null,
  10324.         TABLE_OWNER sysname   null,
  10325.         TABLE_NAME sysname    not null,
  10326.         NON_UNIQUE smallint null,
  10327.         INDEX_QUALIFIER sysname null,
  10328.         INDEX_NAME sysname null,
  10329.         TYPE smallint not null,
  10330.         SEQ_IN_INDEX smallint null,
  10331.         COLUMN_NAME sysname null,
  10332.         COLLATION char(1) null,
  10333.         CARDINALITY int null,
  10334.         PAGES int null,
  10335.         FILTER_CONDITION varchar(128) null
  10336.         )
  10337.     insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
  10338.     exec @ret = sp_cursoropen @handle output,
  10339.         'select * from #spstatistics',
  10340.         @scrollopt output, @ccopt output, @rows output
  10341.     drop table #spstatistics
  10342.     return @ret
  10343. go
  10344.                
  10345.  
  10346.  
  10347. if (charindex('7.00', @@version) = 0 and
  10348.     charindex('8.00', @@version) = 0)
  10349. begin
  10350.     print ''
  10351.     print ''
  10352.     print 'Warning:'
  10353.     print 'you are installing the stored procedures '
  10354.     print 'on a pre 7.0 SQL Server.'
  10355.     print 'Ignore the following errors.'
  10356. end
  10357. go
  10358.  
  10359. create procedure sp_ddopen; 10(
  10360.                @handle            int output,
  10361.                @scrollopt            int output,
  10362.                @ccopt            int output,
  10363.                @rows            int output,
  10364.                @p1                nvarchar(774),
  10365.                @p2                nvarchar(774),
  10366.                @p3                nvarchar(774))
  10367. as
  10368.     set nocount on
  10369.     declare @ret int
  10370.  
  10371.     create table #spprocedures (
  10372.         PROCEDURE_QUALIFIER sysname  null,
  10373.         PROCEDURE_OWNER sysname  null,
  10374.         PROCEDURE_NAME nvarchar(134) not null, /*134=sysname+';'+ltrim(str(c.number,5))*/
  10375.         NUM_INPUT_PARAMS int null,
  10376.         NUM_OUTPUT_PARAMS int null,
  10377.         NUM_RESULT_SETS int null,
  10378.         REMARKS varchar(254) null,
  10379.         PROCEDURE_TYPE smallint null
  10380.         )
  10381.     insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
  10382.     exec @ret = sp_cursoropen @handle output,
  10383.         'select * from #spprocedures',
  10384.         @scrollopt output, @ccopt output, @rows output
  10385.     drop table #spprocedures
  10386.     return @ret
  10387. go
  10388.  
  10389.  
  10390.  
  10391. if (charindex('7.00', @@version) = 0 and
  10392.     charindex('8.00', @@version) = 0)
  10393. begin
  10394.     print ''
  10395.     print ''
  10396.     print 'Warning:'
  10397.     print 'you are installing the stored procedures '
  10398.     print 'on a pre 7.0 SQL Server.'
  10399.     print 'Ignore the following errors.'
  10400. end
  10401. go
  10402.  
  10403. create procedure sp_ddopen; 11(
  10404.                @handle            int output,
  10405.                @scrollopt        int output,
  10406.                @ccopt            int output,
  10407.                @rows            int output,
  10408.                @p1                nvarchar(774),
  10409.                @p2                nvarchar(774),
  10410.                @p3                nvarchar(774))
  10411. as
  10412.     set nocount on
  10413.     declare @ret int
  10414.  
  10415.     create table #sptabpriv (
  10416.         TABLE_QUALIFIER sysname null,
  10417.         TABLE_OWNER sysname null,
  10418.         TABLE_NAME sysname not null,
  10419.         GRANTOR sysname null,
  10420.         GRANTEE sysname not null,
  10421.         PRIVILEGE varchar(32) not null,
  10422.         IS_GRANTABLE varchar(3) null
  10423.         )
  10424.     insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
  10425.     exec @ret = sp_cursoropen @handle output,
  10426.         'select * from #sptabpriv',
  10427.         @scrollopt output, @ccopt output, @rows output
  10428.     drop table #sptabpriv
  10429.     return @ret
  10430. go
  10431.  
  10432.  
  10433.  
  10434. if (charindex('7.00', @@version) = 0 and
  10435.     charindex('8.00', @@version) = 0)
  10436. begin
  10437.     print ''
  10438.     print ''
  10439.     print 'Warning:'
  10440.     print 'you are installing the stored procedures '
  10441.     print 'on a pre 7.0 SQL Server.'
  10442.     print 'Ignore the following errors.'
  10443. end
  10444. go
  10445.  
  10446. create procedure sp_ddopen; 12(
  10447.                @handle            int output,
  10448.                @procname        sysname,
  10449.                @scrollopt        int output,
  10450.                @ccopt            int output,
  10451.                @rows            int output,
  10452.                @p1                nvarchar(774),
  10453.                @p2                nvarchar(774),
  10454.                @p3                nvarchar(774),
  10455.                @p4                nvarchar(774),
  10456.                @p5                nvarchar(774))
  10457. as
  10458.     set nocount on
  10459.     declare @ret int
  10460.  
  10461.     create table #sptables (
  10462.         TABLE_QUALIFIER sysname null,
  10463.         TABLE_OWNER sysname null,
  10464.         TABLE_NAME sysname null,
  10465.         TABLE_TYPE    varchar(32) null,
  10466.         REMARKS varchar(254) null)
  10467.     if @procname = 'sp_tables'
  10468.     begin
  10469.         insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
  10470.     end
  10471.     else
  10472.     begin
  10473.         insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5
  10474.     end
  10475.     exec @ret = sp_cursoropen @handle output,
  10476.         'select * from #sptables',
  10477.         @scrollopt output, @ccopt output, @rows output
  10478.     drop table #sptables
  10479.     return @ret
  10480. go
  10481.  
  10482. if (charindex('8.00', @@version) > 0)
  10483.     drop procedure sp_ddopen
  10484. else
  10485. begin
  10486.     print ''
  10487.     print ''
  10488.     print 'Warning:'
  10489.     print 'you are installing the stored procedures '
  10490.     print 'on a pre 8.0 SQL Server.'
  10491.     print 'Ignore the following errors.'
  10492. end
  10493. go
  10494.  
  10495. /*    Procedure for 8.0 server */
  10496. create procedure sp_ddopen; 1(
  10497.                @handle            int output,
  10498.                @procname        sysname,
  10499.                @scrollopt        int output,
  10500.                @ccopt            int output,
  10501.                @rows            int output,
  10502.                @p1                nvarchar(774) = null,
  10503.                @p2                nvarchar(774) = null,
  10504.                @p3                nvarchar(774) = null,
  10505.                @p4                nvarchar(774) = null,
  10506.                @p5                nvarchar(774) = null,
  10507.                @p6                nvarchar(774) = null,
  10508.                @p7                int = null,
  10509.                @ODBCVer         int = 2)
  10510. as
  10511.     set nocount on
  10512.     declare @ret int
  10513.  
  10514.     if @procname = 'sp_column_privileges'
  10515.     begin
  10516.         exec @ret = sp_ddopen;2 @handle output, 
  10517.                             @scrollopt output, 
  10518.                             @ccopt output, 
  10519.                             @rows output, 
  10520.                             @p1,
  10521.                             @p2,
  10522.                             @p3,
  10523.                             @p4
  10524.     end
  10525.     else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'
  10526.     begin
  10527.         exec @ret = sp_ddopen;3 @handle output,
  10528.                             @procname,
  10529.                             @scrollopt output, 
  10530.                             @ccopt output, 
  10531.                             @rows output, 
  10532.                             @p1,
  10533.                             @p2,
  10534.                             @p3,
  10535.                             @p4,
  10536.                             @p5,
  10537.                             @ODBCVer
  10538.     end
  10539.     else if @procname = 'sp_datatype_info'
  10540.     begin
  10541.         exec @ret = sp_ddopen;4 @handle output,
  10542.                             @scrollopt output, 
  10543.                             @ccopt output, 
  10544.                             @rows output, 
  10545.                             @p7,
  10546.                             @ODBCVer
  10547.     end
  10548.     else if @procname = 'sp_fkeys'
  10549.     begin
  10550.         exec @ret = sp_ddopen;5 @handle output, 
  10551.                             @scrollopt output, 
  10552.                             @ccopt output, 
  10553.                             @rows output, 
  10554.                             @p1,
  10555.                             @p2,
  10556.                             @p3,
  10557.                             @p4,
  10558.                             @p5,
  10559.                             @p6
  10560.     end
  10561.     else if @procname = 'sp_pkeys'
  10562.     begin
  10563.         exec @ret = sp_ddopen;6 @handle output, 
  10564.                             @scrollopt output, 
  10565.                             @ccopt output, 
  10566.                             @rows output, 
  10567.                             @p1,
  10568.                             @p2,
  10569.                             @p3
  10570.     end
  10571.     else if @procname = 'sp_special_columns'
  10572.     begin
  10573.         exec @ret = sp_ddopen;7 @handle output, 
  10574.                             @scrollopt output, 
  10575.                             @ccopt output, 
  10576.                             @rows output, 
  10577.                             @p1,
  10578.                             @p2,
  10579.                             @p3,
  10580.                             @p4,
  10581.                             @p5,
  10582.                             @p6,
  10583.                             @ODBCVer
  10584.     end
  10585.     else if @procname = 'sp_sproc_columns'
  10586.     begin
  10587.         exec @ret = sp_ddopen;8 @handle output, 
  10588.                             @scrollopt output, 
  10589.                             @ccopt output, 
  10590.                             @rows output, 
  10591.                             @p1,
  10592.                             @p2,
  10593.                             @p3,
  10594.                             @p4,
  10595.                             @ODBCVer
  10596.     end
  10597.     else if @procname = 'sp_statistics'
  10598.     begin
  10599.         exec @ret = sp_ddopen;9 @handle output, 
  10600.                             @scrollopt output, 
  10601.                             @ccopt output, 
  10602.                             @rows output, 
  10603.                             @p1,
  10604.                             @p2,
  10605.                             @p3,
  10606.                             @p4,
  10607.                             @p5,
  10608.                             @p6
  10609.     end
  10610.     else if @procname = 'sp_stored_procedures'
  10611.     begin
  10612.         exec @ret = sp_ddopen;10 @handle output, 
  10613.                              @scrollopt output, 
  10614.                              @ccopt output, 
  10615.                              @rows output, 
  10616.                              @p1,
  10617.                              @p2,
  10618.                              @p3
  10619.     end
  10620.     else if @procname = 'sp_table_privileges'
  10621.     begin
  10622.         exec @ret = sp_ddopen;11 @handle output, 
  10623.                              @scrollopt output, 
  10624.                              @ccopt output, 
  10625.                              @rows output, 
  10626.                              @p1,
  10627.                              @p2,
  10628.                              @p3
  10629.     end
  10630.     else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'
  10631.     begin
  10632.         exec @ret = sp_ddopen;12 @handle output,
  10633.                             @procname,
  10634.                             @scrollopt output, 
  10635.                             @ccopt output, 
  10636.                             @rows output, 
  10637.                             @p1,
  10638.                             @p2,
  10639.                             @p3,
  10640.                             @p4,
  10641.                             @p5
  10642.     end
  10643.     else
  10644.         print 'Unknown sp_ddopen procedure'
  10645.     select @ret = isnull(@ret,0)
  10646.     return isnull(@ret,0)
  10647. go
  10648.  
  10649.  
  10650. if (charindex('8.00', @@version) = 0)
  10651. begin
  10652.     print ''
  10653.     print ''
  10654.     print 'Warning:'
  10655.     print 'you are installing the stored procedures '
  10656.     print 'on a pre 8.0 SQL Server.'
  10657.     print 'Ignore the following errors.'
  10658. end
  10659. go
  10660.  
  10661. create procedure sp_ddopen; 2(
  10662.                @handle            int output,
  10663.                @scrollopt        int output,
  10664.                @ccopt            int output,
  10665.                @rows            int output,
  10666.                @p1                nvarchar(774),
  10667.                @p2                nvarchar(774),
  10668.                @p3                nvarchar(774),
  10669.                @p4                nvarchar(774))
  10670. as
  10671.     set nocount on
  10672.     declare @ret int
  10673.  
  10674.     create table #spcolpriv (
  10675.         TABLE_QUALIFIER sysname collate database_default null,
  10676.         TABLE_OWNER sysname collate database_default null,
  10677.         TABLE_NAME sysname collate database_default not null,
  10678.         COLUMN_NAME sysname collate database_default not null,
  10679.         GRANTOR sysname collate database_default null,
  10680.         GRANTEE sysname collate database_default not null,
  10681.         PRIVILEGE varchar(32) collate database_default not null,
  10682.         IS_GRANTABLE varchar(3) collate database_default null
  10683.         )
  10684.     insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
  10685.     exec @ret = sp_cursoropen @handle output,
  10686.         'select * from #spcolpriv',
  10687.         @scrollopt output, @ccopt output, @rows output
  10688.     drop table #spcolpriv
  10689.     return @ret
  10690. go
  10691.  
  10692.  
  10693. if (charindex('8.00', @@version) = 0)
  10694. begin
  10695.     print ''
  10696.     print ''
  10697.     print 'Warning:'
  10698.     print 'you are installing the stored procedures '
  10699.     print 'on a pre 8.0 SQL Server.'
  10700.     print 'Ignore the following errors.'
  10701. end
  10702. go
  10703.  
  10704. create procedure sp_ddopen; 3(
  10705.                @handle            int output,
  10706.                @procname        sysname,
  10707.                @scrollopt        int output,
  10708.                @ccopt            int output,
  10709.                @rows            int output,
  10710.                @p1                nvarchar(774),
  10711.                @p2                nvarchar(774),
  10712.                @p3                nvarchar(774),
  10713.                @p4                nvarchar(774),
  10714.                @p5                nvarchar(774),
  10715.                @ODBCVer         int)
  10716. as
  10717.     set nocount on
  10718.     declare @ret int
  10719.  
  10720.     create table #spcolumns (
  10721.         TABLE_QUALIFIER sysname collate database_default null,
  10722.         TABLE_OWNER sysname collate database_default null,
  10723.         TABLE_NAME sysname collate database_default not null,
  10724.         COLUMN_NAME sysname collate database_default not null,
  10725.         DATA_TYPE smallint not null,
  10726.         TYPE_NAME sysname collate database_default not null,
  10727.         "PRECISION" int null,
  10728.         LENGTH int null,
  10729.         SCALE smallint null,
  10730.         RADIX smallint null,
  10731.         NULLABLE smallint not null,
  10732.         REMARKS varchar(254) collate database_default null,
  10733.         COLUMN_DEF nvarchar(3000) collate database_default null,
  10734.         SQL_DATA_TYPE smallint null,
  10735.         SQL_DATETIME_SUB smallint null,
  10736.         CHAR_OCTET_LENGTH int null,
  10737.         ORDINAL_POSITION int not null,
  10738.         IS_NULLABLE varchar(254) collate database_default null,
  10739.         SS_DATA_TYPE tinyint null
  10740.         )
  10741.  
  10742.     if @procname = 'sp_columns'
  10743.     begin
  10744.         insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
  10745.     end
  10746.     else
  10747.     begin
  10748.         insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer
  10749.     end
  10750.     exec @ret = sp_cursoropen @handle output,
  10751.         'select * from #spcolumns',
  10752.         @scrollopt output, @ccopt output, @rows output
  10753.     drop table #spcolumns
  10754.     return @ret
  10755. go
  10756.  
  10757.  
  10758.  
  10759. if (charindex('8.00', @@version) = 0)
  10760. begin
  10761.     print ''
  10762.     print ''
  10763.     print 'Warning:'
  10764.     print 'you are installing the stored procedures '
  10765.     print 'on a pre 8.0 SQL Server.'
  10766.     print 'Ignore the following errors.'
  10767. end
  10768. go
  10769.  
  10770. create procedure sp_ddopen; 4(
  10771.                @handle            int output,
  10772.                @scrollopt        int output,
  10773.                @ccopt            int output,
  10774.                @rows            int output,
  10775.                @p7                int,
  10776.                @ODBCVer         int)
  10777. as
  10778.     set nocount on
  10779.     declare @ret int
  10780.  
  10781.     create table #spdatatypeinfo (
  10782.         TYPE_NAME            sysname  collate database_default not null,
  10783.         DATA_TYPE            smallint not null,
  10784.         "PRECISION"            int null,
  10785.         LITERAL_PREFIX        varchar(32)    collate database_default null,
  10786.         LITERAL_SUFFIX        varchar(32)    collate database_default null,
  10787.         CREATE_PARAMS        varchar(32)    collate database_default null,
  10788.         NULLABLE            smallint   not null,
  10789.         CASE_SENSITIVE        smallint   not null,
  10790.         SEARCHABLE            smallint   not null,
  10791.         UNSIGNED_ATTRIBUTE    smallint   null,
  10792.         MONEY    smallint    not null,
  10793.         AUTO_INCREMENT        smallint    null,
  10794.         LOCAL_TYPE_NAME     sysname collate database_default null,
  10795.         MINIMUM_SCALE        smallint     null,
  10796.         MAXIMUM_SCALE        smallint   null,
  10797.         SQL_DATA_TYPE        smallint      not null,
  10798.         SQL_DATETIME_SUB    smallint   null,
  10799.         NUM_PREC_RADIX        int     null,
  10800.         INTERVAL_PRECISION    smallint    NULL,
  10801.         USERTYPE            smallint not null)
  10802.  
  10803.     insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
  10804.     exec @ret = sp_cursoropen @handle output,
  10805.         'select * from #spdatatypeinfo',
  10806.         @scrollopt output, @ccopt output, @rows output
  10807.     drop table #spdatatypeinfo
  10808.     return @ret
  10809. go
  10810.  
  10811.  
  10812.  
  10813. if (charindex('8.00', @@version) = 0)
  10814. begin
  10815.     print ''
  10816.     print ''
  10817.     print 'Warning:'
  10818.     print 'you are installing the stored procedures '
  10819.     print 'on a pre 8.0 SQL Server.'
  10820.     print 'Ignore the following errors.'
  10821. end
  10822. go
  10823.  
  10824. create procedure sp_ddopen; 5(
  10825.                @handle            int output,
  10826.                @scrollopt        int output,
  10827.                @ccopt            int output,
  10828.                @rows            int output,
  10829.                @p1                nvarchar(774),
  10830.                @p2                nvarchar(774),
  10831.                @p3                nvarchar(774),
  10832.                @p4                nvarchar(774),
  10833.                @p5                nvarchar(774),
  10834.                @p6                nvarchar(774))
  10835. as
  10836.     set nocount on
  10837.     declare @ret int
  10838.  
  10839.     create table #spfkeys (
  10840.         PKTABLE_QUALIFIER sysname     collate database_default null,
  10841.         PKTABLE_OWNER sysname    collate database_default null,
  10842.         PKTABLE_NAME sysname  collate database_default not null,
  10843.         PKCOLUMN_NAME sysname  collate database_default not null,
  10844.         FKTABLE_QUALIFIER sysname    collate database_default null,
  10845.         FKTABLE_OWNER sysname    collate database_default null,
  10846.         FKTABLE_NAME sysname  collate database_default not null,
  10847.         FKCOLUMN_NAME sysname  collate database_default not null,
  10848.         KEY_SEQ smallint not null,
  10849.         UPDATE_RULE smallint null,
  10850.         DELETE_RULE smallint null,
  10851.         FK_NAME sysname collate database_default null,
  10852.         PK_NAME sysname collate database_default null,
  10853.         DEFERRABILITY smallint null
  10854.         )
  10855.     insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
  10856.     exec @ret = sp_cursoropen @handle output,
  10857.         'select * from #spfkeys',
  10858.         @scrollopt output, @ccopt output, @rows output
  10859.     drop table #spfkeys
  10860.     return @ret
  10861. go
  10862.  
  10863.  
  10864.  
  10865. if (charindex('8.00', @@version) = 0)
  10866. begin
  10867.     print ''
  10868.     print ''
  10869.     print 'Warning:'
  10870.     print 'you are installing the stored procedures '
  10871.     print 'on a pre 8.0 SQL Server.'
  10872.     print 'Ignore the following errors.'
  10873. end
  10874. go
  10875.  
  10876. create procedure sp_ddopen; 6(
  10877.                @handle            int output,
  10878.                @scrollopt        int output,
  10879.                @ccopt            int output,
  10880.                @rows            int output,
  10881.                @p1                nvarchar(774),
  10882.                @p2                nvarchar(774),
  10883.                @p3                nvarchar(774))
  10884. as
  10885.     set nocount on
  10886.     declare @ret int
  10887.  
  10888.     create table #sppkeys (
  10889.         TABLE_QUALIFIER sysname   collate database_default null,
  10890.         TABLE_OWNER sysname   collate database_default null,
  10891.         TABLE_NAME sysname    collate database_default not null,
  10892.         COLUMN_NAME sysname  collate database_default not null,
  10893.         KEY_SEQ smallint not null,
  10894.         PK_NAME sysname collate database_default null
  10895.         )
  10896.     insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
  10897.     exec @ret = sp_cursoropen @handle output,
  10898.         'select * from #sppkeys',
  10899.         @scrollopt output, @ccopt output, @rows output
  10900.     drop table #sppkeys
  10901.     return @ret
  10902. go
  10903.  
  10904.  
  10905.  
  10906. if (charindex('8.00', @@version) = 0)
  10907. begin
  10908.     print ''
  10909.     print ''
  10910.     print 'Warning:'
  10911.     print 'you are installing the stored procedures '
  10912.     print 'on a pre 8.0 SQL Server.'
  10913.     print 'Ignore the following errors.'
  10914. end
  10915. go
  10916.  
  10917. create procedure sp_ddopen; 7(
  10918.                @handle            int output,
  10919.                @scrollopt        int output,
  10920.                @ccopt            int output,
  10921.                @rows            int output,
  10922.                @p1                nvarchar(774),
  10923.                @p2                nvarchar(774),
  10924.                @p3                nvarchar(774),
  10925.                @p4                nvarchar(774),
  10926.                @p5                nvarchar(774),
  10927.                @p6                nvarchar(774),
  10928.                @ODBCVer         int)
  10929. as
  10930.     set nocount on
  10931.     declare @ret int
  10932.  
  10933.     create table #spspeccol (
  10934.         SCOPE smallint null,
  10935.         COLUMN_NAME sysname collate database_default not null,
  10936.         DATA_TYPE smallint not null,
  10937.         TYPE_NAME sysname collate database_default not null,
  10938.         "PRECISION" int null,
  10939.         LENGTH int null,
  10940.         SCALE smallint null,
  10941.         PSEUDO_COLUMN smallint null
  10942.         )
  10943.     insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
  10944.     exec @ret = sp_cursoropen @handle output,
  10945.         'select * from #spspeccol',
  10946.         @scrollopt output, @ccopt output, @rows output
  10947.     drop table #spspeccol
  10948.     return @ret
  10949. go
  10950.  
  10951.  
  10952.  
  10953. if (charindex('8.00', @@version) = 0)
  10954. begin
  10955.     print ''
  10956.     print ''
  10957.     print 'Warning:'
  10958.     print 'you are installing the stored procedures '
  10959.     print 'on a pre 8.0 SQL Server.'
  10960.     print 'Ignore the following errors.'
  10961. end
  10962. go
  10963.  
  10964. create procedure sp_ddopen; 8(
  10965.                @handle            int output,
  10966.                @scrollopt        int output,
  10967.                @ccopt            int output,
  10968.                @rows            int output,
  10969.                @p1                nvarchar(774),
  10970.                @p2                nvarchar(774),
  10971.                @p3                nvarchar(774),
  10972.                @p4                nvarchar(774),
  10973.                @ODBCVer         int)
  10974. as
  10975.     set nocount on
  10976.     declare @ret int
  10977.  
  10978.     create table #spproccol (
  10979.         PROCEDURE_QUALIFIER sysname  collate database_default null,
  10980.         PROCEDURE_OWNER sysname  collate database_default null,
  10981.         PROCEDURE_NAME sysname collate database_default not null,
  10982.         COLUMN_NAME sysname collate database_default not null,
  10983.         COLUMN_TYPE smallint not null,
  10984.         DATA_TYPE smallint null,
  10985.         TYPE_NAME sysname collate database_default not null,
  10986.         "PRECISION" int null,
  10987.         LENGTH int null,
  10988.         SCALE smallint null,
  10989.         RADIX smallint null,
  10990.         NULLABLE smallint not null,
  10991.         REMARKS varchar(254) collate database_default null,
  10992.         COLUMN_DEF nvarchar(3000) collate database_default null,
  10993.         SQL_DATA_TYPE smallint null,
  10994.         SQL_DATETIME_SUB smallint null,
  10995.         CHAR_OCTET_LENGTH int null,
  10996.         ORDINAL_POSITION int not null,
  10997.         IS_NULLABLE varchar(254) collate database_default null,
  10998.         SS_DATA_TYPE tinyint null
  10999.         )
  11000.     insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
  11001.     exec @ret = sp_cursoropen @handle output,
  11002.         'select * from #spproccol',
  11003.         @scrollopt output, @ccopt output, @rows output
  11004.     drop table #spproccol
  11005.     return @ret
  11006. go
  11007.  
  11008.  
  11009.  
  11010. if (charindex('8.00', @@version) = 0)
  11011. begin
  11012.     print ''
  11013.     print ''
  11014.     print 'Warning:'
  11015.     print 'you are installing the stored procedures '
  11016.     print 'on a pre 8.0 SQL Server.'
  11017.     print 'Ignore the following errors.'
  11018. end
  11019. go
  11020.  
  11021. create procedure sp_ddopen; 9(
  11022.                @handle            int output,
  11023.                @scrollopt        int output,
  11024.                @ccopt            int output,
  11025.                @rows            int output,
  11026.                @p1                nvarchar(774),
  11027.                @p2                nvarchar(774),
  11028.                @p3                nvarchar(774),
  11029.                @p4                nvarchar(774),
  11030.                @p5                nvarchar(774),
  11031.                @p6                nvarchar(774))
  11032. as
  11033.     set nocount on
  11034.     declare @ret int
  11035.  
  11036.     create table #spstatistics (
  11037.         TABLE_QUALIFIER sysname   collate database_default null,
  11038.         TABLE_OWNER sysname   collate database_default null,
  11039.         TABLE_NAME sysname    collate database_default not null,
  11040.         NON_UNIQUE smallint null,
  11041.         INDEX_QUALIFIER sysname collate database_default null,
  11042.         INDEX_NAME sysname collate database_default null,
  11043.         TYPE smallint not null,
  11044.         SEQ_IN_INDEX smallint null,
  11045.         COLUMN_NAME sysname collate database_default null,
  11046.         COLLATION char(1) collate database_default null,
  11047.         CARDINALITY int null,
  11048.         PAGES int null,
  11049.         FILTER_CONDITION varchar(128) collate database_default null
  11050.         )
  11051.     insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
  11052.     exec @ret = sp_cursoropen @handle output,
  11053.         'select * from #spstatistics',
  11054.         @scrollopt output, @ccopt output, @rows output
  11055.     drop table #spstatistics
  11056.     return @ret
  11057. go
  11058.                
  11059.  
  11060.  
  11061. if (charindex('8.00', @@version) = 0)
  11062. begin
  11063.     print ''
  11064.     print ''
  11065.     print 'Warning:'
  11066.     print 'you are installing the stored procedures '
  11067.     print 'on a pre 8.0 SQL Server.'
  11068.     print 'Ignore the following errors.'
  11069. end
  11070. go
  11071.  
  11072. create procedure sp_ddopen; 10(
  11073.                @handle            int output,
  11074.                @scrollopt        int output,
  11075.                @ccopt            int output,
  11076.                @rows            int output,
  11077.                @p1                nvarchar(774),
  11078.                @p2                nvarchar(774),
  11079.                @p3                nvarchar(774))
  11080. as
  11081.     set nocount on
  11082.     declare @ret int
  11083.  
  11084.     create table #spprocedures (
  11085.         PROCEDURE_QUALIFIER sysname  collate database_default null,
  11086.         PROCEDURE_OWNER sysname  collate database_default null,
  11087.         PROCEDURE_NAME nvarchar(134) collate database_default not null, /*134=sysname+';'+ltrim(str(c.number,5))*/
  11088.         NUM_INPUT_PARAMS int null,
  11089.         NUM_OUTPUT_PARAMS int null,
  11090.         NUM_RESULT_SETS int null,
  11091.         REMARKS varchar(254) collate database_default null,
  11092.         PROCEDURE_TYPE smallint null
  11093.         )
  11094.     insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
  11095.     exec @ret = sp_cursoropen @handle output,
  11096.         'select * from #spprocedures',
  11097.         @scrollopt output, @ccopt output, @rows output
  11098.     drop table #spprocedures
  11099.     return @ret
  11100. go
  11101.  
  11102.  
  11103.  
  11104. if (charindex('8.00', @@version) = 0)
  11105. begin
  11106.     print ''
  11107.     print ''
  11108.     print 'Warning:'
  11109.     print 'you are installing the stored procedures '
  11110.     print 'on a pre 8.0 SQL Server.'
  11111.     print 'Ignore the following errors.'
  11112. end
  11113. go
  11114.  
  11115. create procedure sp_ddopen; 11(
  11116.                @handle            int output,
  11117.                @scrollopt        int output,
  11118.                @ccopt            int output,
  11119.                @rows            int output,
  11120.                @p1                nvarchar(774),
  11121.                @p2                nvarchar(774),
  11122.                @p3                nvarchar(774))
  11123. as
  11124.     set nocount on
  11125.     declare @ret int
  11126.  
  11127.     create table #sptabpriv (
  11128.         TABLE_QUALIFIER sysname collate database_default null,
  11129.         TABLE_OWNER sysname collate database_default null,
  11130.         TABLE_NAME sysname collate database_default not null,
  11131.         GRANTOR sysname collate database_default null,
  11132.         GRANTEE sysname collate database_default not null,
  11133.         PRIVILEGE varchar(32) collate database_default not null,
  11134.         IS_GRANTABLE varchar(3) collate database_default null
  11135.         )
  11136.     insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
  11137.     exec @ret = sp_cursoropen @handle output,
  11138.         'select * from #sptabpriv',
  11139.         @scrollopt output, @ccopt output, @rows output
  11140.     drop table #sptabpriv
  11141.     return @ret
  11142. go
  11143.  
  11144.  
  11145.  
  11146. if (charindex('8.00', @@version) = 0)
  11147. begin
  11148.     print ''
  11149.     print ''
  11150.     print 'Warning:'
  11151.     print 'you are installing the stored procedures '
  11152.     print 'on a pre 8.0 SQL Server.'
  11153.     print 'Ignore the following errors.'
  11154. end
  11155. go
  11156.  
  11157. create procedure sp_ddopen; 12(
  11158.                @handle            int output,
  11159.                @procname        sysname,
  11160.                @scrollopt        int output,
  11161.                @ccopt            int output,
  11162.                @rows            int output,
  11163.                @p1                nvarchar(774),
  11164.                @p2                nvarchar(774),
  11165.                @p3                nvarchar(774),
  11166.                @p4                nvarchar(774),
  11167.                @p5                nvarchar(774))
  11168. as
  11169.     set nocount on
  11170.     declare @ret int
  11171.  
  11172.     create table #sptables (
  11173.         TABLE_QUALIFIER sysname collate database_default null,
  11174.         TABLE_OWNER sysname collate database_default null,
  11175.         TABLE_NAME sysname collate database_default null,
  11176.         TABLE_TYPE    varchar(32) collate database_default null,
  11177.         REMARKS varchar(254) collate database_default null)
  11178.     if @procname = 'sp_tables'
  11179.     begin
  11180.         insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
  11181.     end
  11182.     else
  11183.     begin
  11184.         insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5
  11185.     end
  11186.     exec @ret = sp_cursoropen @handle output,
  11187.         'select * from #sptables',
  11188.         @scrollopt output, @ccopt output, @rows output
  11189.     drop table #sptables
  11190.     return @ret
  11191. go
  11192. grant execute on sp_ddopen to public
  11193. go
  11194.  
  11195. print 'creating sp_tableswc'
  11196. go
  11197.  
  11198. if (charindex('7.00', @@version) = 0 and
  11199.     charindex('8.00', @@version) = 0)
  11200. begin
  11201.     print ''
  11202.     print ''
  11203.     print 'Warning:'
  11204.     print 'you are installing the stored procedures '
  11205.     print 'on a pre 7.0 SQL Server.'
  11206.     print 'Ignore the following errors.'
  11207. end
  11208. go
  11209.  
  11210. /*    Procedure for 7.0 server */
  11211. create procedure sp_tableswc(
  11212.                @table_name        nvarchar(384)    = null,
  11213.                @table_owner     nvarchar(384)    = null,
  11214.                @table_qualifier sysname    = null,
  11215.                @table_type        varchar(100) = null)
  11216. as
  11217.     declare @databasename    sysname
  11218.     declare @qualprocname    nvarchar(141) /* 128 + '..sp_tables' */
  11219.  
  11220.     create table #sptables (
  11221.         TABLE_QUALIFIER sysname null,
  11222.         TABLE_OWNER sysname null,
  11223.         TABLE_NAME sysname null,
  11224.         TABLE_TYPE    varchar(32) null,
  11225.         REMARKS varchar(254) null)
  11226.  
  11227.     declare databases CURSOR FOR
  11228.         select name from master..sysdatabases
  11229.         where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1
  11230.         for read only
  11231.  
  11232.     open databases
  11233.     fetch next from databases into @databasename
  11234.     while (@@FETCH_STATUS <> -1)
  11235.     begin
  11236.         if (charindex('%', @databasename) = 0)
  11237.         begin    /* skip dbnames w/wildcard characters to prevent loop */
  11238.             select @qualprocname = @databasename + '..sp_tables'
  11239.             insert into #sptables exec @qualprocname
  11240.                 @table_name, @table_owner, @databasename, @table_type
  11241.         end
  11242.         fetch next from databases into @databasename
  11243.     end
  11244.     deallocate databases
  11245.     select * from #sptables
  11246.         order by 4, 1, 2, 3
  11247. go
  11248.  
  11249. if (charindex('8.00', @@version) = 0)
  11250. begin
  11251.     print ''
  11252.     print ''
  11253.     print 'Warning:'
  11254.     print 'you are installing the stored procedures '
  11255.     print 'on a pre 8.0 SQL Server.'
  11256.     print 'Ignore the following errors.'
  11257. end
  11258. else
  11259. drop procedure sp_tableswc
  11260. go
  11261.  
  11262. /*    Procedure for 8.0 server */
  11263. create procedure sp_tableswc(
  11264.                @table_name        nvarchar(384)    = null,
  11265.                @table_owner     nvarchar(384)    = null,
  11266.                @table_qualifier sysname    = null,
  11267.                @table_type        varchar(100) = null)
  11268. as
  11269.     declare @databasename    sysname
  11270.     declare @qualprocname    nvarchar(141) /* 128 + '..sp_tables' */
  11271.  
  11272.     create table #sptables (
  11273.         TABLE_QUALIFIER sysname collate database_default null,
  11274.         TABLE_OWNER sysname collate database_default null,
  11275.         TABLE_NAME sysname collate database_default null,
  11276.         TABLE_TYPE    varchar(32) collate database_default null,
  11277.         REMARKS varchar(254) collate database_default null)
  11278.  
  11279.     declare databases CURSOR FOR
  11280.         select name from master..sysdatabases
  11281.         where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1
  11282.         for read only
  11283.  
  11284.     open databases
  11285.     fetch next from databases into @databasename
  11286.     while (@@FETCH_STATUS <> -1)
  11287.     begin
  11288.         if (charindex('%', @databasename) = 0)
  11289.         begin    /* skip dbnames w/wildcard characters to prevent loop */
  11290.             select @qualprocname = @databasename + '..sp_tables'
  11291.             insert into #sptables exec @qualprocname
  11292.                 @table_name, @table_owner, @databasename, @table_type
  11293.         end
  11294.         fetch next from databases into @databasename
  11295.     end
  11296.     deallocate databases
  11297.     select * from #sptables
  11298.         order by 4, 1, 2, 3
  11299. go
  11300.  
  11301. grant execute on sp_tableswc to public
  11302. go
  11303.  
  11304. dump tran master with no_log
  11305. go
  11306.  
  11307. /*-------------------------------------------------------------------------*/
  11308. /*-------------- CATALOG STORED PROCEDURES FOR SQLOLEDB  ------------------*/
  11309. /*-------------------------------------------------------------------------*/
  11310.  
  11311. print ''
  11312. print 'creating spt_provider_types'
  11313. go
  11314. if (charindex('7.00', @@version) = 0 and
  11315.     charindex('8.00', @@version) = 0)
  11316. begin /* Pre 8.0 Server */
  11317. create table spt_provider_types
  11318.     (
  11319.     ss_dtype        tinyint     not null,
  11320.     fixlen            int         null,        /* datatype len for variable, else null */
  11321.     type_name        sysname        not null,
  11322.     oledb_data_type        smallint    not null,
  11323.     best_match        bit        not null,
  11324.     is_nullable        tinyint        null,
  11325.     case_sensitive        bit        not null,
  11326.     fixed_prec_scale    bit        not null,
  11327.     is_long            bit        not null,
  11328.     auto_unique_value    tinyint        not null,
  11329.     data_precision        int         null,
  11330.     numeric_scale        smallint    null,        /* min scale if 6.0 */
  11331.     column_size        int         null,
  11332.     literal_prefix        varchar(32)    null,
  11333.     literal_suffix        varchar(32)     null,
  11334.     searchable        int        not null,
  11335.     unsigned_attribute    tinyint        null,
  11336.     local_type_name     sysname        null
  11337.     )
  11338. print ''
  11339. print ''
  11340. print 'Warning:'
  11341. print 'you are installing the stored procedures '
  11342. print 'on a pre 8.0 SQL Server.'
  11343. print 'Ignore the following errors.'
  11344. end
  11345. go
  11346. if (charindex('7.00', @@version) > 0 or
  11347.     charindex('8.00', @@version) > 0)
  11348. begin /* 8.0 Server */
  11349. create table spt_provider_types
  11350.     (
  11351.     ss_dtype        tinyint     not null,
  11352.     fixlen            int         null,        /* datatype len for variable, else null */
  11353.     type_name        sysname        not null,
  11354.     oledb_data_type        smallint    not null,
  11355.     best_match        bit        not null,
  11356.     is_nullable        bit        null,
  11357.     case_sensitive        bit        not null,
  11358.     fixed_prec_scale    bit        not null,
  11359.     is_long            bit        not null,
  11360.     auto_unique_value    tinyint        not null,
  11361.     data_precision        int         null,
  11362.     numeric_scale        smallint    null,        /* min scale if 6.0 */
  11363.     column_size        int         null,
  11364.     literal_prefix        nvarchar(32)    null,
  11365.     literal_suffix        nvarchar(32)     null,
  11366.     searchable        int        not null,
  11367.     unsigned_attribute    tinyint        null,
  11368.     local_type_name     sysname        null
  11369.     )
  11370. end
  11371. go
  11372.  
  11373. grant select on spt_provider_types to public
  11374. go
  11375. dump tran master with no_log
  11376. go
  11377.  
  11378. /*
  11379. ** Insert the spt_provider_types rows for DBTYTPE_STR data types
  11380. */
  11381. begin tran
  11382.  
  11383. /* Get case sensitivity */
  11384. declare @case_sensitive bit
  11385. select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
  11386. /* Local Char */
  11387. insert into spt_provider_types values
  11388.     (
  11389.     47 /*SQLCHARACTER*/,        /* ss_dtype */
  11390.     0,                /* fixlen */
  11391.     'char',                /* type_name */
  11392.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  11393.     0,                /* best_match */
  11394.     null,                /* is_nullable */
  11395.     @case_sensitive,        /* case_sensitive */
  11396.     0,                /* fixed_prec_scale */
  11397.     0,                /* is_long */
  11398.     0,                /* auto_unique_value */
  11399.     null,                /* data_precision */
  11400.     null,                /* numeric_scale */
  11401.     null,                /* column_size */
  11402.     '''',                /* literal_prefix */
  11403.     '''',                /* literal_suffix */
  11404.     4 /*DB_SEARCHABLE*/,        /* searchable */
  11405.     null,                /* unsigned_attribute */
  11406.     'char'                /* local_type_name */
  11407.     )
  11408.  
  11409. /* Local Varchar */
  11410. insert into spt_provider_types values
  11411.     (
  11412.     39 /*SQLVARCHAR*/,        /* ss_dtype */
  11413.     null,                /* fixlen */
  11414.     'varchar',            /* type_name */
  11415.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  11416.     1,                /* best_match */
  11417.     null,                /* is_nullable */
  11418.     @case_sensitive,        /* case_sensitive */
  11419.     0,                /* fixed_prec_scale */
  11420.     0,                /* is_long */
  11421.     0,                /* auto_unique_value */
  11422.     null,                /* data_precision */
  11423.     null,                /* numeric_scale */
  11424.     null,                /* column_size */
  11425.     '''',                /* literal_prefix */
  11426.     '''',                /* literal_suffix */
  11427.     4 /*DB_SEARCHABLE*/,        /* searchable */
  11428.     null,                /* unsigned_attribute */
  11429.     'varchar'            /* local_type_name */
  11430.     )
  11431.  
  11432. /* Local Text */
  11433. insert into spt_provider_types values
  11434.     (
  11435.     35  /*SQLTEXT*/,        /* ss_dtype */
  11436.     null,                /* fixlen */
  11437.     'text',                /* type_name */
  11438.     129 /*DBTYPE_STR*/,        /* oledb_data_type */
  11439.     0,                /* best_match */
  11440.     null,                /* is_nullable */
  11441.     @case_sensitive,        /* case_sensitive */
  11442.     0,                /* fixed_prec_scale */
  11443.     1,                /* is_long */
  11444.     0,                /* auto_unique_value */
  11445.     null,                /* data_precision */
  11446.     null,                /* numeric_scale */
  11447.     2147483647,            /* column_size */
  11448.     '''',                /* literal_prefix */
  11449.     '''',                /* literal_suffix */
  11450.     2 /*DB_LIKE_ONLY*/,        /* searchable */
  11451.     null,                /* unsigned_attribute */
  11452.     'text'                /* local_type_name */
  11453.     )
  11454. commit tran
  11455. go
  11456. dump tran master with no_log
  11457. go
  11458.  
  11459. /*
  11460. ** Insert the spt_provider_types rows for DBTYTPE_BYTES data types
  11461. */
  11462. begin tran
  11463. /* Local Binary */
  11464. insert into spt_provider_types values
  11465.     (
  11466.     45 /*SQLBINARY*/,        /* ss_dtype */
  11467.     0,                /* fixlen */
  11468.     'binary',            /* type_name */
  11469.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  11470.     0,                /* best_match */
  11471.     null,                /* is_nullable */
  11472.     0,                /* case_sensitive */
  11473.     0,                /* fixed_prec_scale */
  11474.     0,                /* is_long */
  11475.     0,                /* auto_unique_value */
  11476.     null,                /* data_precision */
  11477.     null,                /* numeric_scale */
  11478.     null,                /* column_size */
  11479.     '0x',                /* literal_prefix */
  11480.     null,                /* literal_suffix */
  11481.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11482.     null,                /* unsigned_attribute */
  11483.     'binary'            /* local_type_name */
  11484.     )
  11485.  
  11486. /* Local Varbinary */
  11487. insert into spt_provider_types values
  11488.     (
  11489.     37 /*SQLVARBINARY*/,        /* ss_dtype */
  11490.     null,                /* fixlen */
  11491.     'varbinary',            /* type_name */
  11492.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  11493.     1,                /* best_match */
  11494.     null,                /* is_nullable */
  11495.     0,                /* case_sensitive */
  11496.     0,                /* fixed_prec_scale */
  11497.     0,                /* is_long */
  11498.     0,                /* auto_unique_value */
  11499.     null,                /* data_precision */
  11500.     null,                /* numeric_scale */
  11501.     null,                /* column_size */
  11502.     '0x',                /* literal_prefix */
  11503.     null,                /* literal_suffix */
  11504.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11505.     null,                /* unsigned_attribute */
  11506.     'varbinary'            /* local_type_name */
  11507.     )
  11508.  
  11509. /* Local Image */
  11510. insert into spt_provider_types values
  11511.     (
  11512.     34 /*SQLIMAGE*/,        /* ss_dtype */
  11513.     null,                /* fixlen */
  11514.     'image',            /* type_name */
  11515.     128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  11516.     0,                /* best_match */
  11517.     null,                /* is_nullable */
  11518.     0,                /* case_sensitive */
  11519.     0,                /* fixed_prec_scale */
  11520.     1,                /* is_long */
  11521.     0,                /* auto_unique_value */
  11522.     null,                /* data_precision */
  11523.     null,                /* numeric_scale */
  11524.     2147483647,            /* column_size */
  11525.     '0x',                /* literal_prefix */
  11526.     null,                /* literal_suffix */
  11527.     1 /*DB_UNSEARCHABLE*/,        /* searchable */
  11528.     null,                /* unsigned_attribute */
  11529.     'image'                /* local_type_name */
  11530.     )
  11531.  
  11532. commit tran
  11533. go
  11534. dump tran master with no_log
  11535. go
  11536.  
  11537. /*
  11538. ** Insert the spt_provider_types rows for DBTYPE_DBTIMESTAMP data types
  11539. */
  11540. begin tran
  11541.  
  11542. /* Local Datetime */
  11543. insert into spt_provider_types values
  11544.     (
  11545.     61 /*SQLDATETIME*/,        /* ss_dtype */
  11546.     8,                /* fixlen */
  11547.     'datetime',            /* type_name */
  11548.     135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  11549.     1,                /* best_match */
  11550.     null,                /* is_nullable */
  11551.     0,                /* case_sensitive */
  11552.     0,                /* fixed_prec_scale */
  11553.     0,                /* is_long */
  11554.     0,                /* auto_unique_value */
  11555.     23,                /* data_precision */
  11556.     null,                /* numeric_scale */
  11557.     null,                /* column_size */
  11558.     '''',                /* literal_prefix */
  11559.     '''',                /* literal_suffix */
  11560.     4 /*DB_SEARCHABLE*/,        /* searchable */
  11561.     null,                /* unsigned_attribute */
  11562.     'datetime'            /* local_type_name */
  11563.     )
  11564.  
  11565. /* Local Smalldatetime */
  11566. insert into spt_provider_types values
  11567.     (
  11568.     58 /*SQLDATETIM4*/,        /* ss_dtype */
  11569.     4,                /* fixlen */
  11570.     'smalldatetime',        /* type_name */
  11571.     135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  11572.     0,                /* best_match */
  11573.     null,                /* is_nullable */
  11574.     0,                /* case_sensitive */
  11575.     0,                /* fixed_prec_scale */
  11576.     0,                /* is_long */
  11577.     0,                /* auto_unique_value */
  11578.     16,                /* data_precision */
  11579.     null,                /* numeric_scale */
  11580.     null,                /* column_size */
  11581.     '''',                /* literal_prefix */
  11582.     '''',                /* literal_suffix */
  11583.     4 /*DB_SEARCHABLE*/,        /* searchable */
  11584.     null,                /* unsigned_attribute */
  11585.     'smalldatetime'            /* local_type_name */
  11586.     )
  11587.  
  11588. if (charindex('7.00', @@version) = 0 and
  11589.     charindex('8.00', @@version) = 0)
  11590.     begin    /*    Add nullable type for non-Sphinx server */
  11591.     
  11592.     /* Local Datetimn */
  11593.     insert into spt_provider_types values
  11594.         (
  11595.         111 /*SQLDATETIMN*/,        /* ss_dtype */
  11596.         4,                /* fixlen */
  11597.         'smalldatetime',        /* type_name */
  11598.         135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  11599.         0,                /* best_match */
  11600.         null,                /* is_nullable */
  11601.         0,                /* case_sensitive */
  11602.         0,                /* fixed_prec_scale */
  11603.         0,                /* is_long */
  11604.         0,                /* auto_unique_value */
  11605.         16,                /* data_precision */
  11606.         null,                /* numeric_scale */
  11607.         null,                /* column_size */
  11608.         '''',                /* literal_prefix */
  11609.         '''',                /* literal_suffix */
  11610.         4 /*DB_SEARCHABLE*/,        /* searchable */
  11611.         null,                /* unsigned_attribute */
  11612.         'smalldatetime'            /* local_type_name */
  11613.         )    
  11614.     insert into spt_provider_types values
  11615.         (
  11616.         111 /*SQLDATETIMN*/,        /* ss_dtype */
  11617.         8,                /* fixlen */
  11618.         'datetime',            /* type_name */
  11619.         135 /*DBTYPE_DBTIMESTAMP*/,    /* oledb_data_type */
  11620.         0,                /* best_match */
  11621.         null,                /* is_nullable */
  11622.         0,                /* case_sensitive */
  11623.         0,                /* fixed_prec_scale */
  11624.         0,                /* is_long */
  11625.         0,                /* auto_unique_value */
  11626.         23,                /* data_precision */
  11627.         null,                /* numeric_scale */
  11628.         null,                /* column_size */
  11629.         '''',                /* literal_prefix */
  11630.         '''',                /* literal_suffix */
  11631.         4 /*DB_SEARCHABLE*/,        /* searchable */
  11632.         null,                /* unsigned_attribute */
  11633.         'datetime'            /* local_type_name */
  11634.         )
  11635.     end
  11636.  
  11637. commit tran
  11638. go
  11639. dump tran master with no_log
  11640. go
  11641.  
  11642. /*
  11643. ** Insert the spt_provider_types rows for DBTYPE_CY data types
  11644. */
  11645. begin tran
  11646.  
  11647. /* Local Smallmoney */
  11648. insert into spt_provider_types values
  11649.     (
  11650.     122 /*SQLMONEY4*/,        /* ss_dtype */
  11651.     4,                /* fixlen */
  11652.     'smallmoney',            /* type_name */
  11653.     6 /*DBTYPE_CY*/,        /* oledb_data_type */
  11654.     0,                /* best_match */
  11655.     null,                /* is_nullable */
  11656.     0,                /* case_sensitive */
  11657.     1,                /* fixed_prec_scale */
  11658.     0,                /* is_long */
  11659.     0,                /* auto_unique_value */
  11660.     10,                /* data_precision */
  11661.     null,                /* numeric_scale */
  11662.     null,                /* column_size */
  11663.     '$',                /* literal_prefix */
  11664.     null,                /* literal_suffix */
  11665.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11666.     0,                /* unsigned_attribute */
  11667.     'smallmoney'            /* local_type_name */
  11668.     )    
  11669.     
  11670. /* Local Money */
  11671. insert into spt_provider_types values
  11672.     (
  11673.     60 /*SQLMONEY*/,        /* ss_dtype */
  11674.     8,                /* fixlen */
  11675.     'money',            /* type_name */
  11676.     6 /*DBTYPE_CY*/,        /* oledb_data_type */
  11677.     1,                /* best_match */
  11678.     null,                /* is_nullable */
  11679.     0,                /* case_sensitive */
  11680.     1,                /* fixed_prec_scale */
  11681.     0,                /* is_long */
  11682.     0,                /* auto_unique_value */
  11683.     19,                /* data_precision */
  11684.     null,                /* numeric_scale */
  11685.     null,                /* column_size */
  11686.     '$',                /* literal_prefix */
  11687.     null,                /* literal_suffix */
  11688.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11689.     0,                /* unsigned_attribute */
  11690.     'money'                /* local_type_name */
  11691.     )    
  11692.  
  11693. if (charindex('7.00', @@version) = 0 and
  11694.     charindex('8.00', @@version) = 0)
  11695.     begin    /*    Add nullable type for non-Sphinx server */
  11696.  
  11697.     /* Local Moneyn */
  11698.     insert into spt_provider_types values
  11699.         (
  11700.         110 /*SQLMONEYN*/,    /* ss_dtype */
  11701.         4,            /* fixlen */
  11702.         'smallmoney',        /* type_name */
  11703.         6 /*DBTYPE_CY*/,    /* oledb_data_type */
  11704.         0,            /* best_match */
  11705.         null,            /* is_nullable */
  11706.         0,            /* case_sensitive */
  11707.         1,            /* fixed_prec_scale */
  11708.         0,            /* is_long */
  11709.         0,            /* auto_unique_value */
  11710.         10,            /* data_precision */
  11711.         null,            /* numeric_scale */
  11712.         null,            /* column_size */
  11713.         '$',            /* literal_prefix */
  11714.         null,            /* literal_suffix */
  11715.         3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
  11716.         0,            /* unsigned_attribute */
  11717.         'smallmoney'        /* local_type_name */
  11718.         )    
  11719.     insert into spt_provider_types values
  11720.         (
  11721.         110 /*SQLMONEYN*/,    /* ss_dtype */
  11722.         8,            /* fixlen */
  11723.         'money',        /* type_name */
  11724.         6 /*DBTYPE_CY*/,    /* oledb_data_type */
  11725.         0,            /* best_match */
  11726.         null,            /* is_nullable */
  11727.         0,            /* case_sensitive */
  11728.         1,            /* fixed_prec_scale */
  11729.         0,            /* is_long */
  11730.         0,            /* auto_unique_value */
  11731.         19,            /* data_precision */
  11732.         null,            /* numeric_scale */
  11733.         null,            /* column_size */
  11734.         '$',            /* literal_prefix */
  11735.         null,            /* literal_suffix */
  11736.         3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
  11737.         null,            /* unsigned_attribute */
  11738.         'money'            /* local_type_name */
  11739.         )    
  11740.     end
  11741.  
  11742. commit tran
  11743. go
  11744. dump tran master with no_log
  11745. go
  11746.  
  11747. /*
  11748. ** Insert the spt_provider_types rows for the numeric data types
  11749. */
  11750. begin tran
  11751.  
  11752. /* Local Float */
  11753. insert into spt_provider_types values
  11754.     (
  11755.     62 /*SQLFLT8*/,            /* ss_dtype */
  11756.     8,                /* fixlen */
  11757.     'float',            /* type_name */
  11758.     5 /*DBTYPE_R8*/,        /* oledb_data_type */
  11759.     1,                /* best_match */
  11760.     null,                /* is_nullable */
  11761.     0,                /* case_sensitive */
  11762.     0,                /* fixed_prec_scale */
  11763.     0,                /* is_long */
  11764.     0,                /* auto_unique_value */
  11765.     15,                /* data_precision */
  11766.     null,                /* numeric_scale */
  11767.     null,                /* column_size */
  11768.     null,                /* literal_prefix */
  11769.     null,                /* literal_suffix */
  11770.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11771.     0,                /* unsigned_attribute */
  11772.     'float'                /* local_type_name */
  11773.     )    
  11774.  
  11775. /* Local Real */
  11776. insert into spt_provider_types values
  11777.     (
  11778.     59 /*SQLFLT4*/,            /* ss_dtype */
  11779.     4,                /* fixlen */
  11780.     'real',                /* type_name */
  11781.     4 /*DBTYPE_R4*/,        /* oledb_data_type */
  11782.     1,                /* best_match */
  11783.     null,                /* is_nullable */
  11784.     0,                /* case_sensitive */
  11785.     0,                /* fixed_prec_scale */
  11786.     0,                /* is_long */
  11787.     0,                /* auto_unique_value */
  11788.     7,                /* data_precision */
  11789.     null,                /* numeric_scale */
  11790.     null,                /* column_size */
  11791.     null,                /* literal_prefix */
  11792.     null,                /* literal_suffix */
  11793.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11794.     0,                /* unsigned_attribute */
  11795.     'real'                /* local_type_name */
  11796.     )    
  11797.  
  11798. /* Local Int */
  11799. insert into spt_provider_types values
  11800.     (
  11801.     56 /*SQLINT4*/,            /* ss_dtype */
  11802.     4,                /* fixlen */
  11803.     'int',                /* type_name */
  11804.     3 /*DBTYPE_I4*/,        /* oledb_data_type */
  11805.     1,                /* best_match */
  11806.     null,                /* is_nullable */
  11807.     0,                /* case_sensitive */
  11808.     1,                /* fixed_prec_scale */
  11809.     0,                /* is_long */
  11810.     1,                /* auto_unique_value */
  11811.     10,                /* data_precision */
  11812.     null,                /* numeric_scale */
  11813.     null,                /* column_size */
  11814.     null,                /* literal_prefix */
  11815.     null,                /* literal_suffix */
  11816.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11817.     0,                /* unsigned_attribute */
  11818.     'int'                /* local_type_name */
  11819.     )    
  11820.  
  11821. /* Local Smallint */
  11822. insert into spt_provider_types values
  11823.     (
  11824.     52 /*SQLINT2*/,            /* ss_dtype */
  11825.     2,                /* fixlen */
  11826.     'smallint',            /* type_name */
  11827.     2 /*DBTYPE_I2*/,        /* oledb_data_type */
  11828.     1,                /* best_match */
  11829.     null,                /* is_nullable */
  11830.     0,                /* case_sensitive */
  11831.     1,                /* fixed_prec_scale */
  11832.     0,                /* is_long */
  11833.     1,                /* auto_unique_value */
  11834.     5,                /* data_precision */
  11835.     null,                /* numeric_scale */
  11836.     null,                /* column_size */
  11837.     null,                /* literal_prefix */
  11838.     null,                /* literal_suffix */
  11839.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11840.     0,                /* unsigned_attribute */
  11841.     'smallint'            /* local_type_name */
  11842.     )    
  11843.  
  11844. /* Local Tinyint */
  11845. insert into spt_provider_types values
  11846.     (
  11847.     48 /*SQLINT1*/,            /* ss_dtype */
  11848.     1,                /* fixlen */
  11849.     'tinyint',            /* type_name */
  11850.     17 /*DBTYPE_UI1*/,        /* oledb_data_type */
  11851.     1,                /* best_match */
  11852.     null,                /* is_nullable */
  11853.     0,                /* case_sensitive */
  11854.     1,                /* fixed_prec_scale */
  11855.     0,                /* is_long */
  11856.     1,                /* auto_unique_value */
  11857.     3,                /* data_precision */
  11858.     null,                /* numeric_scale */
  11859.     null,                /* column_size */
  11860.     null,                /* literal_prefix */
  11861.     null,                /* literal_suffix */
  11862.     3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11863.     1,                /* unsigned_attribute */
  11864.     'tinyint'            /* local_type_name */
  11865.     )    
  11866. commit tran
  11867. go
  11868. dump tran master with no_log
  11869. go
  11870. begin tran    
  11871. if (charindex('6.00', @@version) > 0 or
  11872.     charindex('6.50', @@version) > 0 or
  11873.     charindex('7.00', @@version) > 0 or
  11874.     charindex('8.00', @@version) > 0)
  11875.     begin    /*    Add 6.0 data types */
  11876.     
  11877.     /* Local Decimal */
  11878.     insert into spt_provider_types values
  11879.         (
  11880.         55 /*SQLDECIMAL*/,        /* ss_dtype */
  11881.         0,                /* fixlen */
  11882.         'decimal',            /* type_name */
  11883.         131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  11884.         0,                /* best_match */
  11885.         null,                /* is_nullable */
  11886.         0,                /* case_sensitive */
  11887.         1,                /* fixed_prec_scale */
  11888.         0,                /* is_long */
  11889.         1,                /* auto_unique_value */
  11890.         38,                /* data_precision */
  11891.         null,                /* numeric_scale */
  11892.         null,                /* column_size */
  11893.         null,                /* literal_prefix */
  11894.         null,                /* literal_suffix */
  11895.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11896.         0,                /* unsigned_attribute */
  11897.         'decimal'            /* local_type_name */
  11898.         )    
  11899.  
  11900.     /* Local Numeric */
  11901.     insert into spt_provider_types values
  11902.         (
  11903.         63 /*SQLNUMERIC*/,        /* ss_dtype */
  11904.         0,                /* fixlen */
  11905.         'numeric',            /* type_name */
  11906.         131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  11907.         1,                /* best_match */
  11908.         null,                /* is_nullable */
  11909.         0,                /* case_sensitive */
  11910.         1,                /* fixed_prec_scale */
  11911.         0,                /* is_long */
  11912.         1,                /* auto_unique_value */
  11913.         38,                /* data_precision */
  11914.         null,                /* numeric_scale */
  11915.         null,                /* column_size */
  11916.         null,                /* literal_prefix */
  11917.         null,                /* literal_suffix */
  11918.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11919.         0,                /* unsigned_attribute */
  11920.         'numeric'            /* local_type_name */
  11921.         )    
  11922.     end
  11923. commit tran
  11924. go
  11925. dump tran master with no_log
  11926. go
  11927. begin tran
  11928. if (charindex('7.00', @@version) = 0 and
  11929.     charindex('8.00', @@version) = 0)
  11930.     begin    /*    Add nullable type for non-Sphinx server */
  11931.     
  11932.     /* Local Floatn */
  11933.     insert into spt_provider_types values
  11934.         (
  11935.         109 /*SQLFLTN*/,        /* ss_dtype */
  11936.         8,                /* fixlen */
  11937.         'float',            /* type_name */
  11938.         5 /*DBTYPE_R8*/,        /* oledb_data_type */
  11939.         0,                /* best_match */
  11940.         null,                /* is_nullable */
  11941.         0,                /* case_sensitive */
  11942.         0,                /* fixed_prec_scale */
  11943.         0,                /* is_long */
  11944.         0,                /* auto_unique_value */
  11945.         15,                /* data_precision */
  11946.         null,                /* numeric_scale */
  11947.         null,                /* column_size */
  11948.         null,                /* literal_prefix */
  11949.         null,                /* literal_suffix */
  11950.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11951.         null,                /* unsigned_attribute */
  11952.         'float'                /* local_type_name */
  11953.         )    
  11954.     insert into spt_provider_types values
  11955.         (
  11956.         109 /*SQLFLT4*/,        /* ss_dtype */
  11957.         4,                /* fixlen */
  11958.         'real',                /* type_name */
  11959.         4 /*DBTYPE_R4*/,        /* oledb_data_type */
  11960.         0,                /* best_match */
  11961.         null,                /* is_nullable */
  11962.         0,                /* case_sensitive */
  11963.         0,                /* fixed_prec_scale */
  11964.         0,                /* is_long */
  11965.         0,                /* auto_unique_value */
  11966.         7,                /* data_precision */
  11967.         null,                /* numeric_scale */
  11968.         null,                /* column_size */
  11969.         null,                /* literal_prefix */
  11970.         null,                /* literal_suffix */
  11971.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11972.         null,                /* unsigned_attribute */
  11973.         'real'                /* local_type_name */
  11974.         )    
  11975.  
  11976.     /* Local Intn */
  11977.     insert into spt_provider_types values
  11978.         (
  11979.         38 /*SQLINTN*/,            /* ss_dtype */
  11980.         4,                /* fixlen */
  11981.         'int',                /* type_name */
  11982.         3 /*DBTYPE_I4*/,        /* oledb_data_type */
  11983.         1,                /* best_match */
  11984.         null,                /* is_nullable */
  11985.         0,                /* case_sensitive */
  11986.         1,                /* fixed_prec_scale */
  11987.         0,                /* is_long */
  11988.         1,                /* auto_unique_value */
  11989.         10,                /* data_precision */
  11990.         null,                /* numeric_scale */
  11991.         null,                /* column_size */
  11992.         null,                /* literal_prefix */
  11993.         null,                /* literal_suffix */
  11994.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  11995.         0,                /* unsigned_attribute */
  11996.         'int'                /* local_type_name */
  11997.         )    
  11998.     insert into spt_provider_types values
  11999.         (
  12000.         38 /*SQLINTN*/,            /* ss_dtype */
  12001.         2,                /* fixlen */
  12002.         'smallint',            /* type_name */
  12003.         2 /*DBTYPE_I2*/,        /* oledb_data_type */
  12004.         0,                /* best_match */
  12005.         null,                /* is_nullable */
  12006.         0,                /* case_sensitive */
  12007.         1,                /* fixed_prec_scale */
  12008.         0,                /* is_long */
  12009.         1,                /* auto_unique_value */
  12010.         5,                /* data_precision */
  12011.         null,                /* numeric_scale */
  12012.         null,                /* column_size */
  12013.         null,                /* literal_prefix */
  12014.         null,                /* literal_suffix */
  12015.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12016.         0,                /* unsigned_attribute */
  12017.         'smallint'            /* local_type_name */
  12018.         )    
  12019.     insert into spt_provider_types values
  12020.         (
  12021.         38 /*SQLINTN*/,            /* ss_dtype */
  12022.         1,                /* fixlen */
  12023.         'tinyint',            /* type_name */
  12024.         17 /*DBTYPE_UI1*/,        /* oledb_data_type */
  12025.         0,                /* best_match */
  12026.         null,                /* is_nullable */
  12027.         0,                /* case_sensitive */
  12028.         1,                /* fixed_prec_scale */
  12029.         0,                /* is_long */
  12030.         1,                /* auto_unique_value */
  12031.         3,                /* data_precision */
  12032.         null,                /* numeric_scale */
  12033.         null,                /* column_size */
  12034.         null,                /* literal_prefix */
  12035.         null,                /* literal_suffix */
  12036.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12037.         1,                /* unsigned_attribute */
  12038.         'tinyint'            /* local_type_name */
  12039.         )    
  12040.  
  12041.     if (charindex('6.00', @@version) > 0 or    charindex('6.50', @@version) > 0)
  12042.         begin    /*    Add 6.0 data types */
  12043.         
  12044.         /* Local Decimaln */
  12045.         insert into spt_provider_types values
  12046.             (
  12047.             106 /*SQLDECIMALN*/,        /* ss_dtype */
  12048.             0,                /* fixlen */
  12049.             'decimal',            /* type_name */
  12050.             131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  12051.             0,                /* best_match */
  12052.             null,                /* is_nullable */
  12053.             0,                /* case_sensitive */
  12054.             1,                /* fixed_prec_scale */
  12055.             0,                /* is_long */
  12056.             1,                /* auto_unique_value */
  12057.             38,                /* data_precision */
  12058.             null,                /* numeric_scale */
  12059.             null,                /* column_size */
  12060.             null,                /* literal_prefix */
  12061.             null,                /* literal_suffix */
  12062.             3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12063.             0,                /* unsigned_attribute */
  12064.             'decimal'            /* local_type_name */
  12065.             )    
  12066.  
  12067.         /* Local Numericn */
  12068.         insert into spt_provider_types values
  12069.             (
  12070.             108 /*SQLNUMERICN*/,        /* ss_dtype */
  12071.             0,                /* fixlen */
  12072.             'numeric',            /* type_name */
  12073.             131 /*DBTYPE_NUMERIC*/,        /* oledb_data_type */
  12074.             0,                /* best_match */
  12075.             null,                /* is_nullable */
  12076.             0,                /* case_sensitive */
  12077.             1,                /* fixed_prec_scale */
  12078.             0,                /* is_long */
  12079.             1,                /* auto_unique_value */
  12080.             38,                /* data_precision */
  12081.             null,                /* numeric_scale */
  12082.             null,                /* column_size */
  12083.             null,                /* literal_prefix */
  12084.             null,                /* literal_suffix */
  12085.             3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12086.             0,                /* unsigned_attribute */
  12087.             'numeric'            /* local_type_name */
  12088.             )    
  12089.         end
  12090.     end
  12091. commit tran
  12092. go
  12093. dump tran master with no_log
  12094. go
  12095.  
  12096. /*
  12097. **    Remaining data types
  12098. */
  12099. if (charindex('7.00', @@version) = 0 and
  12100.     charindex('8.00', @@version) = 0)
  12101. begin
  12102.     print ''
  12103.     print ''
  12104.     print 'Warning:'
  12105.     print 'you are installing the stored procedures '
  12106.     print 'on a pre 8.0 SQL Server.'
  12107.     print 'Ignore the following errors.'
  12108. end
  12109. go
  12110. begin tran
  12111.  
  12112. if (charindex('7.00', @@version) > 0 or
  12113.     charindex('8.00', @@version) > 0)
  12114.     begin
  12115.     /* Local Bit */
  12116.     insert into spt_provider_types values
  12117.         (
  12118.         50 /*SQLBIT*/,            /* ss_dtype */
  12119.         0,                /* fixlen */
  12120.         'bit',                /* type_name */
  12121.         11 /*DBTYPE_BOOL*/,        /* oledb_data_type */
  12122.         1,                /* best_match */
  12123.         null,                /* is_nullable */
  12124.         0,                /* case_sensitive */
  12125.         0,                /* fixed_prec_scale */
  12126.         0,                /* is_long */
  12127.         0,                /* auto_unique_value */
  12128.         1,                /* data_precision */
  12129.         null,                /* numeric_scale */
  12130.         null,                /* column_size */
  12131.         null,                /* literal_prefix */
  12132.         null,                /* literal_suffix */
  12133.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12134.         null,                /* unsigned_attribute */
  12135.         'bit'                /* local_type_name */
  12136.         )        
  12137.     
  12138.     /* Local Timestamp */
  12139.     insert into spt_provider_types values
  12140.         (
  12141.         0,                /* ss_dtype */
  12142.         8,                /* fixlen */
  12143.         'timestamp',            /* type_name */
  12144.         128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  12145.         0,                /* best_match */
  12146.         null,                /* is_nullable */
  12147.         0,                /* case_sensitive */
  12148.         0,                /* fixed_prec_scale */
  12149.         0,                /* is_long */
  12150.         0,                /* auto_unique_value */
  12151.         null,                /* data_precision */
  12152.         null,                /* numeric_scale */
  12153.         null,                /* column_size */
  12154.         '0x',                /* literal_prefix */
  12155.         null,                /* literal_suffix */
  12156.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12157.         null,                /* unsigned_attribute */
  12158.         'timestamp'            /* local_type_name */
  12159.         )    
  12160.     /* Local GUID */
  12161.     insert into spt_provider_types values
  12162.         (
  12163.         0,                /* ss_dtype */
  12164.         16,                /* fixlen */
  12165.         'uniqueidentifier',        /* type_name */
  12166.         72 /*DBTYPE_GUID*/,        /* oledb_data_type */
  12167.         1,                /* best_match */
  12168.         null,                /* is_nullable */
  12169.         0,                /* case_sensitive */
  12170.         0,                /* fixed_prec_scale */
  12171.         0,                /* is_long */
  12172.         0,                /* auto_unique_value */
  12173.         null,                /* data_precision */
  12174.         null,                /* numeric_scale */
  12175.         null,                /* column_size */
  12176.         '''',                /* literal_prefix */
  12177.         '''',                /* literal_suffix */
  12178.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12179.         null,                /* unsigned_attribute */
  12180.         'uniqueidentifier'        /* local_type_name */
  12181.         )    
  12182.     
  12183.     /* Get case sensitivity */
  12184.     declare @ncase_sensitive bit
  12185.     select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
  12186.  
  12187.     /* Local NChar */
  12188.     insert into spt_provider_types values
  12189.         (
  12190.         0,                /* ss_dtype */
  12191.         0,                /* fixlen */
  12192.         'nchar',            /* type_name */
  12193.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  12194.         0,                /* best_match */
  12195.         null,                /* is_nullable */
  12196.         @ncase_sensitive,        /* case_sensitive */
  12197.         0,                /* fixed_prec_scale */
  12198.         0,                /* is_long */
  12199.         0,                /* auto_unique_value */
  12200.         null,                /* data_precision */
  12201.         null,                /* numeric_scale */
  12202.         null,                /* column_size */
  12203.         'N''',                /* literal_prefix */
  12204.         '''',                /* literal_suffix */
  12205.         4 /*DB_SEARCHABLE*/,        /* searchable */
  12206.         null,                /* unsigned_attribute */
  12207.         'nchar'                /* local_type_name */
  12208.         )    
  12209.  
  12210.     /* Local NVarChar */
  12211.     insert into spt_provider_types values
  12212.         (
  12213.         0,                /* ss_dtype */
  12214.         null,                /* fixlen */
  12215.         'nvarchar',            /* type_name */
  12216.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  12217.         1,                /* best_match */
  12218.         null,                /* is_nullable */
  12219.         @ncase_sensitive,        /* case_sensitive */
  12220.         0,                /* fixed_prec_scale */
  12221.         0,                /* is_long */
  12222.         0,                /* auto_unique_value */
  12223.         null,                /* data_precision */
  12224.         null,                /* numeric_scale */
  12225.         null,                /* column_size */
  12226.         'N''',                /* literal_prefix */
  12227.         '''',                /* literal_suffix */
  12228.         4 /*DB_SEARCHABLE*/,        /* searchable */
  12229.         null,                /* unsigned_attribute */
  12230.         'nvarchar'            /* local_type_name */
  12231.         )    
  12232.  
  12233.     /* Local NText */
  12234.     insert into spt_provider_types values
  12235.         (
  12236.         0,                /* ss_dtype */
  12237.         null,                /* fixlen */
  12238.         'ntext',            /* type_name */
  12239.         130 /*DBTYPE_WSTR*/,        /* oledb_data_type */
  12240.         0,                /* best_match */
  12241.         null,                /* is_nullable */
  12242.         @ncase_sensitive,        /* case_sensitive */
  12243.         0,                /* fixed_prec_scale */
  12244.         1,                /* is_long */
  12245.         0,                /* auto_unique_value */
  12246.         null,                /* data_precision */
  12247.         null,                /* numeric_scale */
  12248.         1073741823,            /* column_size */
  12249.         'N''',                /* literal_prefix */
  12250.         '''',                /* literal_suffix */
  12251.         2 /*DB_LIKE_ONLY*/,        /* searchable */
  12252.         null,                /* unsigned_attribute */
  12253.         'ntext'                /* local_type_name */
  12254.         )    
  12255.  
  12256.     if (charindex('8.00', @@version) > 0)
  12257.     begin
  12258.     /* Local BIGINT */
  12259.     insert into spt_provider_types values
  12260.         (
  12261.         127,                /* ss_dtype */
  12262.         8,                /* fixlen */
  12263.         'bigint',            /* type_name */
  12264.         20 /*DBTYPE_I8*/,        /* oledb_data_type */
  12265.         1,                /* best_match */
  12266.         null,                /* is_nullable */
  12267.         0,                /* case_sensitive */
  12268.         1,                /* fixed_prec_scale */
  12269.         0,                /* is_long */
  12270.         1,                /* auto_unique_value */
  12271.         19,                /* data_precision */
  12272.         null,            /* numeric_scale */
  12273.         null,            /* column_size */
  12274.         null,            /* literal_prefix */
  12275.         null,            /* literal_suffix */
  12276.         3 /*DB_ALL_EXCEPT_LIKE*/,        /* searchable */
  12277.         0,                /* unsigned_attribute */
  12278.         'bigint'        /* local_type_name */
  12279.         )
  12280.  
  12281.     /* sql_variant */
  12282.     insert into spt_provider_types values
  12283.         (
  12284.         98,                /* ss_dtype */
  12285.         null,            /* fixlen */
  12286.         'sql_variant',    /* type_name */
  12287.         12 /*DBTYPE_VARIANT*/,        /* oledb_data_type */
  12288.         1,                /* best_match */
  12289.         null,            /* is_nullable */
  12290.         0,                /* case_sensitive */
  12291.         0,                /* fixed_prec_scale */
  12292.         0,                /* is_long */
  12293.         0,                /* auto_unique_value */
  12294.         16,                /* data_precision sizeof(VARIANT)*/
  12295.         null,            /* numeric_scale */
  12296.         null,            /* column_size */
  12297.         null,            /* literal_prefix */
  12298.         null,            /* literal_suffix */
  12299.         3 ,                    /*DB_ALL_EXCEPT_LIKE*/
  12300.         null,            /* unsigned_attribute */
  12301.         'sql_variant'    /* local_type_name */
  12302.         )
  12303.     end
  12304.  
  12305.  
  12306.     /* data types changed in Sphinx: DO AFTER ALL TYPES INSERTED! */    
  12307.     update spt_provider_types set ss_dtype = (select xtype from systypes    where type_name like name+'%')
  12308.  
  12309.     end
  12310. commit tran
  12311. go
  12312. dump tran master with no_log
  12313. go
  12314. begin tran
  12315. if (charindex('7.00', @@version) = 0 and
  12316.     charindex('8.00', @@version) = 0)
  12317.     begin
  12318.     /* Local Bit */
  12319.     insert into spt_provider_types values
  12320.         (
  12321.         50 /*SQLBIT*/,            /* ss_dtype */
  12322.         0,                /* fixlen */
  12323.         'bit',                /* type_name */
  12324.         11 /*DBTYPE_BOOL*/,        /* oledb_data_type */
  12325.         1,                /* best_match */
  12326.         0,                /* is_nullable */
  12327.         0,                /* case_sensitive */
  12328.         0,                /* fixed_prec_scale */
  12329.         0,                /* is_long */
  12330.         0,                /* auto_unique_value */
  12331.         1,                /* data_precision */
  12332.         null,                /* numeric_scale */
  12333.         null,                /* column_size */
  12334.         null,                /* literal_prefix */
  12335.         null,                /* literal_suffix */
  12336.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12337.         null,                /* unsigned_attribute */
  12338.         'bit'                /* local_type_name */
  12339.         )    
  12340.  
  12341.     /* Local Timestamp */
  12342.     insert into spt_provider_types values
  12343.         (
  12344.         45 /*SQLBINARY*/,        /* ss_dtype */
  12345.         8,                /* fixlen */
  12346.         'timestamp',            /* type_name */
  12347.         128 /*DBTYPE_BYTES*/,        /* oledb_data_type */
  12348.         0,                /* best_match */
  12349.         null,                /* is_nullable */
  12350.         0,                /* case_sensitive */
  12351.         0,                /* fixed_prec_scale */
  12352.         0,                /* is_long */
  12353.         0,                /* auto_unique_value */
  12354.         null,                /* data_precision */
  12355.         null,                /* numeric_scale */
  12356.         null,                /* column_size */
  12357.         '0x',                /* literal_prefix */
  12358.         null,                /* literal_suffix */
  12359.         3 /*DB_ALL_EXCEPT_LIKE*/,    /* searchable */
  12360.         null,                /* unsigned_attribute */
  12361.         'timestamp'            /* local_type_name */
  12362.         )        
  12363. end
  12364.  
  12365. commit tran
  12366. go
  12367. dump tran master with no_log
  12368. go
  12369.  
  12370. create unique clustered index datatypeinfoclust on spt_provider_types(ss_dtype,fixlen)
  12371. go
  12372.  
  12373. dump tran master with no_log
  12374. go
  12375. if (charindex('6.00', @@version) > 0)
  12376.     begin
  12377.     if (exists (select * from sysobjects
  12378.         where name = 'spt_provider_types' and type = 'U '))
  12379.         begin
  12380.         drop table spt_provider_types
  12381.         dump tran master with no_log
  12382.         end
  12383.     end
  12384. go
  12385.  
  12386. if (charindex('7.00', @@version) = 0 and
  12387.     charindex('8.00', @@version) = 0)
  12388. begin
  12389.     print ''
  12390.     print ''
  12391.     print 'Warning:'
  12392.     print 'you are installing the stored procedures '
  12393.     print 'on a pre 8.0 SQL Server.'
  12394.     print 'Ignore the following errors.'
  12395. end
  12396. go
  12397.  
  12398.  
  12399. /* 
  12400. ** (2/11/98) 
  12401. ** The following SP is shared by instcat.sql and the server to add information
  12402. ** related to server language collations. The server calls it at the end of
  12403. ** collation change to update the catalog with the new language collations
  12404. ** Everything in this SP should NOT use tempdb.  
  12405. */
  12406.  
  12407. create procedure sp_add_server_sortinfo
  12408. as
  12409. -- spt_server_info has unigue clustered index on attribute_id
  12410. delete spt_server_info where attribute_id in (16,18)
  12411.  
  12412. --insert into spt_server_info
  12413. --    select 18,'COLLATION_SEQ',
  12414. --        'charset='+t2.name+' sort_order='+t1.name
  12415. --        +' charset_num='+rtrim(convert(char(4),t1.csid))+
  12416. --        ' sort_order_num='+rtrim(convert(char(4),t1.id))
  12417. --    from master.dbo.syscharsets t1, master.dbo.syscharsets t2, master.dbo.sysconfigures t3
  12418. --    where t1.csid=t2.id and t1.id=t3.value and t3.config in (123,1123)
  12419. declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)
  12420. declare @case_sensitive bit
  12421. declare @ncase_sensitive bit
  12422. select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
  12423. select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
  12424. select @sortid = value from sysconfigures where config = 1123
  12425. select @csid = csid, @sortname = name from master.dbo.syscharsets where id = @sortid
  12426. select @attribute_value = 'charset='+ name +' sort_order=' + @sortname
  12427.         + ' charset_num=' + rtrim(convert(char(4),@csid))+
  12428.         ' sort_order_num=' + rtrim(convert(char(4),@sortid))
  12429.         from syscharsets where id = @csid
  12430.  
  12431. insert into spt_server_info
  12432.         values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))
  12433.  
  12434. if @case_sensitive = 1 /* If case sensitive server */
  12435. begin
  12436.     insert into spt_server_info
  12437.         values (16,'IDENTIFIER_CASE','SENSITIVE')
  12438. end
  12439. else
  12440. begin
  12441.     insert into spt_server_info
  12442.         values (16,'IDENTIFIER_CASE','MIXED')
  12443. end
  12444.  
  12445.  
  12446. update spt_datatype_info set CASE_SENSITIVE = @case_sensitive 
  12447.     where DATA_TYPE in (-1, 1, 12) /* CHAR types */
  12448. update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive
  12449.     where DATA_TYPE in (-10, -9, -8) /* NCHAR types */
  12450. update spt_provider_types set case_sensitive = @case_sensitive 
  12451.     where oledb_data_type = 129 /*DBTYPE_STR*/
  12452. update spt_provider_types set case_sensitive = @ncase_sensitive
  12453.     where oledb_data_type = 130 /*DBTYPE_WSTR*/
  12454. /* sp_add_server_sortinfo */
  12455. go  
  12456.  
  12457.  
  12458. if (charindex('7.00', @@version) > 0)
  12459. begin
  12460.     exec sp_add_server_sortinfo
  12461. end
  12462. go
  12463.  
  12464. -- 8.0 version of sp_add_server_sortinfo
  12465. --
  12466. create procedure sp_add_server_sortinfo75
  12467. as
  12468. -- spt_server_info has unigue clustered index on attribute_id
  12469.     delete spt_server_info where attribute_id in (16, 18)
  12470.  
  12471.     declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)
  12472.     declare @case_sensitive bit
  12473.     declare @ncase_sensitive bit
  12474.     select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
  12475.     select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
  12476.  
  12477.     select @sortid = convert(int, ServerProperty('sqlsortorder')) 
  12478.     select @csid = convert(int, ServerProperty('sqlcharset')) 
  12479.     select @sortname = name from master.dbo.syscharsets where id = @sortid
  12480.  
  12481.     if @sortid = 0 -- Non-SQL Collations
  12482.         BEGIN
  12483.         select @attribute_value = 'charset=' 
  12484.             + name
  12485.             + ' collation=' + isnull(convert(sysname, ServerProperty('collation')), ' ')
  12486.             from syscharsets where id = @csid
  12487.         END
  12488.     else
  12489.         BEGIN
  12490.         select @attribute_value = 'charset='+ name +' sort_order=' + @sortname
  12491.             + ' charset_num=' + rtrim(convert(char(4),@csid))+
  12492.             ' sort_order_num=' + rtrim(convert(char(4),@sortid))
  12493.             from syscharsets where id = @csid
  12494.         END
  12495.  
  12496.     insert into spt_server_info
  12497.             values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))
  12498.  
  12499.     if @case_sensitive = 1 /* If case sensitive server */
  12500.     begin
  12501.         insert into spt_server_info
  12502.             values (16,'IDENTIFIER_CASE','SENSITIVE')
  12503.     end
  12504.     else
  12505.     begin
  12506.         insert into spt_server_info
  12507.             values (16,'IDENTIFIER_CASE','MIXED')
  12508.     end
  12509.  
  12510.  
  12511.     update spt_datatype_info set CASE_SENSITIVE = @case_sensitive 
  12512.         where DATA_TYPE in (-1, 1, 12) /* CHAR types */
  12513.     update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive
  12514.         where DATA_TYPE in (-10, -9, -8) /* NCHAR types */
  12515.     update spt_provider_types set case_sensitive = @case_sensitive 
  12516.         where oledb_data_type = 129 /*DBTYPE_STR*/
  12517.     update spt_provider_types set case_sensitive = @ncase_sensitive
  12518.         where oledb_data_type = 130 /*DBTYPE_WSTR*/
  12519. /* sp_add_server_info75 */
  12520. go 
  12521.  
  12522.  
  12523.  
  12524. if (charindex('8.00', @@version) > 0)
  12525. begin
  12526.     exec sp_add_server_sortinfo75
  12527. end
  12528. go
  12529.  
  12530. print ''
  12531. print 'creating sp_catalogs_rowset'
  12532. go
  12533.  
  12534. create procedure sp_catalogs_rowset
  12535.     (
  12536.     @catalog_name        varchar(255)
  12537.     )        
  12538. as
  12539.     select
  12540.         CATALOG_NAME    = name,
  12541.         DESCRIPTION    = convert(varchar(1),null)
  12542.     from     master.dbo.sysdatabases
  12543.     where    name = @catalog_name
  12544. go
  12545. dump tran master with no_log
  12546. go
  12547. create procedure sp_catalogs_rowset;2
  12548.     (
  12549.     @dummy        int /* remove when Hydra bug 17032 is fixed */
  12550.     )
  12551. as
  12552.     select
  12553.         CATALOG_NAME    = name,
  12554.         DESCRIPTION    = convert(varchar(1),null)
  12555.     from     master.dbo.sysdatabases
  12556.     order by 1
  12557. go
  12558. dump tran master with no_log
  12559. go
  12560.  
  12561. if (charindex('7.00', @@version) = 0 and
  12562.     charindex('8.00', @@version) = 0)
  12563. begin
  12564.     print ''
  12565.     print ''
  12566.     print 'Warning:'
  12567.     print 'you are installing the stored procedures '
  12568.     print 'on a pre 8.0 SQL Server.'
  12569.     print 'Ignore the following errors.'
  12570. end
  12571. else
  12572.     drop proc sp_catalogs_rowset
  12573. go
  12574.  
  12575. /*    Procedure for 8.0 server */
  12576. create procedure sp_catalogs_rowset
  12577.     (
  12578.     @catalog_name        sysname
  12579.     )        
  12580. as
  12581.     select
  12582.         CATALOG_NAME    = name,
  12583.         DESCRIPTION    = convert(nvarchar(1),null)
  12584.     from     master.dbo.sysdatabases
  12585.     where    name = @catalog_name
  12586. go
  12587. dump tran master with no_log
  12588. go
  12589. create procedure sp_catalogs_rowset;2
  12590.     (
  12591.     @dummy        int /* remove when Hydra bug 17032 is fixed */
  12592.     )
  12593. as
  12594.     select
  12595.         CATALOG_NAME    = name,
  12596.         DESCRIPTION    = convert(nvarchar(1),null)
  12597.     from     master.dbo.sysdatabases
  12598.     order by 1
  12599. go
  12600. dump tran master with no_log
  12601. go
  12602. create procedure sp_catalogs_rowset;5
  12603.     (
  12604.     @server_name    sysname,
  12605.     @catalog_name    sysname = NULL
  12606.     )
  12607. as
  12608.     select    CATALOG_NAME,
  12609.         DESCRIPTION
  12610.     from master.dbo.SYSREMOTE_CATALOGS < @server_name, @catalog_name >
  12611.     order by 1
  12612. go
  12613.  
  12614. grant execute on sp_catalogs_rowset to public
  12615. go
  12616.  
  12617. dump tran master with no_log
  12618. go
  12619. if (charindex('6.00', @@version) > 0)
  12620.     begin
  12621.     if (exists (select * from sysobjects
  12622.             where name = 'sp_catalogs_rowset' and type = 'P '))
  12623.         begin
  12624.         drop procedure sp_catalogs_rowset
  12625.         dump tran master with no_log
  12626.         end
  12627.     end
  12628. go
  12629.  
  12630.  
  12631. print ''
  12632. print 'creating sp_column_privileges_rowset'
  12633. go
  12634.  
  12635. /*    Procedure for 6.0 and 6.5 server */
  12636. CREATE PROCEDURE sp_column_privileges_rowset
  12637.     (
  12638.     @table_name     varchar(255) = null,
  12639.     @table_schema    varchar(255) = null,
  12640.     @column_name    varchar(255) = null,
  12641.     @grantor    varchar(255) = null,
  12642.     @grantee    varchar(255) = null
  12643.     )
  12644. as
  12645. IF @table_name is not null
  12646.     BEGIN
  12647.     select
  12648.         GRANTOR        = user_name(p.grantor),
  12649.         GRANTEE        = user_name(u.uid),
  12650.         TABLE_CATALOG    = db_name(),
  12651.         TABLE_SCHEMA    = user_name(o.uid),
  12652.         TABLE_NAME    = o.name,
  12653.         COLUMN_NAME    = c.name,
  12654.         COLUMN_GUID    = convert(binary(16),null),
  12655.         COLUMN_PROPID    = convert(int,null),
  12656.         PRIVILEGE_TYPE    = convert(varchar(30),
  12657.                     case p.action
  12658.                     when 193 then 'SELECT'
  12659.                     when 195 then 'INSERT'
  12660.                     when 197 then 'UPDATE'
  12661.                     else 'REFERENCES'
  12662.                     end),
  12663.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  12664.     from 
  12665.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  12666.     where
  12667.         o.name = @table_name
  12668.     and     o.type in ('U','V','S')
  12669.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12670.     and    c.id = o.id
  12671.     and     (@column_name is null or @column_name = c.name)
  12672.     and     c.id = p.id
  12673.     and    (@grantor is null or @grantor = user_name(p.grantor))
  12674.     and     case 
  12675.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12676.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  12677.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  12678.             end & v.high <> 0            /* permission applies to this column */
  12679.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  12680.     and     v.type = 'P'
  12681.     and     v.number = c.colid
  12682.     and    (@grantee is null or @grantee = user_name(u.uid))
  12683.             /* expand groups */
  12684.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  12685.     and     p.protecttype <> 206    /* only grant rows */
  12686.     and     p.action in (26,193,195,197)
  12687.     and     o.uid <> u.uid            /* no rows for owner */
  12688.     and     not exists (            /* exclude revoke'd privileges */
  12689.             select *
  12690.             from sysprotects p1
  12691.             where
  12692.                 p1.protecttype = 206
  12693.             and     p1.action = p.action
  12694.             and     p1.id = p.id
  12695.             and     p1.uid = u.uid
  12696.             and     case 
  12697.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12698.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  12699.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  12700.                 end & v.high <> 0)            /* permission applies to this column */
  12701.     union
  12702.     select    /*    Add rows for table owner */
  12703.         GRANTOR        = user_name(u.uid),
  12704.         GRANTEE        = user_name(o.uid),
  12705.         TABLE_CATALOG    = db_name(),
  12706.         TABLE_SCHEMA    = user_name(o.uid),
  12707.         TABLE_NAME    = o.name,
  12708.         COLUMN_NAME    = c.name,
  12709.         COLUMN_GUID    = convert(binary(16),null),
  12710.         COLUMN_PROPID    = convert(int,null),
  12711.         PRIVILEGE_TYPE    = convert(varchar(30),
  12712.                     case v.number
  12713.                     when 193 then 'SELECT'
  12714.                     when 195 then 'INSERT'
  12715.                     when 197 then 'UPDATE'
  12716.                     else 'REFERENCES'
  12717.                     end),
  12718.         IS_GRANTABLE    = convert(bit,1)    
  12719.     from 
  12720.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  12721.     where
  12722.         o.name = @table_name
  12723.     and     o.type in ('U','V','S')
  12724.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12725.     and    (@grantee is null or @grantee = user_name(o.uid))
  12726.     and    c.id = o.id
  12727.     and     (@column_name is null or @column_name = c.name)
  12728.     and     u.uid = 1        /* grantor is dbo of database */
  12729.     and    (@grantor is null or @grantor = user_name(u.uid))
  12730.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  12731.     and     v.number in (26,193,195,197)
  12732.     and     not exists (        /* exclude revoke'd privileges */
  12733.             select *
  12734.             from     sysprotects p1
  12735.             where    p1.protecttype = 206
  12736.             and     p1.action = v.number
  12737.             and     p1.id = o.id
  12738.             and     p1.uid = o.uid)
  12739.     order by 4, 5, 6, 9, 1, 2
  12740.     END
  12741. ELSE
  12742.     BEGIN
  12743.     select
  12744.         GRANTOR        = user_name(p.grantor),
  12745.         GRANTEE        = user_name(u.uid),
  12746.         TABLE_CATALOG    = db_name(),
  12747.         TABLE_SCHEMA    = user_name(o.uid),
  12748.         TABLE_NAME    = o.name,
  12749.         COLUMN_NAME    = c.name,
  12750.         COLUMN_GUID    = convert(binary(16),null),
  12751.         COLUMN_PROPID    = convert(int,null),
  12752.         PRIVILEGE_TYPE    = convert(varchar(30),
  12753.                     case p.action
  12754.                     when 193 then 'SELECT'
  12755.                     when 195 then 'INSERT'
  12756.                     when 197 then 'UPDATE'
  12757.                     else 'REFERENCES'
  12758.                     end),
  12759.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  12760.     from 
  12761.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  12762.     where
  12763.         o.type in ('U','V','S')
  12764.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12765.     and    c.id = o.id
  12766.     and     (@column_name is null or @column_name = c.name)
  12767.     and     c.id = p.id
  12768.     and    (@grantor is null or @grantor = user_name(p.grantor))
  12769.     and     case 
  12770.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12771.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  12772.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  12773.             end & v.high <> 0            /* permission applies to this column */
  12774.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  12775.     and     v.type = 'P'
  12776.     and     v.number = c.colid
  12777.     and    (@grantee is null or @grantee = user_name(u.uid))
  12778.             /* expand groups */
  12779.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  12780.     and     p.protecttype <> 206    /* only grant rows */
  12781.     and     p.action in (26,193,195,197)
  12782.     and     o.uid <> u.uid            /* no rows for owner */
  12783.     and     not exists (            /* exclude revoke'd privileges */
  12784.             select *
  12785.             from sysprotects p1
  12786.             where
  12787.                 p1.protecttype = 206
  12788.             and     p1.action = p.action
  12789.             and     p1.id = p.id
  12790.             and     p1.uid = u.uid
  12791.             and     case 
  12792.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12793.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  12794.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  12795.                 end & v.high <> 0)            /* permission applies to this column */
  12796.     union
  12797.     select    /*    Add rows for table owner */
  12798.         GRANTOR        = user_name(u.uid),
  12799.         GRANTEE        = user_name(o.uid),
  12800.         TABLE_CATALOG    = db_name(),
  12801.         TABLE_SCHEMA    = user_name(o.uid),
  12802.         TABLE_NAME    = o.name,
  12803.         COLUMN_NAME    = c.name,
  12804.         COLUMN_GUID    = convert(binary(16),null),
  12805.         COLUMN_PROPID    = convert(int,null),
  12806.         PRIVILEGE_TYPE    = convert(varchar(30),
  12807.                     case v.number
  12808.                     when 193 then 'SELECT'
  12809.                     when 195 then 'INSERT'
  12810.                     when 197 then 'UPDATE'
  12811.                     else 'REFERENCES'
  12812.                     end),
  12813.         IS_GRANTABLE    = convert(bit,1)    
  12814.     from 
  12815.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  12816.     where
  12817.          o.type in ('U','V','S')
  12818.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12819.     and    (@grantee is null or @grantee = user_name(o.uid))
  12820.     and    c.id = o.id
  12821.     and     (@column_name is null or @column_name = c.name)
  12822.     and     u.uid = 1        /* grantor is dbo of database */
  12823.     and    (@grantor is null or @grantor = user_name(u.uid))
  12824.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  12825.     and     v.number in (26,193,195,197)
  12826.     and     not exists (        /* exclude revoke'd privileges */
  12827.             select *
  12828.             from     sysprotects p1
  12829.             where    p1.protecttype = 206
  12830.             and     p1.action = v.number
  12831.             and     p1.id = o.id
  12832.             and     p1.uid = o.uid)
  12833.     order by 4, 5, 6, 9, 1, 2
  12834.     END
  12835. go
  12836. dump tran master with no_log
  12837. go
  12838. CREATE PROCEDURE sp_column_privileges_rowset;2
  12839.     (
  12840.        @handle        int output,
  12841.        @scrollopt    int output,
  12842.     @ccopt        int output,
  12843.     @rows        int output,
  12844.     @table_name     varchar(255) = null,
  12845.     @table_schema    varchar(255) = null,
  12846.     @column_name    varchar(255) = null,
  12847.     @grantor    varchar(255) = null,
  12848.     @grantee    varchar(255) = null
  12849.     )
  12850. as
  12851.  
  12852. declare @ret int
  12853.  
  12854. SET NOCOUNT ON
  12855.     
  12856. create table #spcprivsrowset1
  12857.     (
  12858.     GRANTOR        sysname not null,
  12859.     GRANTEE        sysname not null,
  12860.     TABLE_CATALOG    sysname not null,
  12861.     TABLE_SCHEMA    sysname not null,
  12862.     TABLE_NAME    sysname not null,
  12863.     COLUMN_NAME    sysname not null,
  12864.     COLUMN_GUID    binary(16) null,
  12865.     COLUMN_PROPID    int null,
  12866.     PRIVILEGE_TYPE    sysname not null,
  12867.     IS_GRANTABLE    bit not null
  12868.     )
  12869.  
  12870. IF @table_name is not null
  12871.     BEGIN
  12872.     insert into #spcprivsrowset1
  12873.     select
  12874.         GRANTOR        = user_name(p.grantor),
  12875.         GRANTEE        = user_name(u.uid),
  12876.         TABLE_CATALOG    = db_name(),
  12877.         TABLE_SCHEMA    = user_name(o.uid),
  12878.         TABLE_NAME    = o.name,
  12879.         COLUMN_NAME    = c.name,
  12880.         COLUMN_GUID    = convert(binary(16),null),
  12881.         COLUMN_PROPID    = convert(int,null),
  12882.         PRIVILEGE_TYPE    = convert(varchar(30),
  12883.                     case p.action
  12884.                     when 193 then 'SELECT'
  12885.                     when 195 then 'INSERT'
  12886.                     when 197 then 'UPDATE'
  12887.                     else 'REFERENCES'
  12888.                     end),
  12889.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  12890.     from 
  12891.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  12892.     where
  12893.         o.name = @table_name
  12894.     and     o.type in ('U','V','S')
  12895.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12896.     and    c.id = o.id
  12897.     and     (@column_name is null or @column_name = c.name)
  12898.     and     c.id = p.id
  12899.     and    (@grantor is null or @grantor = user_name(p.grantor))
  12900.     and     case 
  12901.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12902.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  12903.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  12904.             end & v.high <> 0            /* permission applies to this column */
  12905.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  12906.     and     v.type = 'P'
  12907.     and     v.number = c.colid
  12908.     and    (@grantee is null or @grantee = user_name(u.uid))
  12909.             /* expand groups */
  12910.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  12911.     and     p.protecttype <> 206    /* only grant rows */
  12912.     and     p.action in (26,193,195,197)
  12913.     and     o.uid <> u.uid            /* no rows for owner */
  12914.     and     not exists (            /* exclude revoke'd privileges */
  12915.             select *
  12916.             from sysprotects p1
  12917.             where
  12918.                 p1.protecttype = 206
  12919.             and     p1.action = p.action
  12920.             and     p1.id = p.id
  12921.             and     p1.uid = u.uid
  12922.             and     case 
  12923.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12924.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  12925.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  12926.                 end & v.high <> 0)            /* permission applies to this column */
  12927.     union
  12928.     select    /*    Add rows for table owner */
  12929.         GRANTOR        = user_name(u.uid),
  12930.         GRANTEE        = user_name(o.uid),
  12931.         TABLE_CATALOG    = db_name(),
  12932.         TABLE_SCHEMA    = user_name(o.uid),
  12933.         TABLE_NAME    = o.name,
  12934.         COLUMN_NAME    = c.name,
  12935.         COLUMN_GUID    = convert(binary(16),null),
  12936.         COLUMN_PROPID    = convert(int,null),
  12937.         PRIVILEGE_TYPE    = convert(varchar(30),
  12938.                     case v.number
  12939.                     when 193 then 'SELECT'
  12940.                     when 195 then 'INSERT'
  12941.                     when 197 then 'UPDATE'
  12942.                     else 'REFERENCES'
  12943.                     end),
  12944.         IS_GRANTABLE    = convert(bit,1)    
  12945.     from 
  12946.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  12947.     where
  12948.         o.name = @table_name
  12949.     and     o.type in ('U','V','S')
  12950.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12951.     and    (@grantee is null or @grantee = user_name(o.uid))
  12952.     and    c.id = o.id
  12953.     and     (@column_name is null or @column_name = c.name)
  12954.     and     u.uid = 1        /* grantor is dbo of database */
  12955.     and    (@grantor is null or @grantor = user_name(u.uid))
  12956.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  12957.     and     v.number in (26,193,195,197)
  12958.     and     not exists (        /* exclude revoke'd privileges */
  12959.             select *
  12960.             from     sysprotects p1
  12961.             where    p1.protecttype = 206
  12962.             and     p1.action = v.number
  12963.             and     p1.id = o.id
  12964.             and     p1.uid = o.uid)
  12965.     order by 4, 5, 6, 9, 1, 2
  12966.     END
  12967. ELSE
  12968.     BEGIN
  12969.     insert into #spcprivsrowset1
  12970.     select
  12971.         GRANTOR        = user_name(p.grantor),
  12972.         GRANTEE        = user_name(u.uid),
  12973.         TABLE_CATALOG    = db_name(),
  12974.         TABLE_SCHEMA    = user_name(o.uid),
  12975.         TABLE_NAME    = o.name,
  12976.         COLUMN_NAME    = c.name,
  12977.         COLUMN_GUID    = convert(binary(16),null),
  12978.         COLUMN_PROPID    = convert(int,null),
  12979.         PRIVILEGE_TYPE    = convert(varchar(30),
  12980.                     case p.action
  12981.                     when 193 then 'SELECT'
  12982.                     when 195 then 'INSERT'
  12983.                     when 197 then 'UPDATE'
  12984.                     else 'REFERENCES'
  12985.                     end),
  12986.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  12987.     from 
  12988.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
  12989.     where
  12990.         o.type in ('U','V','S')
  12991.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  12992.     and    c.id = o.id
  12993.     and     (@column_name is null or @column_name = c.name)
  12994.     and     c.id = p.id
  12995.     and    (@grantor is null or @grantor = user_name(p.grantor))
  12996.     and     case 
  12997.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  12998.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  12999.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  13000.             end & v.high <> 0            /* permission applies to this column */
  13001.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  13002.     and     v.type = 'P'
  13003.     and     v.number = c.colid
  13004.     and    (@grantee is null or @grantee = user_name(u.uid))
  13005.             /* expand groups */
  13006.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  13007.     and     p.protecttype <> 206    /* only grant rows */
  13008.     and     p.action in (26,193,195,197)
  13009.     and     o.uid <> u.uid            /* no rows for owner */
  13010.     and     not exists (            /* exclude revoke'd privileges */
  13011.             select *
  13012.             from sysprotects p1
  13013.             where
  13014.                 p1.protecttype = 206
  13015.             and     p1.action = p.action
  13016.             and     p1.id = p.id
  13017.             and     p1.uid = u.uid
  13018.             and     case 
  13019.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  13020.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  13021.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  13022.                 end & v.high <> 0)            /* permission applies to this column */
  13023.     union
  13024.     select    /*    Add rows for table owner */
  13025.         GRANTOR        = user_name(u.uid),
  13026.         GRANTEE        = user_name(o.uid),
  13027.         TABLE_CATALOG    = db_name(),
  13028.         TABLE_SCHEMA    = user_name(o.uid),
  13029.         TABLE_NAME    = o.name,
  13030.         COLUMN_NAME    = c.name,
  13031.         COLUMN_GUID    = convert(binary(16),null),
  13032.         COLUMN_PROPID    = convert(int,null),
  13033.         PRIVILEGE_TYPE    = convert(varchar(30),
  13034.                     case v.number
  13035.                     when 193 then 'SELECT'
  13036.                     when 195 then 'INSERT'
  13037.                     when 197 then 'UPDATE'
  13038.                     else 'REFERENCES'
  13039.                     end),
  13040.         IS_GRANTABLE    = convert(bit,1)    
  13041.     from 
  13042.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  13043.     where
  13044.          o.type in ('U','V','S')
  13045.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13046.     and    (@grantee is null or @grantee = user_name(o.uid))
  13047.     and    c.id = o.id
  13048.     and     (@column_name is null or @column_name = c.name)
  13049.     and     u.uid = 1        /* grantor is dbo of database */
  13050.     and    (@grantor is null or @grantor = user_name(u.uid))
  13051.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  13052.     and     v.number in (26,193,195,197)
  13053.     and     not exists (        /* exclude revoke'd privileges */
  13054.             select *
  13055.             from     sysprotects p1
  13056.             where    p1.protecttype = 206
  13057.             and     p1.action = v.number
  13058.             and     p1.id = o.id
  13059.             and     p1.uid = o.uid)
  13060.     order by 4, 5, 6, 9, 1, 2
  13061.     END
  13062.  
  13063. exec @ret = sp_cursoropen @handle output, 'select * from #spcprivsrowset1',
  13064.     @scrollopt output, @ccopt output, @rows output
  13065.  
  13066. drop table #spcprivsrowset1
  13067.  
  13068. return isnull(@ret,0)
  13069. go
  13070. dump tran master with no_log
  13071. go
  13072. CREATE PROCEDURE sp_column_privileges_rowset;3
  13073. as
  13074.     select
  13075.         GRANTOR        = convert(sysname,' '),
  13076.         GRANTEE        = convert(sysname,' '),
  13077.         TABLE_CATALOG    = convert(sysname,' '),
  13078.         TABLE_SCHEMA    = convert(sysname,' '),
  13079.         TABLE_NAME    = convert(sysname,' '),
  13080.         COLUMN_NAME    = convert(sysname,' '),
  13081.         COLUMN_GUID    = convert(binary(16),null),
  13082.         COLUMN_PROPID    = convert(int,null),
  13083.         PRIVILEGE_TYPE    = convert(varchar(30),' '),
  13084.         IS_GRANTABLE    = convert(bit,1)
  13085.     where    1=0
  13086. go
  13087. dump tran master with no_log
  13088. go
  13089.  
  13090. if (charindex('7.00', @@version) = 0 and
  13091.     charindex('8.00', @@version) = 0)
  13092. begin
  13093.     print ''
  13094.     print ''
  13095.     print 'Warning:'
  13096.     print 'you are installing the stored procedures '
  13097.     print 'on a pre 8.0 SQL Server.'
  13098.     print 'Ignore the following errors.'
  13099. end
  13100. else
  13101.     drop proc sp_column_privileges_rowset
  13102. go
  13103.  
  13104.  
  13105. /*    Procedure for 8.0 server */
  13106. CREATE PROCEDURE sp_column_privileges_rowset
  13107.     (
  13108.     @table_name         sysname,
  13109.     @table_schema        sysname = null,
  13110.     @column_name        sysname = null,
  13111.     @grantor        sysname = null,
  13112.     @grantee        sysname = null
  13113.     )
  13114. as
  13115.     select
  13116.         GRANTOR        = user_name(p.grantor),
  13117.         GRANTEE        = user_name(u.uid),
  13118.         TABLE_CATALOG    = db_name(),
  13119.         TABLE_SCHEMA    = user_name(o.uid),
  13120.         TABLE_NAME    = o.name,
  13121.         COLUMN_NAME    = c.name,
  13122.         COLUMN_GUID    = convert(uniqueidentifier,null),
  13123.         COLUMN_PROPID    = convert(int,null),
  13124.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  13125.                     case p.action
  13126.                     when 193 then N'SELECT'
  13127.                     when 195 then N'INSERT'
  13128.                     when 197 then N'UPDATE'
  13129.                     else N'REFERENCES'
  13130.                     end),
  13131.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  13132.     from 
  13133.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  13134.     where
  13135.         o.name = @table_name
  13136.     and     o.type in ('U','V','S')
  13137.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13138.     and    c.id = o.id
  13139.     and     (@column_name is null or @column_name = c.name)
  13140.     and     c.id = p.id
  13141.     and    (@grantor is null or @grantor = user_name(p.grantor))
  13142.     and     case 
  13143.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  13144.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  13145.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  13146.             end & v.high <> 0            /* permission applies to this column */
  13147.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  13148.     and     v.type = 'P'
  13149.     and     v.number = c.colid
  13150.     and    (@grantee is null or @grantee = user_name(u.uid))
  13151.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  13152.     and     (u.uid > 0 and u.uid < 16384)
  13153.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  13154.     and     p.protecttype <> 206    /* only grant rows */
  13155.     and     p.action in (26,193,195,197)
  13156.     and     o.uid <> u.uid            /* no rows for owner */
  13157.     and     not exists (            /* exclude revoke'd privileges */
  13158.             select *
  13159.             from sysprotects p1
  13160.             where
  13161.                 p1.protecttype = 206
  13162.             and     p1.action = p.action
  13163.             and     p1.id = p.id
  13164.             and     p1.uid = u.uid
  13165.             and     case 
  13166.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  13167.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  13168.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  13169.                 end & v.high <> 0)            /* permission applies to this column */
  13170.     union
  13171.     select    /*    Add rows for table owner */
  13172.         GRANTOR        = user_name(u.uid),
  13173.         GRANTEE        = user_name(o.uid),
  13174.         TABLE_CATALOG    = db_name(),
  13175.         TABLE_SCHEMA    = user_name(o.uid),
  13176.         TABLE_NAME    = o.name,
  13177.         COLUMN_NAME    = c.name,
  13178.         COLUMN_GUID    = convert(uniqueidentifier,null),
  13179.         COLUMN_PROPID    = convert(int,null),
  13180.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  13181.                     case v.number
  13182.                     when 193 then N'SELECT'
  13183.                     when 195 then N'INSERT'
  13184.                     when 197 then N'UPDATE'
  13185.                     else N'REFERENCES'
  13186.                     end),
  13187.         IS_GRANTABLE    = convert(bit,1)    
  13188.     from 
  13189.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  13190.     where
  13191.         o.name = @table_name
  13192.     and     o.type in ('U','V','S')
  13193.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13194.     and    (@grantee is null or @grantee = user_name(o.uid))
  13195.     and    c.id = o.id
  13196.     and     (@column_name is null or @column_name = c.name)
  13197.     and     u.uid = 1        /* grantor is dbo of database */
  13198.     and    (@grantor is null or @grantor = user_name(u.uid))
  13199.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  13200.     and     v.number in (26,193,195,197)
  13201.     and     not exists (        /* exclude revoke'd privileges */
  13202.             select *
  13203.             from     sysprotects p1
  13204.             where    p1.protecttype = 206
  13205.             and     p1.action = v.number
  13206.             and     p1.id = o.id
  13207.             and     p1.uid = o.uid)
  13208.     order by 4, 5, 6, 9, 1, 2
  13209. go
  13210. dump tran master with no_log
  13211. go
  13212. CREATE PROCEDURE sp_column_privileges_rowset;2
  13213.     (
  13214.     @table_schema        sysname = null,
  13215.     @column_name        sysname = null,
  13216.     @grantor        sysname = null,
  13217.     @grantee        sysname = null
  13218.     )
  13219. as
  13220.     select
  13221.         GRANTOR        = user_name(p.grantor),
  13222.         GRANTEE        = user_name(u.uid),
  13223.         TABLE_CATALOG    = db_name(),
  13224.         TABLE_SCHEMA    = user_name(o.uid),
  13225.         TABLE_NAME    = o.name,
  13226.         COLUMN_NAME    = c.name,
  13227.         COLUMN_GUID    = convert(uniqueidentifier,null),
  13228.         COLUMN_PROPID    = convert(int,null),
  13229.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  13230.                     case p.action
  13231.                     when 193 then N'SELECT'
  13232.                     when 195 then N'INSERT'
  13233.                     when 197 then N'UPDATE'
  13234.                     else N'REFERENCES'
  13235.                     end),
  13236.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  13237.     from 
  13238.         sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
  13239.     where
  13240.         o.type in ('U','V','S')
  13241.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13242.     and    c.id = o.id
  13243.     and     (@column_name is null or @column_name = c.name)
  13244.     and     c.id = p.id
  13245.     and    (@grantor is null or @grantor = user_name(p.grantor))
  13246.     and     case 
  13247.             when substring(p.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  13248.             when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
  13249.             else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
  13250.             end & v.high <> 0            /* permission applies to this column */
  13251.     and     v.number <= (select count(*) from syscolumns where id = o.id)    /* ranges from 1 to # of columns in table */
  13252.     and     v.type = 'P'
  13253.     and     v.number = c.colid
  13254.     and    (@grantee is null or @grantee = user_name(u.uid))
  13255.         /* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
  13256.     and     (u.uid > 0 and u.uid < 16384)
  13257.     and     ((p.uid = u.uid) or  (p.uid = m.groupuid and u.uid = m.memberuid))    
  13258.     and     p.protecttype <> 206    /* only grant rows */
  13259.     and     p.action in (26,193,195,197)
  13260.     and     o.uid <> u.uid            /* no rows for owner */
  13261.     and     not exists (            /* exclude revoke'd privileges */
  13262.             select *
  13263.             from sysprotects p1
  13264.             where
  13265.                 p1.protecttype = 206
  13266.             and     p1.action = p.action
  13267.             and     p1.id = p.id
  13268.             and     p1.uid = u.uid
  13269.             and     case 
  13270.                 when substring(p1.columns, 1, 1) & 1 is null then 255    /* all columns have permission */
  13271.                 when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
  13272.                                 else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
  13273.                 end & v.high <> 0)            /* permission applies to this column */
  13274.     union
  13275.     select    /*    Add rows for table owner */
  13276.         GRANTOR        = user_name(u.uid),
  13277.         GRANTEE        = user_name(o.uid),
  13278.         TABLE_CATALOG    = db_name(),
  13279.         TABLE_SCHEMA    = user_name(o.uid),
  13280.         TABLE_NAME    = o.name,
  13281.         COLUMN_NAME    = c.name,
  13282.         COLUMN_GUID    = convert(uniqueidentifier,null),
  13283.         COLUMN_PROPID    = convert(int,null),
  13284.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  13285.                     case v.number
  13286.                     when 193 then N'SELECT'
  13287.                     when 195 then N'INSERT'
  13288.                     when 197 then N'UPDATE'
  13289.                     else N'REFERENCES'
  13290.                     end),
  13291.         IS_GRANTABLE    = convert(bit,1)    
  13292.     from 
  13293.         sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
  13294.     where
  13295.         o.type in ('U','V','S')
  13296.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13297.     and    (@grantee is null or @grantee = user_name(o.uid))
  13298.     and    c.id = o.id
  13299.     and     (@column_name is null or @column_name = c.name)
  13300.     and     u.uid = 1        /* grantor is dbo of database */
  13301.     and    (@grantor is null or @grantor = user_name(u.uid))
  13302.     and     v.type = 'P'        /* cross product to get all exposed privileges */
  13303.     and     v.number in (26,193,195,197)
  13304.     and     not exists (        /* exclude revoke'd privileges */
  13305.             select *
  13306.             from     sysprotects p1
  13307.             where    p1.protecttype = 206
  13308.             and     p1.action = v.number
  13309.             and     p1.id = o.id
  13310.             and     p1.uid = o.uid)
  13311.     order by 4, 5, 6, 9, 1, 2
  13312. go
  13313. dump tran master with no_log
  13314. go
  13315. create procedure sp_column_privileges_rowset;5
  13316.     (
  13317.     @table_server        sysname,
  13318.     @table_catalog        sysname = null,
  13319.     @table_name        sysname = null,
  13320.     @table_schema        sysname = null,
  13321.     @column_name        sysname = null,
  13322.     @grantor        sysname = null,
  13323.     @grantee        sysname = null
  13324.     )
  13325. as
  13326.     select
  13327.         GRANTOR,
  13328.         GRANTEE,
  13329.         TABLE_CATALOG,
  13330.         TABLE_SCHEMA,
  13331.         TABLE_NAME,
  13332.         COLUMN_NAME,
  13333.         COLUMN_GUID,
  13334.         COLUMN_PROPID,    
  13335.         PRIVILEGE_TYPE,
  13336.         IS_GRANTABLE    
  13337.         from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
  13338.                 @table_server,
  13339.                 @table_catalog,
  13340.                 @table_schema,
  13341.                 @table_name,
  13342.                 @column_name,
  13343.                 @grantor,
  13344.                 @grantee>
  13345.     order by 3, 4, 5, 6, 9, 1, 2
  13346. go
  13347.  
  13348. grant execute on sp_column_privileges_rowset to public
  13349. go
  13350.  
  13351. dump tran master with no_log
  13352. go
  13353. if (charindex('6.00', @@version) > 0)
  13354.     begin
  13355.     if (exists (select * from sysobjects
  13356.             where name = 'sp_column_privileges_rowset' and type = 'P '))
  13357.         begin
  13358.         drop procedure sp_column_privileges_rowset
  13359.         dump tran master with no_log
  13360.         end
  13361.     end
  13362. go
  13363.  
  13364.  
  13365. print ''
  13366. print 'creating sp_columns_rowset'
  13367. go
  13368.  
  13369. /*    Procedure for 6.0 and 6.50 server */
  13370. create procedure sp_columns_rowset
  13371.     (
  13372.        @table_name    varchar(255),
  13373.     @table_schema     varchar(255) = null,
  13374.     @column_name    varchar(255) = null
  13375.     )
  13376. as     
  13377.     select
  13378.         TABLE_CATALOG        = db_name(),
  13379.         TABLE_SCHEMA        = user_name(o.uid),
  13380.         TABLE_NAME        = o.name,
  13381.         COLUMN_NAME        = c.name,
  13382.         COLUMN_GUID        = convert(binary(16),null),
  13383.         COLUMN_PROPID        = convert(int,null),
  13384.         ORDINAL_POSITION     = convert(int,
  13385.                        (
  13386.                         select count(*)
  13387.                         from syscolumns sc
  13388.                         where sc.id     =  c.id
  13389.                           AND sc.number =  c.number
  13390.                           AND sc.colid  <= c.colid
  13391.                         )),
  13392.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  13393.  
  13394.         COLUMN_DEFAULT        = convert (varchar (255),
  13395.                                   case when substring(m.text,1,1) = '('
  13396.                                   then substring(m.text,2,datalength(m.text)-2)
  13397.                                   else substring(m.text,1,datalength(m.text)-2)
  13398.                               end), 
  13399.         COLUMN_FLAGS        = convert(int,
  13400.                         case when d.is_long = 1 
  13401.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  13402.                         else 0
  13403.                         end
  13404.                     |    case when d.fixlen is not null
  13405.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  13406.                         else 0
  13407.                         end
  13408.                     |    case when c.status&8 = 8
  13409.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  13410.                         else 0
  13411.                         end
  13412.                     |    case 
  13413.                         when d.type_name = 'timestamp'
  13414.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  13415.                         when (c.status&128) != 128
  13416.                             then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/ 
  13417.                         else 0 
  13418.                         end),
  13419.         IS_NULLABLE        = convert(bit,c.status&8),
  13420.         DATA_TYPE        = d.oledb_data_type,
  13421.         TYPE_GUID        = convert(binary(16),null),
  13422.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  13423.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13424.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13425.                         then coalesce(d.column_size,c.length)
  13426.                         else null 
  13427.                         end),
  13428.         CHARACTER_OCTET_LENGTH    = convert(int,
  13429.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13430.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13431.                         then coalesce(d.column_size,c.length)
  13432.                         else null 
  13433.                         end),
  13434.         NUMERIC_PRECISION    = convert(smallint,
  13435.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  13436.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  13437.                                     then d.data_precision else null end),
  13438.         NUMERIC_SCALE        = convert(smallint, 
  13439.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  13440.         DATETIME_PRECISION    = convert(int,
  13441.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  13442.                             when data_precision = 23 then 3 else 0 end),
  13443.         CHARACTER_SET_CATALOG    = convert(sysname,
  13444.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13445.                         then 'master' 
  13446.                         else null 
  13447.                         end),
  13448.         CHARACTER_SET_SCHEMA    = convert(sysname,
  13449.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13450.                         then 'dbo' 
  13451.                         else null 
  13452.                         end),
  13453.         CHARACTER_SET_NAME    = convert(sysname,
  13454.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13455.                         then a_cha.name 
  13456.                         else null 
  13457.                         end),
  13458.         COLLATION_CATALOG    = convert(sysname,
  13459.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13460.                         then 'master' 
  13461.                         else null 
  13462.                         end),
  13463.         COLLATION_SCHEMA    = convert(sysname,
  13464.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13465.                         then 'dbo' 
  13466.                         else null 
  13467.                         end),
  13468.         COLLATION_NAME        = convert(sysname,
  13469.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13470.                         then b_cha.name 
  13471.                         else null 
  13472.                         end),
  13473.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  13474.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  13475.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  13476.         DESCRIPTION        = convert(varchar(1),null)    
  13477.     
  13478.     from
  13479.         syscolumns c,
  13480.         syscomments m,
  13481.         sysobjects o,
  13482.         master.dbo.spt_provider_types d,
  13483.         systypes t,
  13484.         sysusers u,
  13485.         master.dbo.sysconfigures    cfg,
  13486.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  13487.         master.dbo.syscharsets        b_cha  /* sortorder/2001, not charset. */
  13488.     where
  13489.         o.name = @table_name
  13490.     and     o.type in ('U','V','S')
  13491.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  13492.     and     (
  13493.         suser_id() = 1     /* User is the System Administrator */
  13494.         or o.uid = user_id()     /* User created the object */
  13495.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  13496.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  13497.             from sysprotects p
  13498.             where p.id = o.id
  13499.             /* get rows for public,current user,user's group */
  13500.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  13501.             /* check for SELECT,EXECUTE privilege */
  13502.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  13503.             ) = 1    /* final magic...compare Grants      */
  13504.            )
  13505.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13506.     and    (@column_name is null or @column_name = c.name)
  13507.     and     o.id = c.id
  13508.     and     t.type = d.ss_dtype
  13509.     and    (t.usertype != 80 or d.type_name='timestamp')
  13510.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  13511.     and     c.usertype = t.usertype
  13512.     and    c.cdefault *= m.id
  13513.     and    m.colid = 1
  13514.     and    cfg.comment = 'default sortorder ID' 
  13515.     and    a_cha.type = 1001 /* type is charset */
  13516.     and    b_cha.type = 2001 /* type is sortorder */
  13517.     and    a_cha.id = b_cha.csid
  13518.     and     b_cha.id = cfg.value
  13519.     order by 2, 3, c.colid
  13520. go
  13521.  
  13522. dump tran master with no_log
  13523. go
  13524.  
  13525. create procedure sp_columns_rowset;2
  13526.     (
  13527.     @table_schema     varchar(255) = null,
  13528.     @column_name    varchar(255) = null
  13529.     )
  13530. as     
  13531.     select
  13532.         TABLE_CATALOG        = db_name(),
  13533.         TABLE_SCHEMA        = user_name(o.uid),
  13534.         TABLE_NAME        = o.name,
  13535.         COLUMN_NAME        = c.name,
  13536.         COLUMN_GUID        = convert(binary(16),null),
  13537.         COLUMN_PROPID        = convert(int,null),
  13538.         ORDINAL_POSITION     = convert(int,
  13539.                        (
  13540.                         select count(*)
  13541.                         from syscolumns sc
  13542.                         where sc.id     =  c.id
  13543.                           AND sc.number =  c.number
  13544.                           AND sc.colid  <= c.colid
  13545.                         )),
  13546.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  13547.         COLUMN_DEFAULT        = convert (varchar (255),
  13548.                                   case when substring(m.text,1,1) = '('
  13549.                                   then substring(m.text,2,datalength(m.text)-2)
  13550.                                   else substring(m.text,1,datalength(m.text)-2)
  13551.                               end), 
  13552.         COLUMN_FLAGS        = convert(int,
  13553.                         case when d.is_long = 1 
  13554.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  13555.                         else 0
  13556.                         end
  13557.                     |    case when d.fixlen is not null
  13558.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  13559.                         else 0
  13560.                         end
  13561.                     |    case when c.status&8 = 8
  13562.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  13563.                         else 0
  13564.                         end
  13565.                     |    case 
  13566.                         when d.type_name = 'timestamp'
  13567.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  13568.                         when (c.status&128) != 128
  13569.                             then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/ 
  13570.                         else 0 
  13571.                         end),
  13572.         IS_NULLABLE        = convert(bit,c.status&8),
  13573.         DATA_TYPE        = d.oledb_data_type,
  13574.         TYPE_GUID        = convert(binary(16),null),
  13575.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  13576.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13577.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13578.                         then coalesce(d.column_size,c.length)
  13579.                         else null 
  13580.                         end),
  13581.         CHARACTER_OCTET_LENGTH    = convert(int,
  13582.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13583.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13584.                         then coalesce(d.column_size,c.length)
  13585.                         else null 
  13586.                         end),
  13587.         NUMERIC_PRECISION    = convert(smallint,
  13588.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  13589.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  13590.                             then d.data_precision else null end),
  13591.         NUMERIC_SCALE        = convert(smallint, 
  13592.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  13593.         DATETIME_PRECISION    = convert(int,
  13594.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  13595.                             when data_precision = 23 then 3 else 0 end),
  13596.         CHARACTER_SET_CATALOG    = convert(sysname,
  13597.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13598.                         then 'master' 
  13599.                         else null 
  13600.                         end),
  13601.         CHARACTER_SET_SCHEMA    = convert(sysname,
  13602.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13603.                         then 'dbo' 
  13604.                         else null 
  13605.                         end),
  13606.         CHARACTER_SET_NAME    = convert(sysname,
  13607.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13608.                         then a_cha.name 
  13609.                         else null 
  13610.                         end),
  13611.         COLLATION_CATALOG    = convert(sysname,
  13612.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13613.                         then 'master' 
  13614.                         else null 
  13615.                         end),
  13616.         COLLATION_SCHEMA    = convert(sysname,
  13617.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13618.                         then 'dbo' 
  13619.                         else null 
  13620.                         end),
  13621.         COLLATION_NAME        = convert(sysname,
  13622.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13623.                         then b_cha.name 
  13624.                         else null 
  13625.                         end),
  13626.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  13627.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  13628.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  13629.         DESCRIPTION        = convert(varchar(1),null)    
  13630.     
  13631.     from
  13632.         syscolumns c,
  13633.         syscomments m,
  13634.         sysobjects o,
  13635.         master.dbo.spt_provider_types d,
  13636.         systypes t,
  13637.         sysusers u,
  13638.         master.dbo.sysconfigures    cfg,
  13639.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  13640.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset. */
  13641.     where
  13642.          o.type in ('U','V','S')
  13643.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  13644.     and     (
  13645.         suser_id() = 1     /* User is the System Administrator */
  13646.         or o.uid = user_id()     /* User created the object */
  13647.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  13648.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  13649.             from sysprotects p
  13650.             where p.id = o.id
  13651.             /* get rows for public,current user,user's group */
  13652.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  13653.             /* check for SELECT,EXECUTE privilege */
  13654.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  13655.             ) = 1    /* final magic...compare Grants      */
  13656.            )
  13657.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13658.     and    (@column_name is null or @column_name = c.name)
  13659.     and     o.id = c.id
  13660.     and     t.type = d.ss_dtype
  13661.     and    (t.usertype != 80 or d.type_name='timestamp')
  13662.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  13663.     and     c.usertype = t.usertype
  13664.     and    c.cdefault *= m.id
  13665.     and     m.colid = 1
  13666.     and    cfg.comment = 'default sortorder ID' 
  13667.     and    a_cha.type = 1001 /* type is charset */
  13668.     and    b_cha.type = 2001 /* type is sortorder */
  13669.     and    a_cha.id = b_cha.csid
  13670.     and     b_cha.id = cfg.value
  13671.     order by 2, 3, c.colid
  13672.     
  13673. go
  13674.  
  13675. dump tran master with no_log
  13676. go
  13677.  
  13678. if (charindex('7.00', @@version) = 0 and
  13679.     charindex('8.00', @@version) = 0)
  13680. begin
  13681.     print ''
  13682.     print ''
  13683.     print 'Warning:'
  13684.     print 'you are installing the stored procedures '
  13685.     print 'on a pre 8.0 SQL Server.'
  13686.     print 'Ignore the following errors.'
  13687. end
  13688. else
  13689.     drop proc sp_columns_rowset
  13690. go
  13691.  
  13692. /*    Procedure for 7.0 server */
  13693. create procedure sp_columns_rowset
  13694.     (
  13695.        @table_name    sysname,
  13696.     @table_schema     sysname = NULL,
  13697.     @column_name    sysname = NULL
  13698.     )
  13699. as
  13700.     select
  13701.         TABLE_CATALOG        = db_name(),
  13702.         TABLE_SCHEMA        = user_name(o.uid),
  13703.         TABLE_NAME        = o.name,
  13704.         COLUMN_NAME        = c.name,
  13705.         COLUMN_GUID        = convert(uniqueidentifier,null),
  13706.         COLUMN_PROPID        = convert(int,null),
  13707.         ORDINAL_POSITION     = convert(int,
  13708.                        (
  13709.                         select count(*)
  13710.                         from syscolumns sc
  13711.                         where sc.id     =  c.id
  13712.                           AND sc.number =  c.number
  13713.                           AND sc.colid  <= c.colid
  13714.                         )),
  13715.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  13716.         COLUMN_DEFAULT        =  convert(nvarchar(2000),
  13717.                                         case when substring(m.text,1,1) = '('
  13718.                                             then substring(m.text,2,datalength(m.text)/2-2)
  13719.                                             else substring(m.text,1,datalength(m.text)/2-2)
  13720.                                         end    ), 
  13721.         COLUMN_FLAGS        = convert(int,
  13722.                         case when d.is_long = 1 
  13723.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  13724.                         else 0
  13725.                         end
  13726.                     |    case when d.fixlen is not null
  13727.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  13728.                         else 0
  13729.                         end
  13730.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  13731.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  13732.                         else 0
  13733.                         end
  13734.                     |    case 
  13735.                         when d.type_name = 'timestamp'
  13736.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  13737.                         when (c.status&128) != 128  and permissions(o.id,c.name)&2 = 2
  13738.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  13739.                         else 0 
  13740.                         end),
  13741.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  13742.         DATA_TYPE        = d.oledb_data_type,
  13743.         TYPE_GUID        = convert(uniqueidentifier,null),
  13744.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  13745.                         case 
  13746.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13747.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13748.                         then coalesce(d.column_size,c.length)
  13749.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  13750.                         then coalesce(d.column_size,c.length/2)
  13751.                         else null 
  13752.                         end),
  13753.         CHARACTER_OCTET_LENGTH    = convert(int,
  13754.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13755.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13756.                         then coalesce(d.column_size,c.length)
  13757.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  13758.                         then coalesce(d.column_size*2,c.length)
  13759.                         else null 
  13760.                         end),
  13761.         NUMERIC_PRECISION    = convert(smallint,
  13762.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
  13763.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  13764.                             then d.data_precision else null end),
  13765.         NUMERIC_SCALE        = convert(smallint, 
  13766.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  13767.         DATETIME_PRECISION    = convert(int,
  13768.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  13769.                             when data_precision = 23 then 3 else 0 end),
  13770.         CHARACTER_SET_CATALOG    = convert(sysname,
  13771.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13772.                         then N'master' 
  13773.                         else null 
  13774.                         end),
  13775.         CHARACTER_SET_SCHEMA    = convert(sysname,
  13776.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13777.                         then N'dbo' 
  13778.                         else null 
  13779.                         end),
  13780.         CHARACTER_SET_NAME    = convert(sysname,
  13781.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13782.                         then a_cha.name 
  13783.                         else null 
  13784.                         end),
  13785.         COLLATION_CATALOG    = convert(sysname,
  13786.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13787.                         then N'master' 
  13788.                         else null 
  13789.                         end),
  13790.         COLLATION_SCHEMA    = convert(sysname,
  13791.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13792.                         then N'dbo' 
  13793.                         else null 
  13794.                         end),
  13795.         COLLATION_NAME        = convert(sysname,
  13796.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13797.                         then b_cha.name 
  13798.                         else null 
  13799.                         end),
  13800.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  13801.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  13802.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  13803.         DESCRIPTION        = convert(nvarchar(1),null)    
  13804.  
  13805.     from
  13806.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  13807.         sysobjects o,
  13808.         master.dbo.spt_provider_types d,
  13809.         systypes t,
  13810.         master.dbo.sysconfigures    cfg,
  13811.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder. */
  13812.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset. */
  13813.     where
  13814.         permissions(o.id, c.name) <> 0
  13815.     and    o.name = @table_name
  13816.     and     o.type in ('U','V','S')
  13817.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13818.     and    (@column_name is null or @column_name = c.name)
  13819.     and     o.id = c.id
  13820.     and     t.xtype = d.ss_dtype
  13821.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  13822.     and     c.xusertype = t.xusertype
  13823.     and    cfg.comment = 'default sortorder id' 
  13824.     and    a_cha.type = 1001 /* type is charset */
  13825.     and    b_cha.type = 2001 /* type is sortorder */
  13826.     and    a_cha.id = b_cha.csid
  13827.     and     b_cha.id = cfg.value
  13828.     order by 2, 3, c.colorder
  13829. go
  13830.  
  13831. dump tran master with no_log
  13832. go
  13833.  
  13834. /*    Procedure for 7.0 server */
  13835. create procedure sp_columns_rowset;2
  13836.     (
  13837.     @table_schema     sysname = NULL,
  13838.     @column_name    sysname = NULL
  13839.     )
  13840. as     
  13841.     select
  13842.         TABLE_CATALOG        = db_name(),
  13843.         TABLE_SCHEMA        = user_name(o.uid),
  13844.         TABLE_NAME        = o.name,
  13845.         COLUMN_NAME        = c.name,
  13846.         COLUMN_GUID        = convert(uniqueidentifier,null),
  13847.         COLUMN_PROPID        = convert(int,null),
  13848.         ORDINAL_POSITION     = convert(int,
  13849.                        (
  13850.                         select count(*)
  13851.                         from syscolumns sc
  13852.                         where sc.id     =  c.id
  13853.                           AND sc.number =  c.number
  13854.                           AND sc.colid  <= c.colid
  13855.                         )),
  13856.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  13857.         COLUMN_DEFAULT        =  convert(nvarchar(2000),
  13858.                                         case when substring(m.text,1,1) = '('
  13859.                                             then substring(m.text,2,datalength(m.text)/2-2)
  13860.                                             else substring(m.text,1,datalength(m.text)/2-2)
  13861.                                         end    ), 
  13862.         COLUMN_FLAGS        = convert(int,
  13863.                         case when d.is_long = 1 
  13864.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  13865.                         else 0
  13866.                         end
  13867.                     |    case when d.fixlen is not null
  13868.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  13869.                         else 0
  13870.                         end
  13871.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  13872.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  13873.                         else 0
  13874.                         end
  13875.                     |    case 
  13876.                         when d.type_name = 'timestamp'
  13877.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  13878.                         when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
  13879.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  13880.                         else 0 
  13881.                         end),
  13882.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  13883.         DATA_TYPE        = d.oledb_data_type,
  13884.         TYPE_GUID        = convert(uniqueidentifier,null),
  13885.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  13886.                         case 
  13887.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13888.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13889.                         then coalesce(d.column_size,c.length)
  13890.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  13891.                         then coalesce(d.column_size,c.length/2)
  13892.                         else null 
  13893.                         end),
  13894.         CHARACTER_OCTET_LENGTH    = convert(int,
  13895.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  13896.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  13897.                         then coalesce(d.column_size,c.length)
  13898.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  13899.                         then coalesce(d.column_size*2,c.length)
  13900.                         else null 
  13901.                         end),
  13902.         NUMERIC_PRECISION    = convert(smallint,
  13903.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
  13904.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  13905.                             then d.data_precision else null end),
  13906.         NUMERIC_SCALE        = convert(smallint, 
  13907.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  13908.         DATETIME_PRECISION    = convert(int,
  13909.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  13910.                             when data_precision = 23 then 3 else 0 end),
  13911.         CHARACTER_SET_CATALOG    = convert(sysname,
  13912.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13913.                         then N'master' 
  13914.                         else null 
  13915.                         end),
  13916.         CHARACTER_SET_SCHEMA    = convert(sysname,
  13917.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13918.                         then N'dbo' 
  13919.                         else null 
  13920.                         end),
  13921.         CHARACTER_SET_NAME    = convert(sysname,
  13922.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13923.                         then a_cha.name 
  13924.                         else null 
  13925.                         end),
  13926.         COLLATION_CATALOG    = convert(sysname,
  13927.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13928.                         then N'master' 
  13929.                         else null 
  13930.                         end),
  13931.         COLLATION_SCHEMA    = convert(sysname,
  13932.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13933.                         then N'dbo' 
  13934.                         else null 
  13935.                         end),
  13936.         COLLATION_NAME        = convert(sysname,
  13937.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  13938.                         then b_cha.name 
  13939.                         else null 
  13940.                         end),
  13941.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  13942.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  13943.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  13944.         DESCRIPTION        = convert(nvarchar(1),null)    
  13945.     
  13946.     from
  13947.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  13948.         sysobjects o,
  13949.         master.dbo.spt_provider_types d,
  13950.         systypes t,
  13951.         master.dbo.sysconfigures    cfg,
  13952.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder.*/
  13953.         master.dbo.syscharsets        b_cha /* sortorder/2001, not charset.*/
  13954.     where
  13955.         permissions(o.id, c.name) <> 0
  13956.     and     o.type in ('U','V','S')
  13957.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  13958.     and    (@column_name is null or @column_name = c.name)
  13959.     and     o.id = c.id
  13960.     and     t.xtype = d.ss_dtype
  13961.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  13962.     and     c.xusertype = t.xusertype
  13963.     and    cfg.comment = 'default sortorder id' 
  13964.     and     a_cha.type = 1001 /* type is charset */
  13965.     and     b_cha.type = 2001 /* type is sortorder */
  13966.     and    a_cha.id = b_cha.csid
  13967.     and     b_cha.id = cfg.value
  13968.     order by 2, 3, c.colorder
  13969. go
  13970.  
  13971. dump tran master with no_log
  13972. go
  13973.  
  13974. /*    Procedure for 7.0 server */
  13975. create procedure sp_columns_rowset;5
  13976.     (
  13977.     @table_server        sysname,
  13978.     @table_catalog        sysname = null,
  13979.     @table_name        sysname = null,
  13980.     @table_schema        sysname = null,
  13981.     @column_name        sysname = null
  13982.     )
  13983. as
  13984.     select
  13985.         TABLE_CATALOG,
  13986.         TABLE_SCHEMA,
  13987.         TABLE_NAME,
  13988.         COLUMN_NAME,
  13989.         COLUMN_GUID,
  13990.         COLUMN_PROPID,
  13991.         ORDINAL_POSITION,
  13992.         COLUMN_HASDEFAULT,
  13993.         COLUMN_DEFAULT,
  13994.         COLUMN_FLAGS,
  13995.         IS_NULLABLE,
  13996.         DATA_TYPE,
  13997.         TYPE_GUID,
  13998.         CHARACTER_MAXIMUM_LENGTH,
  13999.         CHARACTER_OCTET_LENGTH,
  14000.         NUMERIC_PRECISION,
  14001.         NUMERIC_SCALE,
  14002.         DATETIME_PRECISION,
  14003.         CHARACTER_SET_CATALOG,
  14004.         CHARACTER_SET_SCHEMA,
  14005.         CHARACTER_SET_NAME,
  14006.         COLLATION_CATALOG,
  14007.         COLLATION_SCHEMA,
  14008.         COLLATION_NAME,
  14009.         DOMAIN_CATALOG,
  14010.         DOMAIN_SCHEMA,
  14011.         DOMAIN_NAME,
  14012.         DESCRIPTION
  14013.     from master.dbo.SYSREMOTE_COLUMNS <
  14014.                 @table_server,
  14015.                 @table_catalog,
  14016.                 @table_schema,
  14017.                 @table_name,
  14018.                 @column_name > 
  14019.     order by 1, 2, 3, 7
  14020. go
  14021.  
  14022.  
  14023. dump tran master with no_log
  14024. go
  14025.  
  14026. /*    Procedure for 8.00 server */
  14027. if (charindex('8.00', @@version) = 0)
  14028. begin
  14029.     print ''
  14030.     print ''
  14031.     print 'Warning:'
  14032.     print 'you are installing the stored procedures '
  14033.     print 'on a pre 8.0 SQL Server.'
  14034.     print 'Ignore the following errors.'
  14035. end
  14036. else
  14037.     drop proc sp_columns_rowset
  14038. go
  14039.  
  14040. /*    Procedure for 8.00 server */
  14041. create procedure sp_columns_rowset
  14042.     (
  14043.        @table_name    sysname,
  14044.     @table_schema     sysname = NULL,
  14045.     @column_name    sysname = NULL
  14046.     )
  14047. as     
  14048.     select
  14049.         TABLE_CATALOG        = db_name(),
  14050.         TABLE_SCHEMA        = user_name(o.uid),
  14051.         TABLE_NAME        = o.name,
  14052.         COLUMN_NAME        = c.name,
  14053.         COLUMN_GUID        = convert(uniqueidentifier,null),
  14054.         COLUMN_PROPID        = convert(int,null),
  14055.         ORDINAL_POSITION     = convert(int,
  14056.                        (
  14057.                         select count(*)
  14058.                         from syscolumns sc
  14059.                         where sc.id     =  c.id
  14060.                           AND sc.number =  c.number
  14061.                           AND sc.colid  <= c.colid
  14062.                         )),
  14063.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  14064.  
  14065.         /* Get rid of ( if it is first char otherwise display the whole thing */
  14066.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  14067.                                         case when substring(m.text,1,1) = '('
  14068.                                             then substring(m.text,2,datalength(m.text)/2-2)
  14069.                                             else substring(m.text,1,datalength(m.text)/2-2)
  14070.                                         end    ), 
  14071.  
  14072.         COLUMN_FLAGS        = convert(int,
  14073.                         case when d.is_long = 1 
  14074.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  14075.                         else 0
  14076.                         end
  14077.                     |    case when d.fixlen is not null
  14078.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  14079.                         else 0
  14080.                         end
  14081.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  14082.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  14083.                         else 0
  14084.                         end
  14085.                     |    case 
  14086.                         when d.type_name = 'timestamp'
  14087.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  14088.                         when (c.status&128) != 128  and permissions(o.id,c.name)&2 = 2
  14089.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  14090.                         else 0 
  14091.                         end),
  14092.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  14093.         DATA_TYPE        = d.oledb_data_type,
  14094.         TYPE_GUID        = convert(uniqueidentifier,null),
  14095.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  14096.                         case 
  14097.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  14098.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  14099.                         then coalesce(d.column_size,c.length)
  14100.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  14101.                         then coalesce(d.column_size,c.length/2)
  14102.                         else null 
  14103.                         end),
  14104.         CHARACTER_OCTET_LENGTH    = convert(int,
  14105.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  14106.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  14107.                         then coalesce(d.column_size,c.length)
  14108.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  14109.                         then coalesce(d.column_size*2,c.length)
  14110.                         else null 
  14111.                         end),
  14112.         NUMERIC_PRECISION    = convert(smallint,
  14113.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
  14114.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  14115.                             then d.data_precision else null end),
  14116.         NUMERIC_SCALE        = convert(smallint, 
  14117.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  14118.         DATETIME_PRECISION    = convert(int,
  14119.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  14120.                             when data_precision = 23 then 3 else 0 end),
  14121.         CHARACTER_SET_CATALOG    = convert(sysname,
  14122.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14123.                         then N'master' 
  14124.                         else null 
  14125.                         end),
  14126.         CHARACTER_SET_SCHEMA    = convert(sysname,
  14127.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14128.                         then N'dbo' 
  14129.                         else null 
  14130.                         end),
  14131.         CHARACTER_SET_NAME    = convert(sysname,
  14132.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14133.                         then a_cha.name 
  14134.                         else null 
  14135.                         end),
  14136.         COLLATION_CATALOG    = convert(sysname,
  14137.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14138.                         then N'master' 
  14139.                         else null 
  14140.                         end),
  14141.         COLLATION_SCHEMA    = convert(sysname,
  14142.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14143.                         then N'dbo' 
  14144.                         else null 
  14145.                         end),
  14146.         COLLATION_NAME        = convert(sysname,
  14147.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14148.                         then c.collation 
  14149.                         else null 
  14150.                         end),
  14151.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  14152.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  14153.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  14154.         DESCRIPTION        = convert(nvarchar(1),null),
  14155.         COLUMN_LCID     = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),
  14156.         COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),
  14157.         COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */
  14158.                                when ABS(c.collationid) > 0x1000000 
  14159.                             then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))
  14160.                             else null 
  14161.                         end,
  14162.         COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),
  14163.         IS_COMPUTED    = convert(bit, c.iscomputed)    
  14164.     from
  14165.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  14166.         sysobjects o,
  14167.         master.dbo.spt_provider_types d,
  14168.         systypes t,
  14169.         master.dbo.syscharsets        a_cha /* charset/1001, not sortorder. */
  14170.     where
  14171.         permissions(o.id, c.name) <> 0
  14172.     and    o.name = @table_name
  14173.     and     (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))
  14174.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  14175.     and    (@column_name is null or @column_name = c.name)
  14176.     and     o.id = c.id
  14177.     and     t.xtype = d.ss_dtype
  14178.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  14179.     and     c.xusertype = t.xusertype
  14180.     and    a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),
  14181.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  14182.     order by 2, 3, c.colorder
  14183. go
  14184.  
  14185.  
  14186. /*    Procedure for 8.0 server */
  14187. create procedure sp_columns_rowset;2
  14188.     (
  14189.     @table_schema     sysname = NULL,
  14190.     @column_name    sysname = NULL
  14191.     )
  14192. as     
  14193.     select
  14194.         TABLE_CATALOG        = db_name(),
  14195.         TABLE_SCHEMA        = user_name(o.uid),
  14196.         TABLE_NAME        = o.name,
  14197.         COLUMN_NAME        = c.name,
  14198.         COLUMN_GUID        = convert(uniqueidentifier,null),
  14199.         COLUMN_PROPID        = convert(int,null),
  14200.         ORDINAL_POSITION     = convert(int,
  14201.                        (
  14202.                         select count(*)
  14203.                         from syscolumns sc
  14204.                         where sc.id     =  c.id
  14205.                           AND sc.number =  c.number
  14206.                           AND sc.colid  <= c.colid
  14207.                         )),
  14208.         COLUMN_HASDEFAULT    = convert(bit, case when m.text is null then 0 else 1 end),
  14209.         COLUMN_DEFAULT        = convert(nvarchar(2000),
  14210.                                         case when substring(m.text,1,1) = '('
  14211.                                             then substring(m.text,2,datalength(m.text)/2-2)
  14212.                                             else substring(m.text,1,datalength(m.text)/2-2)
  14213.                                         end    ), 
  14214.         COLUMN_FLAGS        = convert(int,
  14215.                         case when d.is_long = 1 
  14216.                         then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
  14217.                         else 0
  14218.                         end
  14219.                     |    case when d.fixlen is not null
  14220.                         then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
  14221.                         else 0
  14222.                         end
  14223.                     |    case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
  14224.                         then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
  14225.                         else 0
  14226.                         end
  14227.                     |    case 
  14228.                         when d.type_name = 'timestamp'
  14229.                             then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
  14230.                         when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
  14231.                             then 0x4 /*DBCOLUMNFLAGS_WRITE*/ 
  14232.                         else 0 
  14233.                         end),
  14234.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  14235.         DATA_TYPE        = d.oledb_data_type,
  14236.         TYPE_GUID        = convert(uniqueidentifier,null),
  14237.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  14238.                         case 
  14239.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  14240.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  14241.                         then coalesce(d.column_size,c.length)
  14242.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  14243.                         then coalesce(d.column_size,c.length/2)
  14244.                         else null 
  14245.                         end),
  14246.         CHARACTER_OCTET_LENGTH    = convert(int,
  14247.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  14248.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  14249.                         then coalesce(d.column_size,c.length)
  14250.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  14251.                         then coalesce(d.column_size*2,c.length)
  14252.                         else null 
  14253.                         end),
  14254.         NUMERIC_PRECISION    = convert(smallint,
  14255.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
  14256.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  14257.                             then d.data_precision else null end),
  14258.         NUMERIC_SCALE        = convert(smallint, 
  14259.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  14260.         DATETIME_PRECISION    = convert(int,
  14261.                         case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
  14262.                             when data_precision = 23 then 3 else 0 end),
  14263.         CHARACTER_SET_CATALOG    = convert(sysname,
  14264.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14265.                         then N'master' 
  14266.                         else null 
  14267.                         end),
  14268.         CHARACTER_SET_SCHEMA    = convert(sysname,
  14269.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14270.                         then N'dbo' 
  14271.                         else null 
  14272.                         end),
  14273.         CHARACTER_SET_NAME    = convert(sysname,
  14274.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14275.                         then a_cha.name 
  14276.                         else null 
  14277.                         end),
  14278.         COLLATION_CATALOG    = convert(sysname,
  14279.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14280.                         then N'master' 
  14281.                         else null 
  14282.                         end),
  14283.         COLLATION_SCHEMA    = convert(sysname,
  14284.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14285.                         then N'dbo' 
  14286.                         else null 
  14287.                         end),
  14288.         COLLATION_NAME        = convert(sysname,
  14289.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/
  14290.                         then c.collation 
  14291.                         else null 
  14292.                         end),
  14293.         DOMAIN_CATALOG        = case when t.usertype < 256 then null else db_name() end,
  14294.         DOMAIN_SCHEMA        = case when t.usertype < 256 then null else user_name(o.uid) end,
  14295.         DOMAIN_NAME        = case when t.usertype < 256 then null else t.name end,
  14296.         DESCRIPTION        = convert(nvarchar(1),null),    
  14297.         COLUMN_LCID     = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),
  14298.         COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),
  14299.         COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */
  14300.                                when ABS(c.collationid) > 0x1000000 
  14301.                             then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))
  14302.                             else null 
  14303.                         end,
  14304.         
  14305.         COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),
  14306.         IS_COMPUTED = convert(bit, c.iscomputed)
  14307.     
  14308.     from
  14309.         syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
  14310.         sysobjects o,
  14311.         master.dbo.spt_provider_types d,
  14312.         systypes t,
  14313.         master.dbo.syscharsets        a_cha /* charset/1001, not sortorder.*/
  14314.     where
  14315.         permissions(o.id, c.name) <> 0
  14316.     and     (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))
  14317.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  14318.     and    (@column_name is null or @column_name = c.name)
  14319.     and     o.id = c.id
  14320.     and     t.xtype = d.ss_dtype
  14321.     and     c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  14322.     and     c.xusertype = t.xusertype
  14323.     and    a_cha.type = 1001 /* type is charset */
  14324.     and    a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),
  14325.             convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
  14326.     order by 2, 3, c.colorder
  14327. go
  14328.  
  14329. dump tran master with no_log
  14330. go
  14331.  
  14332. /*    Procedure for 8.0 server */
  14333. create procedure sp_columns_rowset;5
  14334.     (
  14335.     @table_server        sysname,
  14336.     @table_catalog        sysname = null,
  14337.     @table_name        sysname = null,
  14338.     @table_schema        sysname = null,
  14339.     @column_name        sysname = null
  14340.     )
  14341. as
  14342.     select
  14343.         TABLE_CATALOG,
  14344.         TABLE_SCHEMA,
  14345.         TABLE_NAME,
  14346.         COLUMN_NAME,
  14347.         COLUMN_GUID,
  14348.         COLUMN_PROPID,
  14349.         ORDINAL_POSITION,
  14350.         COLUMN_HASDEFAULT,
  14351.         COLUMN_DEFAULT,
  14352.         COLUMN_FLAGS,
  14353.         IS_NULLABLE,
  14354.         DATA_TYPE,
  14355.         TYPE_GUID,
  14356.         CHARACTER_MAXIMUM_LENGTH,
  14357.         CHARACTER_OCTET_LENGTH,
  14358.         NUMERIC_PRECISION,
  14359.         NUMERIC_SCALE,
  14360.         DATETIME_PRECISION,
  14361.         CHARACTER_SET_CATALOG,
  14362.         CHARACTER_SET_SCHEMA,
  14363.         CHARACTER_SET_NAME,
  14364.         COLLATION_CATALOG,
  14365.         COLLATION_SCHEMA,
  14366.         COLLATION_NAME,
  14367.         DOMAIN_CATALOG,
  14368.         DOMAIN_SCHEMA,
  14369.         DOMAIN_NAME,
  14370.         DESCRIPTION
  14371.  
  14372.     from master.dbo.SYSREMOTE_COLUMNS <
  14373.                 @table_server,
  14374.                 @table_catalog,
  14375.                 @table_schema,
  14376.                 @table_name,
  14377.                 @column_name > 
  14378.     order by 1, 2, 3, 7
  14379. go
  14380.  
  14381.  
  14382. grant execute on sp_columns_rowset to public
  14383. go
  14384.  
  14385. dump tran master with no_log
  14386. go
  14387. if (charindex('6.00', @@version) > 0)
  14388.     begin
  14389.     if (exists (select * from sysobjects
  14390.             where name = 'sp_columns_rowset' and type = 'P '))
  14391.         begin
  14392.         drop procedure sp_columns_rowset
  14393.         dump tran master with no_log
  14394.         end
  14395.     end
  14396. go
  14397.  
  14398. print ''
  14399. print 'creating sp_check_constraints_rowset'
  14400. go
  14401.  
  14402. /*    Procedure for 6.50 and earlier servers */
  14403. create procedure sp_check_constraints_rowset
  14404.     (
  14405.     @constraint_name    varchar(255),
  14406.     @constraint_schema    varchar(255) = null
  14407.     )
  14408. as
  14409.     select
  14410.         CONSTRAINT_CATALOG    = db_name(),
  14411.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14412.         CONSTRAINT_NAME        = c_obj.name,
  14413.         CHECK_CLAUSE        = m.text,    
  14414.         DESCRIPTION            = convert(varchar(1),null)
  14415.     from 
  14416.         sysobjects c_obj, syscomments m
  14417.     where
  14418.             c_obj.type = 'C '
  14419.         and c_obj.name    = @constraint_name
  14420.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14421.         and c_obj.id = m.id
  14422.     order by 1,2,3 
  14423. go
  14424. dump tran master with no_log
  14425. go
  14426.  
  14427. create procedure sp_check_constraints_rowset;2
  14428.     (
  14429.     @constraint_schema    varchar(255) = null
  14430.     )
  14431. as
  14432.     select
  14433.         CONSTRAINT_CATALOG    = db_name(),
  14434.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14435.         CONSTRAINT_NAME        = c_obj.name,
  14436.         CHECK_CLAUSE        = m.text,    
  14437.         DESCRIPTION            = convert(varchar(1),null)
  14438.     from 
  14439.         sysobjects c_obj, syscomments m
  14440.     where
  14441.             c_obj.type = 'C '
  14442.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14443.         and c_obj.id = m.id
  14444.     order by 1,2,3 
  14445. go
  14446. dump tran master with no_log
  14447. go
  14448.  
  14449. if (charindex('7.00', @@version) > 0 or
  14450.     charindex('8.00', @@version) > 0)
  14451.     drop procedure sp_check_constraints_rowset
  14452. else
  14453. begin
  14454.     print ''
  14455.     print ''
  14456.     print 'Warning:'
  14457.     print 'you are installing the stored procedures '
  14458.     print 'on a pre 7.0 SQL Server.'
  14459.     print 'Ignore the following errors.'
  14460. end
  14461. go
  14462.  
  14463. /*    Procedure for 7.0 servers and 8.0 servers */
  14464. create procedure sp_check_constraints_rowset
  14465.     (
  14466.     @constraint_name    sysname,
  14467.     @constraint_schema    sysname = null
  14468.     )
  14469. as
  14470.     select
  14471.         CONSTRAINT_CATALOG    = db_name(),
  14472.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14473.         CONSTRAINT_NAME        = c_obj.name,
  14474.         CHECK_CLAUSE        = m.text,    
  14475.         DESCRIPTION            = convert(nvarchar(1), null)
  14476.     from 
  14477.         sysobjects c_obj, syscomments m
  14478.     where
  14479.             c_obj.type = 'C '
  14480.         and c_obj.name    = @constraint_name
  14481.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14482.         and m.id = c_obj.id
  14483.     order by 1,2,3 
  14484. go
  14485. dump tran master with no_log
  14486. go
  14487.  
  14488. create procedure sp_check_constraints_rowset;2
  14489.     (
  14490.     @constraint_schema    sysname = null
  14491.     )
  14492. as
  14493.     select
  14494.         CONSTRAINT_CATALOG    = db_name(),
  14495.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14496.         CONSTRAINT_NAME        = c_obj.name,
  14497.         CHECK_CLAUSE        = m.text,    
  14498.         DESCRIPTION            = convert(nvarchar(1), null)
  14499.     from 
  14500.         sysobjects c_obj, syscomments m
  14501.     where
  14502.             c_obj.type = 'C '
  14503.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14504.         and m.id = c_obj.id
  14505.     order by 1,2,3 
  14506. go
  14507.  
  14508. grant execute on sp_check_constraints_rowset to public
  14509. go
  14510.  
  14511. dump tran master with no_log
  14512. go
  14513.  
  14514. if (charindex('6.00', @@version) > 0)
  14515.     begin
  14516.     if (exists (select * from sysobjects
  14517.             where name = 'sp_check_constraints_rowset' and type = 'P '))
  14518.         begin
  14519.         drop procedure sp_check_constraints_rowset
  14520.         dump tran master with no_log
  14521.         end
  14522.     end
  14523. go
  14524.  
  14525. print ''
  14526. print 'creating sp_check_constbytable_rowset'
  14527. go
  14528.  
  14529. /*    Procedure for 6.50 and earlier servers */
  14530. create procedure sp_check_constbytable_rowset
  14531.     (
  14532.     @table_name            varchar(255), 
  14533.     @table_schema        varchar(255) = null,
  14534.     @constraint_name    varchar(255) = null,
  14535.     @constraint_schema    varchar(255) = null
  14536.     )
  14537. as
  14538.     select
  14539.         TABLE_CATALOG        = db_name(),
  14540.         TABLE_SCHEMA        = user_name(t_obj.uid),
  14541.         TABLE_NAME            = t_obj.name,
  14542.         CONSTRAINT_CATALOG    = db_name(),
  14543.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14544.         CONSTRAINT_NAME        = c_obj.name,
  14545.         CHECK_CLAUSE        = m.text,    
  14546.         DESCRIPTION            = convert(varchar(1),null)
  14547.     from 
  14548.         sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m
  14549.     where
  14550.             t_obj.name    = @table_name
  14551.         and t_obj.type in ('U ','S ')
  14552.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))    
  14553.         and t_obj.id = c.id
  14554.         and c.constid = c_obj.id
  14555.         and c_obj.type = 'C '
  14556.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  14557.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14558.         and c_obj.id = m.id
  14559.     order by 1,2,3,4,5,6 
  14560. go
  14561. dump tran master with no_log
  14562. go
  14563.  
  14564. create procedure sp_check_constbytable_rowset;2
  14565.     (
  14566.     @table_schema        varchar(255) = null,
  14567.     @constraint_name    varchar(255) = null,
  14568.     @constraint_schema    varchar(255) = null
  14569.     )
  14570. as
  14571.     select
  14572.         TABLE_CATALOG        = db_name(),
  14573.         TABLE_SCHEMA        = user_name(t_obj.uid),
  14574.         TABLE_NAME            = t_obj.name,
  14575.         CONSTRAINT_CATALOG    = db_name(),
  14576.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14577.         CONSTRAINT_NAME        = c_obj.name,
  14578.         CHECK_CLAUSE        = m.text,    
  14579.         DESCRIPTION            = convert(varchar(1),null)
  14580.     from 
  14581.         sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m
  14582.     where
  14583.             t_obj.type in ('U ','S ')
  14584.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  14585.         and c.id = t_obj.id
  14586.         and c.constid = c_obj.id
  14587.         and c_obj.type    = 'C '
  14588.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  14589.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14590.         and c_obj.id = m.id
  14591.     order by 1,2,3,4,5,6 
  14592. go
  14593. dump tran master with no_log
  14594. go
  14595.  
  14596. if (charindex('7.00', @@version) > 0 or
  14597.     charindex('8.00', @@version) > 0)
  14598.     drop procedure sp_check_constbytable_rowset
  14599. else
  14600. begin
  14601.     print ''
  14602.     print ''
  14603.     print 'Warning:'
  14604.     print 'you are installing the stored procedures '
  14605.     print 'on a pre 8.0 SQL Server.'
  14606.     print 'Ignore the following errors.'
  14607. end
  14608. go
  14609.  
  14610. /*    Procedure for 8.0 server */
  14611. create procedure sp_check_constbytable_rowset
  14612.     (
  14613.     @table_name            sysname, 
  14614.     @table_schema        sysname = null,
  14615.     @constraint_name    sysname = null,
  14616.     @constraint_schema    sysname = null
  14617.     )
  14618. as
  14619.     select
  14620.         TABLE_CATALOG        = db_name(),
  14621.         TABLE_SCHEMA        = user_name(t_obj.uid),
  14622.         TABLE_NAME            = t_obj.name,
  14623.         CONSTRAINT_CATALOG    = db_name(),
  14624.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14625.         CONSTRAINT_NAME        = c_obj.name,
  14626.         CHECK_CLAUSE        = m.text,    
  14627.         DESCRIPTION            = convert(nvarchar(1), null)
  14628.  
  14629.     from 
  14630.         sysobjects c_obj, sysobjects t_obj, syscomments m
  14631.     where
  14632.             t_obj.name    = @table_name
  14633.         and t_obj.type in ('U ','S ')
  14634.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  14635.         and c_obj.parent_obj = t_obj.id
  14636.         and c_obj.type = 'C '
  14637.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  14638.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14639.         and m.id = c_obj.id
  14640. order by 1,2,3,4,5,6 
  14641. go
  14642. dump tran master with no_log
  14643. go
  14644. create procedure sp_check_constbytable_rowset;2
  14645.     (
  14646.     @table_schema        sysname = null,
  14647.     @constraint_name    sysname = null,
  14648.     @constraint_schema    sysname = null
  14649.     )
  14650. as
  14651.     select
  14652.         TABLE_CATALOG        = db_name(),
  14653.         TABLE_SCHEMA        = user_name(t_obj.uid),
  14654.         TABLE_NAME            = t_obj.name,
  14655.         CONSTRAINT_CATALOG    = db_name(),
  14656.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  14657.         CONSTRAINT_NAME        = c_obj.name,
  14658.         CHECK_CLAUSE        = m.text,    
  14659.         DESCRIPTION            = convert(nvarchar(1), null)
  14660.     from 
  14661.         sysobjects c_obj, sysobjects t_obj, syscomments m
  14662.     where
  14663.             t_obj.type in ('U ','S ')
  14664.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  14665.         and c_obj.parent_obj = t_obj.id
  14666.         and c_obj.type = 'C '
  14667.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  14668.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  14669.         and m.id = c_obj.id
  14670.     order by 1,2,3,4,5,6 
  14671. go
  14672. dump tran master with no_log
  14673. go
  14674.  
  14675. grant execute on sp_check_constbytable_rowset to public
  14676. go
  14677.  
  14678. dump tran master with no_log
  14679. go
  14680. if (charindex('6.00', @@version) > 0)
  14681.     begin
  14682.     if (exists (select * from sysobjects
  14683.             where name = 'sp_check_constbytable_rowset' and type = 'P '))
  14684.         begin
  14685.         drop procedure sp_check_constbytable_rowset
  14686.         dump tran master with no_log
  14687.         end
  14688.     end
  14689. go
  14690.  
  14691.  
  14692. print ''
  14693. print 'creating sp_foreign_keys_rowset'
  14694. go
  14695.  
  14696. /*    Procedure for 6.0 and 6.5 server */
  14697. CREATE PROCEDURE sp_foreign_keys_rowset
  14698.     (
  14699.      @pk_table_name        varchar(255) = null,
  14700.     @pk_table_schema    varchar(255) = null,
  14701.     @pk_table_catalog    varchar(255) = null,
  14702.     @fk_table_name        varchar(255) = null,
  14703.     @fk_table_schema    varchar(255) = null,
  14704.     @fk_table_catalog    varchar(255) = null
  14705.     )
  14706. as
  14707.     BEGIN
  14708.     select
  14709.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  14710.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  14711.         PK_TABLE_NAME         = o1.name,
  14712.         PK_COLUMN_NAME         = c1.name,
  14713.         PK_COLUMN_GUID        = convert(binary(16),null),
  14714.         PK_COLUMN_PROPID    = convert(int,null),
  14715.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  14716.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  14717.         FK_TABLE_NAME         = o2.name,
  14718.         FK_COLUMN_NAME         = c2.name,
  14719.         FK_COLUMN_GUID        = convert(binary(16),null),
  14720.         FK_COLUMN_PROPID    = convert(int,null),
  14721.         ORDINAL                = convert(int,1),
  14722.         UPDATE_RULE            = 'NO ACTION',
  14723.         DELETE_RULE         = 'NO ACTION',
  14724.         PK_NAME                = i.name,
  14725.         FK_NAME                = object_name(r.constid),
  14726.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  14727.     from
  14728.         sysobjects o1, sysobjects o2,
  14729.         syscolumns c1, syscolumns c2,
  14730.         sysreferences r, sysindexes i, sysusers u
  14731.     where    
  14732.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14733.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14734.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14735.     and (@pk_table_name is null or @pk_table_name = o1.name)
  14736.     and (@fk_table_name is null or @fk_table_name = o2.name)
  14737.     and    o1.id = r.rkeyid
  14738.     and    o1.id = c1.id
  14739.     and    c1.colid = r.rkey1
  14740.     and r.fkeyid = o2.id
  14741.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14742.     and    o2.id = c2.id    
  14743.     and    c2.colid = r.fkey1
  14744.     and i.id = r.rkeyid
  14745.     and i.indid = r.rkeyindid
  14746.     and u.uid = user_id()
  14747.     and ( suser_id() = 1     /* User is the System Administrator */
  14748.     or (
  14749.         o1.uid = user_id()     /* User created the object */
  14750.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14751.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14752.             from sysprotects p
  14753.             where p.id = o1.id
  14754.             /* get rows for public,current user,user's group */
  14755.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14756.             /* check for SELECT,EXECUTE privilege */
  14757.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14758.             ) = 1    /* final magic...compare Grants      */
  14759.         )
  14760.     and (
  14761.         o2.uid = user_id()     /* User created the object */
  14762.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14763.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14764.             from sysprotects p
  14765.             where p.id = o2.id
  14766.             /* get rows for public,current user,user's group */
  14767.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14768.             /* check for SELECT,EXECUTE privilege */
  14769.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14770.             ) = 1    /* final magic...compare Grants      */
  14771.         )
  14772.     )
  14773.     union all
  14774.     select
  14775.         db_name(r.rkeydbid),
  14776.         user_name(o1.uid),
  14777.         o1.name,
  14778.         c1.name,
  14779.         convert(binary(16),null),
  14780.         convert(int,null),
  14781.         db_name(r.fkeydbid),
  14782.         user_name(o2.uid),
  14783.         o2.name,
  14784.         c2.name,
  14785.         convert(binary(16),null),
  14786.         convert(int,null),
  14787.         convert(int,2),
  14788.         'NO ACTION',
  14789.         'NO ACTION',
  14790.         i.name,
  14791.         object_name(r.constid),
  14792.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  14793.     from
  14794.         sysobjects o1, sysobjects o2,
  14795.         syscolumns c1, syscolumns c2,
  14796.         sysreferences r, sysindexes i, sysusers u
  14797.     where    
  14798.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14799.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14800.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14801.     and (@pk_table_name is null or @pk_table_name = o1.name)
  14802.     and (@fk_table_name is null or @fk_table_name = o2.name)
  14803.     and    o1.id = r.rkeyid
  14804.     and    r.keycnt >= 2
  14805.     and    o1.id = c1.id
  14806.     and    c1.colid = r.rkey2
  14807.     and r.fkeyid = o2.id
  14808.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14809.     and    o2.id = c2.id    
  14810.     and    c2.colid = r.fkey2
  14811.     and i.id = r.rkeyid
  14812.     and i.indid = r.rkeyindid
  14813.     and u.uid = user_id()
  14814.     and ( suser_id() = 1     /* User is the System Administrator */
  14815.     or (
  14816.         o1.uid = user_id()     /* User created the object */
  14817.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14818.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14819.             from sysprotects p
  14820.             where p.id = o1.id
  14821.             /* get rows for public,current user,user's group */
  14822.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14823.             /* check for SELECT,EXECUTE privilege */
  14824.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14825.             ) = 1    /* final magic...compare Grants      */
  14826.         )
  14827.     and (
  14828.         o2.uid = user_id()     /* User created the object */
  14829.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14830.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14831.             from sysprotects p
  14832.             where p.id = o2.id
  14833.             /* get rows for public,current user,user's group */
  14834.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14835.             /* check for SELECT,EXECUTE privilege */
  14836.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14837.             ) = 1    /* final magic...compare Grants      */
  14838.         )
  14839.     )
  14840.     union all
  14841.     select
  14842.         db_name(r.rkeydbid),
  14843.         user_name(o1.uid),
  14844.         o1.name,
  14845.         c1.name,
  14846.         convert(binary(16),null),
  14847.         convert(int,null),
  14848.         db_name(r.fkeydbid),
  14849.         user_name(o2.uid),
  14850.         o2.name,
  14851.         c2.name,
  14852.         convert(binary(16),null),
  14853.         convert(int,null),
  14854.         convert(int,3),
  14855.         'NO ACTION',
  14856.         'NO ACTION',
  14857.         i.name,
  14858.         object_name(r.constid),
  14859.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  14860.     from
  14861.         sysobjects o1, sysobjects o2,
  14862.         syscolumns c1, syscolumns c2,
  14863.         sysreferences r, sysindexes i, sysusers u
  14864.     where    
  14865.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14866.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14867.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14868.     and (@pk_table_name is null or @pk_table_name = o1.name)
  14869.     and (@fk_table_name is null or @fk_table_name = o2.name)
  14870.     and    o1.id = r.rkeyid
  14871.     and    r.keycnt >= 3
  14872.     and    o1.id = c1.id
  14873.     and    c1.colid = r.rkey3
  14874.     and r.fkeyid = o2.id
  14875.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14876.     and    o2.id = c2.id    
  14877.     and    c2.colid = r.fkey3
  14878.     and i.id = r.rkeyid
  14879.     and i.indid = r.rkeyindid
  14880.     and u.uid = user_id()
  14881.     and ( suser_id() = 1     /* User is the System Administrator */
  14882.     or (
  14883.         o1.uid = user_id()     /* User created the object */
  14884.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14885.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14886.             from sysprotects p
  14887.             where p.id = o1.id
  14888.             /* get rows for public,current user,user's group */
  14889.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14890.             /* check for SELECT,EXECUTE privilege */
  14891.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14892.             ) = 1    /* final magic...compare Grants      */
  14893.         )
  14894.     and (
  14895.         o2.uid = user_id()     /* User created the object */
  14896.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14897.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14898.             from sysprotects p
  14899.             where p.id = o2.id
  14900.             /* get rows for public,current user,user's group */
  14901.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14902.             /* check for SELECT,EXECUTE privilege */
  14903.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14904.             ) = 1    /* final magic...compare Grants      */
  14905.         )
  14906.     )
  14907.     union all
  14908.     select
  14909.         db_name(r.rkeydbid),
  14910.         user_name(o1.uid),
  14911.         o1.name,
  14912.         c1.name,
  14913.         convert(binary(16),null),
  14914.         convert(int,null),
  14915.         db_name(r.fkeydbid),
  14916.         user_name(o2.uid),
  14917.         o2.name,
  14918.         c2.name,
  14919.         convert(binary(16),null),
  14920.         convert(int,null),
  14921.         convert(int,4),
  14922.         'NO ACTION',
  14923.         'NO ACTION',
  14924.         i.name,
  14925.         object_name(r.constid),
  14926.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  14927.     from
  14928.         sysobjects o1, sysobjects o2,
  14929.         syscolumns c1, syscolumns c2,
  14930.         sysreferences r, sysindexes i, sysusers u
  14931.     where    
  14932.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  14933.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  14934.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  14935.     and (@pk_table_name is null or @pk_table_name = o1.name)
  14936.     and (@fk_table_name is null or @fk_table_name = o2.name)
  14937.     and    o1.id = r.rkeyid
  14938.     and    r.keycnt >= 4
  14939.     and    o1.id = c1.id
  14940.     and    c1.colid = r.rkey4
  14941.     and r.fkeyid = o2.id
  14942.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  14943.     and    o2.id = c2.id    
  14944.     and    c2.colid = r.fkey4
  14945.     and i.id = r.rkeyid
  14946.     and i.indid = r.rkeyindid
  14947.     and u.uid = user_id()
  14948.     and ( suser_id() = 1     /* User is the System Administrator */
  14949.     or (
  14950.         o1.uid = user_id()     /* User created the object */
  14951.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14952.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14953.             from sysprotects p
  14954.             where p.id = o1.id
  14955.             /* get rows for public,current user,user's group */
  14956.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14957.             /* check for SELECT,EXECUTE privilege */
  14958.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14959.             ) = 1    /* final magic...compare Grants      */
  14960.         )
  14961.     and (
  14962.         o2.uid = user_id()     /* User created the object */
  14963.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  14964.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  14965.             from sysprotects p
  14966.             where p.id = o2.id
  14967.             /* get rows for public,current user,user's group */
  14968.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  14969.             /* check for SELECT,EXECUTE privilege */
  14970.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  14971.             ) = 1    /* final magic...compare Grants      */
  14972.         )
  14973.     )
  14974.     union all
  14975.     select
  14976.         db_name(r.rkeydbid),
  14977.         user_name(o1.uid),
  14978.         o1.name,
  14979.         c1.name,
  14980.         convert(binary(16),null),
  14981.         convert(int,null),
  14982.         db_name(r.fkeydbid),
  14983.         user_name(o2.uid),
  14984.         o2.name,
  14985.         c2.name,
  14986.         convert(binary(16),null),
  14987.         convert(int,null),
  14988.         convert(int,5),
  14989.         'NO ACTION',
  14990.         'NO ACTION',
  14991.         i.name,
  14992.         object_name(r.constid),
  14993.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  14994.     from
  14995.         sysobjects o1, sysobjects o2,
  14996.         syscolumns c1, syscolumns c2,
  14997.         sysreferences r, sysindexes i, sysusers u
  14998.     where    
  14999.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15000.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15001.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15002.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15003.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15004.     and    o1.id = r.rkeyid
  15005.     and    r.keycnt >= 5
  15006.     and    o1.id = c1.id
  15007.     and    c1.colid = r.rkey5
  15008.     and r.fkeyid = o2.id
  15009.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15010.     and    o2.id = c2.id    
  15011.     and    c2.colid = r.fkey5
  15012.     and i.id = r.rkeyid
  15013.     and i.indid = r.rkeyindid
  15014.     and u.uid = user_id()
  15015.     and ( suser_id() = 1     /* User is the System Administrator */
  15016.     or (
  15017.         o1.uid = user_id()     /* User created the object */
  15018.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15019.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15020.             from sysprotects p
  15021.             where p.id = o1.id
  15022.             /* get rows for public,current user,user's group */
  15023.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15024.             /* check for SELECT,EXECUTE privilege */
  15025.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15026.             ) = 1    /* final magic...compare Grants      */
  15027.         )
  15028.     and (
  15029.         o2.uid = user_id()     /* User created the object */
  15030.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15031.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15032.             from sysprotects p
  15033.             where p.id = o2.id
  15034.             /* get rows for public,current user,user's group */
  15035.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15036.             /* check for SELECT,EXECUTE privilege */
  15037.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15038.             ) = 1    /* final magic...compare Grants      */
  15039.         )
  15040.     )
  15041.     union all
  15042.     select
  15043.         db_name(r.rkeydbid),
  15044.         user_name(o1.uid),
  15045.         o1.name,
  15046.         c1.name,
  15047.         convert(binary(16),null),
  15048.         convert(int,null),
  15049.         db_name(r.fkeydbid),
  15050.         user_name(o2.uid),
  15051.         o2.name,
  15052.         c2.name,
  15053.         convert(binary(16),null),
  15054.         convert(int,null),
  15055.         convert(int,6),
  15056.         'NO ACTION',
  15057.         'NO ACTION',
  15058.         i.name,
  15059.         object_name(r.constid),
  15060.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15061.     from
  15062.         sysobjects o1, sysobjects o2,
  15063.         syscolumns c1, syscolumns c2,
  15064.         sysreferences r, sysindexes i, sysusers u
  15065.     where    
  15066.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15067.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15068.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15069.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15070.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15071.     and    o1.id = r.rkeyid
  15072.     and    r.keycnt >= 6
  15073.     and    o1.id = c1.id
  15074.     and    c1.colid = r.rkey6
  15075.     and r.fkeyid = o2.id
  15076.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15077.     and    o2.id = c2.id    
  15078.     and    c2.colid = r.fkey6
  15079.     and i.id = r.rkeyid
  15080.     and i.indid = r.rkeyindid
  15081.     and u.uid = user_id()
  15082.     and ( suser_id() = 1     /* User is the System Administrator */
  15083.     or (
  15084.         o1.uid = user_id()     /* User created the object */
  15085.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15086.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15087.             from sysprotects p
  15088.             where p.id = o1.id
  15089.             /* get rows for public,current user,user's group */
  15090.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15091.             /* check for SELECT,EXECUTE privilege */
  15092.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15093.             ) = 1    /* final magic...compare Grants      */
  15094.         )
  15095.     and (
  15096.         o2.uid = user_id()     /* User created the object */
  15097.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15098.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15099.             from sysprotects p
  15100.             where p.id = o2.id
  15101.             /* get rows for public,current user,user's group */
  15102.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15103.             /* check for SELECT,EXECUTE privilege */
  15104.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15105.             ) = 1    /* final magic...compare Grants      */
  15106.         )
  15107.     )
  15108.     union all
  15109.     select
  15110.         db_name(r.rkeydbid),
  15111.         user_name(o1.uid),
  15112.         o1.name,
  15113.         c1.name,
  15114.         convert(binary(16),null),
  15115.         convert(int,null),
  15116.         db_name(r.fkeydbid),
  15117.         user_name(o2.uid),
  15118.         o2.name,
  15119.         c2.name,
  15120.         convert(binary(16),null),
  15121.         convert(int,null),
  15122.         convert(int,7),
  15123.         'NO ACTION',
  15124.         'NO ACTION',
  15125.         i.name,
  15126.         object_name(r.constid),
  15127.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15128.     from
  15129.         sysobjects o1, sysobjects o2,
  15130.         syscolumns c1, syscolumns c2,
  15131.         sysreferences r, sysindexes i, sysusers u
  15132.     where    
  15133.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15134.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15135.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15136.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15137.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15138.     and    o1.id = r.rkeyid
  15139.     and    r.keycnt >= 7
  15140.     and    o1.id = c1.id
  15141.     and    c1.colid = r.rkey7
  15142.     and r.fkeyid = o2.id
  15143.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15144.     and    o2.id = c2.id    
  15145.     and    c2.colid = r.fkey7
  15146.     and i.id = r.rkeyid
  15147.     and i.indid = r.rkeyindid
  15148.     and u.uid = user_id()
  15149.     and ( suser_id() = 1     /* User is the System Administrator */
  15150.     or (
  15151.         o1.uid = user_id()     /* User created the object */
  15152.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15153.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15154.             from sysprotects p
  15155.             where p.id = o1.id
  15156.             /* get rows for public,current user,user's group */
  15157.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15158.             /* check for SELECT,EXECUTE privilege */
  15159.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15160.             ) = 1    /* final magic...compare Grants      */
  15161.         )
  15162.     and (
  15163.         o2.uid = user_id()     /* User created the object */
  15164.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15165.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15166.             from sysprotects p
  15167.             where p.id = o2.id
  15168.             /* get rows for public,current user,user's group */
  15169.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15170.             /* check for SELECT,EXECUTE privilege */
  15171.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15172.             ) = 1    /* final magic...compare Grants      */
  15173.         )
  15174.     )
  15175.     union all
  15176.     select
  15177.         db_name(r.rkeydbid),
  15178.         user_name(o1.uid),
  15179.         o1.name,
  15180.         c1.name,
  15181.         convert(binary(16),null),
  15182.         convert(int,null),
  15183.         db_name(r.fkeydbid),
  15184.         user_name(o2.uid),
  15185.         o2.name,
  15186.         c2.name,
  15187.         convert(binary(16),null),
  15188.         convert(int,null),
  15189.         convert(int,8),
  15190.         'NO ACTION',
  15191.         'NO ACTION',
  15192.         i.name,
  15193.         object_name(r.constid),
  15194.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15195.     from
  15196.         sysobjects o1, sysobjects o2,
  15197.         syscolumns c1, syscolumns c2,
  15198.         sysreferences r, sysindexes i, sysusers u
  15199.     where    
  15200.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15201.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15202.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15203.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15204.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15205.     and    o1.id = r.rkeyid
  15206.     and    r.keycnt >= 8
  15207.     and    o1.id = c1.id
  15208.     and    c1.colid = r.rkey8
  15209.     and r.fkeyid = o2.id
  15210.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15211.     and    o2.id = c2.id    
  15212.     and    c2.colid = r.fkey8
  15213.     and i.id = r.rkeyid
  15214.     and i.indid = r.rkeyindid
  15215.     and u.uid = user_id()
  15216.     and ( suser_id() = 1     /* User is the System Administrator */
  15217.     or (
  15218.         o1.uid = user_id()     /* User created the object */
  15219.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15220.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15221.             from sysprotects p
  15222.             where p.id = o1.id
  15223.             /* get rows for public,current user,user's group */
  15224.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15225.             /* check for SELECT,EXECUTE privilege */
  15226.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15227.             ) = 1    /* final magic...compare Grants      */
  15228.         )
  15229.     and (
  15230.         o2.uid = user_id()     /* User created the object */
  15231.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15232.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15233.             from sysprotects p
  15234.             where p.id = o2.id
  15235.             /* get rows for public,current user,user's group */
  15236.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15237.             /* check for SELECT,EXECUTE privilege */
  15238.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15239.             ) = 1    /* final magic...compare Grants      */
  15240.         )
  15241.     )
  15242.     union all
  15243.     select
  15244.         db_name(r.rkeydbid),
  15245.         user_name(o1.uid),
  15246.         o1.name,
  15247.         c1.name,
  15248.         convert(binary(16),null),
  15249.         convert(int,null),
  15250.         db_name(r.fkeydbid),
  15251.         user_name(o2.uid),
  15252.         o2.name,
  15253.         c2.name,
  15254.         convert(binary(16),null),
  15255.         convert(int,null),
  15256.         convert(int,9),
  15257.         'NO ACTION',
  15258.         'NO ACTION',
  15259.         i.name,
  15260.         object_name(r.constid),
  15261.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15262.     from
  15263.         sysobjects o1, sysobjects o2,
  15264.         syscolumns c1, syscolumns c2,
  15265.         sysreferences r, sysindexes i, sysusers u
  15266.     where    
  15267.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15268.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15269.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15270.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15271.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15272.     and    o1.id = r.rkeyid
  15273.     and    r.keycnt >= 9
  15274.     and    o1.id = c1.id
  15275.     and    c1.colid = r.rkey9
  15276.     and r.fkeyid = o2.id
  15277.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15278.     and    o2.id = c2.id    
  15279.     and    c2.colid = r.fkey9
  15280.     and i.id = r.rkeyid
  15281.     and i.indid = r.rkeyindid
  15282.     and u.uid = user_id()
  15283.     and ( suser_id() = 1     /* User is the System Administrator */
  15284.     or (
  15285.         o1.uid = user_id()     /* User created the object */
  15286.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15287.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15288.             from sysprotects p
  15289.             where p.id = o1.id
  15290.             /* get rows for public,current user,user's group */
  15291.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15292.             /* check for SELECT,EXECUTE privilege */
  15293.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15294.             ) = 1    /* final magic...compare Grants      */
  15295.         )
  15296.     and (
  15297.         o2.uid = user_id()     /* User created the object */
  15298.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15299.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15300.             from sysprotects p
  15301.             where p.id = o2.id
  15302.             /* get rows for public,current user,user's group */
  15303.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15304.             /* check for SELECT,EXECUTE privilege */
  15305.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15306.             ) = 1    /* final magic...compare Grants      */
  15307.         )
  15308.     )
  15309.     union all
  15310.     select
  15311.         db_name(r.rkeydbid),
  15312.         user_name(o1.uid),
  15313.         o1.name,
  15314.         c1.name,
  15315.         convert(binary(16),null),
  15316.         convert(int,null),
  15317.         db_name(r.fkeydbid),
  15318.         user_name(o2.uid),
  15319.         o2.name,
  15320.         c2.name,
  15321.         convert(binary(16),null),
  15322.         convert(int,null),
  15323.         convert(int,10),
  15324.         'NO ACTION',
  15325.         'NO ACTION',
  15326.         i.name,
  15327.         object_name(r.constid),
  15328.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15329.     from
  15330.         sysobjects o1, sysobjects o2,
  15331.         syscolumns c1, syscolumns c2,
  15332.         sysreferences r, sysindexes i, sysusers u
  15333.     where    
  15334.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15335.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15336.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15337.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15338.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15339.     and    o1.id = r.rkeyid
  15340.     and    r.keycnt >= 10
  15341.     and    o1.id = c1.id
  15342.     and    c1.colid = r.rkey10
  15343.     and r.fkeyid = o2.id
  15344.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15345.     and    o2.id = c2.id    
  15346.     and    c2.colid = r.fkey10
  15347.     and i.id = r.rkeyid
  15348.     and i.indid = r.rkeyindid
  15349.     and u.uid = user_id()
  15350.     and ( suser_id() = 1     /* User is the System Administrator */
  15351.     or (
  15352.         o1.uid = user_id()     /* User created the object */
  15353.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15354.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15355.             from sysprotects p
  15356.             where p.id = o1.id
  15357.             /* get rows for public,current user,user's group */
  15358.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15359.             /* check for SELECT,EXECUTE privilege */
  15360.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15361.             ) = 1    /* final magic...compare Grants      */
  15362.         )
  15363.     and (
  15364.         o2.uid = user_id()     /* User created the object */
  15365.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15366.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15367.             from sysprotects p
  15368.             where p.id = o2.id
  15369.             /* get rows for public,current user,user's group */
  15370.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15371.             /* check for SELECT,EXECUTE privilege */
  15372.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15373.             ) = 1    /* final magic...compare Grants      */
  15374.         )
  15375.     )
  15376.     union all
  15377.     select
  15378.         db_name(r.rkeydbid),
  15379.         user_name(o1.uid),
  15380.         o1.name,
  15381.         c1.name,
  15382.         convert(binary(16),null),
  15383.         convert(int,null),
  15384.         db_name(r.fkeydbid),
  15385.         user_name(o2.uid),
  15386.         o2.name,
  15387.         c2.name,
  15388.         convert(binary(16),null),
  15389.         convert(int,null),
  15390.         convert(int,11),
  15391.         'NO ACTION',
  15392.         'NO ACTION',
  15393.         i.name,
  15394.         object_name(r.constid),
  15395.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15396.     from
  15397.         sysobjects o1, sysobjects o2,
  15398.         syscolumns c1, syscolumns c2,
  15399.         sysreferences r, sysindexes i, sysusers u
  15400.     where    
  15401.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15402.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15403.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15404.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15405.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15406.     and    o1.id = r.rkeyid
  15407.     and    r.keycnt >= 11
  15408.     and    o1.id = c1.id
  15409.     and    c1.colid = r.rkey11
  15410.     and r.fkeyid = o2.id
  15411.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15412.     and    o2.id = c2.id    
  15413.     and    c2.colid = r.fkey11
  15414.     and i.id = r.rkeyid
  15415.     and i.indid = r.rkeyindid
  15416.     and u.uid = user_id()
  15417.     and ( suser_id() = 1     /* User is the System Administrator */
  15418.     or (
  15419.         o1.uid = user_id()     /* User created the object */
  15420.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15421.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15422.             from sysprotects p
  15423.             where p.id = o1.id
  15424.             /* get rows for public,current user,user's group */
  15425.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15426.             /* check for SELECT,EXECUTE privilege */
  15427.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15428.             ) = 1    /* final magic...compare Grants      */
  15429.         )
  15430.     and (
  15431.         o2.uid = user_id()     /* User created the object */
  15432.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15433.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15434.             from sysprotects p
  15435.             where p.id = o2.id
  15436.             /* get rows for public,current user,user's group */
  15437.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15438.             /* check for SELECT,EXECUTE privilege */
  15439.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15440.             ) = 1    /* final magic...compare Grants      */
  15441.         )
  15442.     )
  15443.     union all
  15444.     select
  15445.         db_name(r.rkeydbid),
  15446.         user_name(o1.uid),
  15447.         o1.name,
  15448.         c1.name,
  15449.         convert(binary(16),null),
  15450.         convert(int,null),
  15451.         db_name(r.fkeydbid),
  15452.         user_name(o2.uid),
  15453.         o2.name,
  15454.         c2.name,
  15455.         convert(binary(16),null),
  15456.         convert(int,null),
  15457.         convert(int,12),
  15458.         'NO ACTION',
  15459.         'NO ACTION',
  15460.         i.name,
  15461.         object_name(r.constid),
  15462.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15463.     from
  15464.         sysobjects o1, sysobjects o2,
  15465.         syscolumns c1, syscolumns c2,
  15466.         sysreferences r, sysindexes i, sysusers u
  15467.     where    
  15468.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15469.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15470.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15471.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15472.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15473.     and    o1.id = r.rkeyid
  15474.     and    r.keycnt >= 12
  15475.     and    o1.id = c1.id
  15476.     and    c1.colid = r.rkey12
  15477.     and r.fkeyid = o2.id
  15478.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15479.     and    o2.id = c2.id    
  15480.     and    c2.colid = r.fkey12
  15481.     and i.id = r.rkeyid
  15482.     and i.indid = r.rkeyindid
  15483.     and u.uid = user_id()
  15484.     and ( suser_id() = 1     /* User is the System Administrator */
  15485.     or (
  15486.         o1.uid = user_id()     /* User created the object */
  15487.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15488.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15489.             from sysprotects p
  15490.             where p.id = o1.id
  15491.             /* get rows for public,current user,user's group */
  15492.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15493.             /* check for SELECT,EXECUTE privilege */
  15494.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15495.             ) = 1    /* final magic...compare Grants      */
  15496.         )
  15497.     and (
  15498.         o2.uid = user_id()     /* User created the object */
  15499.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15500.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15501.             from sysprotects p
  15502.             where p.id = o2.id
  15503.             /* get rows for public,current user,user's group */
  15504.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15505.             /* check for SELECT,EXECUTE privilege */
  15506.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15507.             ) = 1    /* final magic...compare Grants      */
  15508.         )
  15509.     )
  15510.     union all
  15511.     select
  15512.         db_name(r.rkeydbid),
  15513.         user_name(o1.uid),
  15514.         o1.name,
  15515.         c1.name,
  15516.         convert(binary(16),null),
  15517.         convert(int,null),
  15518.         db_name(r.fkeydbid),
  15519.         user_name(o2.uid),
  15520.         o2.name,
  15521.         c2.name,
  15522.         convert(binary(16),null),
  15523.         convert(int,null),
  15524.         convert(int,13),
  15525.         'NO ACTION',
  15526.         'NO ACTION',
  15527.         i.name,
  15528.         object_name(r.constid),
  15529.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15530.     from
  15531.         sysobjects o1, sysobjects o2,
  15532.         syscolumns c1, syscolumns c2,
  15533.         sysreferences r, sysindexes i, sysusers u
  15534.     where    
  15535.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15536.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15537.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15538.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15539.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15540.     and    o1.id = r.rkeyid
  15541.     and    r.keycnt >= 13
  15542.     and    o1.id = c1.id
  15543.     and    c1.colid = r.rkey13
  15544.     and r.fkeyid = o2.id
  15545.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15546.     and    o2.id = c2.id    
  15547.     and    c2.colid = r.fkey13
  15548.     and i.id = r.rkeyid
  15549.     and i.indid = r.rkeyindid
  15550.     and u.uid = user_id()
  15551.     and ( suser_id() = 1     /* User is the System Administrator */
  15552.     or (
  15553.         o1.uid = user_id()     /* User created the object */
  15554.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15555.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15556.             from sysprotects p
  15557.             where p.id = o1.id
  15558.             /* get rows for public,current user,user's group */
  15559.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15560.             /* check for SELECT,EXECUTE privilege */
  15561.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15562.             ) = 1    /* final magic...compare Grants      */
  15563.         )
  15564.     and (
  15565.         o2.uid = user_id()     /* User created the object */
  15566.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15567.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15568.             from sysprotects p
  15569.             where p.id = o2.id
  15570.             /* get rows for public,current user,user's group */
  15571.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15572.             /* check for SELECT,EXECUTE privilege */
  15573.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15574.             ) = 1    /* final magic...compare Grants      */
  15575.         )
  15576.     )
  15577.     union all
  15578.     select
  15579.         db_name(r.rkeydbid),
  15580.         user_name(o1.uid),
  15581.         o1.name,
  15582.         c1.name,
  15583.         convert(binary(16),null),
  15584.         convert(int,null),
  15585.         db_name(r.fkeydbid),
  15586.         user_name(o2.uid),
  15587.         o2.name,
  15588.         c2.name,
  15589.         convert(binary(16),null),
  15590.         convert(int,null),
  15591.         convert(int,14),
  15592.         'NO ACTION',
  15593.         'NO ACTION',
  15594.         i.name,
  15595.         object_name(r.constid),
  15596.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15597.     from
  15598.         sysobjects o1, sysobjects o2,
  15599.         syscolumns c1, syscolumns c2,
  15600.         sysreferences r, sysindexes i, sysusers u
  15601.     where    
  15602.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15603.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15604.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15605.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15606.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15607.     and    o1.id = r.rkeyid
  15608.     and    r.keycnt >= 14
  15609.     and    o1.id = c1.id
  15610.     and    c1.colid = r.rkey14
  15611.     and r.fkeyid = o2.id
  15612.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15613.     and    o2.id = c2.id    
  15614.     and    c2.colid = r.fkey14
  15615.     and i.id = r.rkeyid
  15616.     and i.indid = r.rkeyindid
  15617.     and u.uid = user_id()
  15618.     and ( suser_id() = 1     /* User is the System Administrator */
  15619.     or (
  15620.         o1.uid = user_id()     /* User created the object */
  15621.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15622.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15623.             from sysprotects p
  15624.             where p.id = o1.id
  15625.             /* get rows for public,current user,user's group */
  15626.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15627.             /* check for SELECT,EXECUTE privilege */
  15628.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15629.             ) = 1    /* final magic...compare Grants      */
  15630.         )
  15631.     and (
  15632.         o2.uid = user_id()     /* User created the object */
  15633.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15634.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15635.             from sysprotects p
  15636.             where p.id = o2.id
  15637.             /* get rows for public,current user,user's group */
  15638.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15639.             /* check for SELECT,EXECUTE privilege */
  15640.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15641.             ) = 1    /* final magic...compare Grants      */
  15642.         )
  15643.     )
  15644.     union all
  15645.     select
  15646.         db_name(r.rkeydbid),
  15647.         user_name(o1.uid),
  15648.         o1.name,
  15649.         c1.name,
  15650.         convert(binary(16),null),
  15651.         convert(int,null),
  15652.         db_name(r.fkeydbid),
  15653.         user_name(o2.uid),
  15654.         o2.name,
  15655.         c2.name,
  15656.         convert(binary(16),null),
  15657.         convert(int,null),
  15658.         convert(int,15),
  15659.         'NO ACTION',
  15660.         'NO ACTION',
  15661.         i.name,
  15662.         object_name(r.constid),
  15663.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15664.     from
  15665.         sysobjects o1, sysobjects o2,
  15666.         syscolumns c1, syscolumns c2,
  15667.         sysreferences r, sysindexes i, sysusers u
  15668.     where    
  15669.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15670.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15671.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15672.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15673.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15674.     and    o1.id = r.rkeyid
  15675.     and    r.keycnt >= 15
  15676.     and    o1.id = c1.id
  15677.     and    c1.colid = r.rkey15
  15678.     and r.fkeyid = o2.id
  15679.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15680.     and    o2.id = c2.id    
  15681.     and    c2.colid = r.fkey15
  15682.     and i.id = r.rkeyid
  15683.     and i.indid = r.rkeyindid
  15684.     and u.uid = user_id()
  15685.     and ( suser_id() = 1     /* User is the System Administrator */
  15686.     or (
  15687.         o1.uid = user_id()     /* User created the object */
  15688.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15689.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15690.             from sysprotects p
  15691.             where p.id = o1.id
  15692.             /* get rows for public,current user,user's group */
  15693.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15694.             /* check for SELECT,EXECUTE privilege */
  15695.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15696.             ) = 1    /* final magic...compare Grants      */
  15697.         )
  15698.     and (
  15699.         o2.uid = user_id()     /* User created the object */
  15700.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15701.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15702.             from sysprotects p
  15703.             where p.id = o2.id
  15704.             /* get rows for public,current user,user's group */
  15705.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15706.             /* check for SELECT,EXECUTE privilege */
  15707.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15708.             ) = 1    /* final magic...compare Grants      */
  15709.         )
  15710.     )
  15711.     union all
  15712.     select
  15713.         db_name(r.rkeydbid),
  15714.         user_name(o1.uid),
  15715.         o1.name,
  15716.         c1.name,
  15717.         convert(binary(16),null),
  15718.         convert(int,null),
  15719.         db_name(r.fkeydbid),
  15720.         user_name(o2.uid),
  15721.         o2.name,
  15722.         c2.name,
  15723.         convert(binary(16),null),
  15724.         convert(int,null),
  15725.         convert(int,16),
  15726.         'NO ACTION',
  15727.         'NO ACTION',
  15728.         i.name,
  15729.         object_name(r.constid),
  15730.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15731.     from
  15732.         sysobjects o1, sysobjects o2,
  15733.         syscolumns c1, syscolumns c2,
  15734.         sysreferences r, sysindexes i, sysusers u
  15735.     where    
  15736.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15737.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15738.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15739.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15740.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15741.     and    o1.id = r.rkeyid
  15742.     and    o1.id = c1.id
  15743.     and    r.keycnt >= 16
  15744.     and    c1.colid = r.rkey16
  15745.     and r.fkeyid = o2.id
  15746.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15747.     and    o2.id = c2.id    
  15748.     and    c2.colid = r.fkey16
  15749.     and i.id = r.rkeyid
  15750.     and i.indid = r.rkeyindid
  15751.     and u.uid = user_id()
  15752.     and ( suser_id() = 1     /* User is the System Administrator */
  15753.     or (
  15754.         o1.uid = user_id()     /* User created the object */
  15755.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15756.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15757.             from sysprotects p
  15758.             where p.id = o1.id
  15759.             /* get rows for public,current user,user's group */
  15760.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15761.             /* check for SELECT,EXECUTE privilege */
  15762.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15763.             ) = 1    /* final magic...compare Grants      */
  15764.         )
  15765.     and (
  15766.         o2.uid = user_id()     /* User created the object */
  15767.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15768.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15769.             from sysprotects p
  15770.             where p.id = o2.id
  15771.             /* get rows for public,current user,user's group */
  15772.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15773.             /* check for SELECT,EXECUTE privilege */
  15774.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15775.             ) = 1    /* final magic...compare Grants      */
  15776.         )
  15777.     )
  15778.     order by 8,9,2,3,13
  15779.     END
  15780. go
  15781. dump tran master with no_log
  15782. go
  15783. CREATE PROCEDURE sp_foreign_keys_rowset;2
  15784.     (
  15785.        @handle            int output,
  15786.        @scrollopt        int output,
  15787.     @ccopt            int output,
  15788.     @rows            int output,
  15789.      @pk_table_name        varchar(255) = null,
  15790.     @pk_table_schema    varchar(255) = null,
  15791.     @pk_table_catalog    varchar(255) = null,
  15792.     @fk_table_name        varchar(255) = null,
  15793.     @fk_table_schema    varchar(255) = null,
  15794.     @fk_table_catalog    varchar(255) = null
  15795.     )
  15796. as
  15797.     declare @ret int
  15798.     
  15799.     SET NOCOUNT ON
  15800.  
  15801.     create table #spfkeysrowset1
  15802.         (
  15803.         PK_TABLE_CATALOG    sysname not null,
  15804.         PK_TABLE_SCHEMA        sysname not null,
  15805.         PK_TABLE_NAME         sysname not null,
  15806.         PK_COLUMN_NAME         sysname not null,
  15807.         PK_COLUMN_GUID        binary(16) null,
  15808.         PK_COLUMN_PROPID    int null,
  15809.         FK_TABLE_CATALOG    sysname not null,
  15810.         FK_TABLE_SCHEMA        sysname not null,
  15811.         FK_TABLE_NAME         sysname not null,
  15812.         FK_COLUMN_NAME         sysname not null,
  15813.         FK_COLUMN_GUID        binary(16) null,
  15814.         FK_COLUMN_PROPID    int null,
  15815.         ORDINAL                int not null,
  15816.         UPDATE_RULE            sysname not null,
  15817.         DELETE_RULE         sysname not null,
  15818.         PK_NAME                sysname not null,
  15819.         FK_NAME                sysname not null,
  15820.         DEFERRABILITY        smallint not null        
  15821.         )
  15822.     BEGIN
  15823.     insert into #spfkeysrowset1
  15824.     select
  15825.         db_name(r.rkeydbid),
  15826.         user_name(o1.uid),
  15827.         o1.name,
  15828.         c1.name,
  15829.         convert(binary(16),null),
  15830.         convert(int,null),
  15831.         db_name(r.fkeydbid),
  15832.         user_name(o2.uid),
  15833.         o2.name,
  15834.         c2.name,
  15835.         convert(binary(16),null),
  15836.         convert(int,null),
  15837.         convert(int,1),
  15838.         'NO ACTION',
  15839.         'NO ACTION',
  15840.         i.name,
  15841.         object_name(r.constid),
  15842.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15843.     from
  15844.         sysobjects o1, sysobjects o2,
  15845.         syscolumns c1, syscolumns c2,
  15846.         sysreferences r, sysindexes i, sysusers u
  15847.     where    
  15848.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15849.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15850.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15851.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15852.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15853.     and    o1.id = r.rkeyid
  15854.     and    o1.id = c1.id
  15855.     and    c1.colid = r.rkey1
  15856.     and r.fkeyid = o2.id
  15857.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15858.     and    o2.id = c2.id    
  15859.     and    c2.colid = r.fkey1
  15860.     and i.id = r.rkeyid
  15861.     and i.indid = r.rkeyindid
  15862.     and u.uid = user_id()
  15863.     and ( suser_id() = 1     /* User is the System Administrator */
  15864.     or (
  15865.         o1.uid = user_id()     /* User created the object */
  15866.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15867.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15868.             from sysprotects p
  15869.             where p.id = o1.id
  15870.             /* get rows for public,current user,user's group */
  15871.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15872.             /* check for SELECT,EXECUTE privilege */
  15873.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15874.             ) = 1    /* final magic...compare Grants      */
  15875.         )
  15876.     and (
  15877.         o2.uid = user_id()     /* User created the object */
  15878.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15879.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15880.             from sysprotects p
  15881.             where p.id = o2.id
  15882.             /* get rows for public,current user,user's group */
  15883.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15884.             /* check for SELECT,EXECUTE privilege */
  15885.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15886.             ) = 1    /* final magic...compare Grants      */
  15887.         )
  15888.     )    
  15889.     union all
  15890.     select
  15891.         db_name(r.rkeydbid),
  15892.         user_name(o1.uid),
  15893.         o1.name,
  15894.         c1.name,
  15895.         convert(binary(16),null),
  15896.         convert(int,null),
  15897.         db_name(r.fkeydbid),
  15898.         user_name(o2.uid),
  15899.         o2.name,
  15900.         c2.name,
  15901.         convert(binary(16),null),
  15902.         convert(int,null),
  15903.         convert(int,2),
  15904.         'NO ACTION',
  15905.         'NO ACTION',
  15906.         i.name,
  15907.         object_name(r.constid),
  15908.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15909.     from
  15910.         sysobjects o1, sysobjects o2,
  15911.         syscolumns c1, syscolumns c2,
  15912.         sysreferences r, sysindexes i, sysusers u
  15913.     where    
  15914.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15915.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15916.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15917.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15918.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15919.     and    o1.id = r.rkeyid
  15920.     and    r.keycnt >= 2
  15921.     and    o1.id = c1.id
  15922.     and    c1.colid = r.rkey2
  15923.     and r.fkeyid = o2.id
  15924.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15925.     and    o2.id = c2.id    
  15926.     and    c2.colid = r.fkey2
  15927.     and i.id = r.rkeyid
  15928.     and i.indid = r.rkeyindid
  15929.     and u.uid = user_id()
  15930.     and ( suser_id() = 1     /* User is the System Administrator */
  15931.     or (
  15932.         o1.uid = user_id()     /* User created the object */
  15933.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15934.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15935.             from sysprotects p
  15936.             where p.id = o1.id
  15937.             /* get rows for public,current user,user's group */
  15938.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15939.             /* check for SELECT,EXECUTE privilege */
  15940.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15941.             ) = 1    /* final magic...compare Grants      */
  15942.         )
  15943.     and (
  15944.         o2.uid = user_id()     /* User created the object */
  15945.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  15946.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  15947.             from sysprotects p
  15948.             where p.id = o2.id
  15949.             /* get rows for public,current user,user's group */
  15950.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  15951.             /* check for SELECT,EXECUTE privilege */
  15952.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  15953.             ) = 1    /* final magic...compare Grants      */
  15954.         )
  15955.     )    
  15956.     union all
  15957.     select
  15958.         db_name(r.rkeydbid),
  15959.         user_name(o1.uid),
  15960.         o1.name,
  15961.         c1.name,
  15962.         convert(binary(16),null),
  15963.         convert(int,null),
  15964.         db_name(r.fkeydbid),
  15965.         user_name(o2.uid),
  15966.         o2.name,
  15967.         c2.name,
  15968.         convert(binary(16),null),
  15969.         convert(int,null),
  15970.         convert(int,3),
  15971.         'NO ACTION',
  15972.         'NO ACTION',
  15973.         i.name,
  15974.         object_name(r.constid),
  15975.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  15976.     from
  15977.         sysobjects o1, sysobjects o2,
  15978.         syscolumns c1, syscolumns c2,
  15979.         sysreferences r, sysindexes i, sysusers u
  15980.     where    
  15981.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  15982.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  15983.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  15984.     and (@pk_table_name is null or @pk_table_name = o1.name)
  15985.     and (@fk_table_name is null or @fk_table_name = o2.name)
  15986.     and    o1.id = r.rkeyid
  15987.     and    r.keycnt >= 3
  15988.     and    o1.id = c1.id
  15989.     and    c1.colid = r.rkey3
  15990.     and r.fkeyid = o2.id
  15991.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  15992.     and    o2.id = c2.id    
  15993.     and    c2.colid = r.fkey3
  15994.     and i.id = r.rkeyid
  15995.     and i.indid = r.rkeyindid
  15996.     and u.uid = user_id()
  15997.     and ( suser_id() = 1     /* User is the System Administrator */
  15998.     or (
  15999.         o1.uid = user_id()     /* User created the object */
  16000.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16001.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16002.             from sysprotects p
  16003.             where p.id = o1.id
  16004.             /* get rows for public,current user,user's group */
  16005.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16006.             /* check for SELECT,EXECUTE privilege */
  16007.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16008.             ) = 1    /* final magic...compare Grants      */
  16009.         )
  16010.     and (
  16011.         o2.uid = user_id()     /* User created the object */
  16012.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16013.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16014.             from sysprotects p
  16015.             where p.id = o2.id
  16016.             /* get rows for public,current user,user's group */
  16017.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16018.             /* check for SELECT,EXECUTE privilege */
  16019.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16020.             ) = 1    /* final magic...compare Grants      */
  16021.         )
  16022.     )    
  16023.     union all
  16024.     select
  16025.         db_name(r.rkeydbid),
  16026.         user_name(o1.uid),
  16027.         o1.name,
  16028.         c1.name,
  16029.         convert(binary(16),null),
  16030.         convert(int,null),
  16031.         db_name(r.fkeydbid),
  16032.         user_name(o2.uid),
  16033.         o2.name,
  16034.         c2.name,
  16035.         convert(binary(16),null),
  16036.         convert(int,null),
  16037.         convert(int,4),
  16038.         'NO ACTION',
  16039.         'NO ACTION',
  16040.         i.name,
  16041.         object_name(r.constid),
  16042.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16043.     from
  16044.         sysobjects o1, sysobjects o2,
  16045.         syscolumns c1, syscolumns c2,
  16046.         sysreferences r, sysindexes i, sysusers u
  16047.     where    
  16048.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16049.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16050.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16051.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16052.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16053.     and    o1.id = r.rkeyid
  16054.     and    r.keycnt >= 4
  16055.     and    o1.id = c1.id
  16056.     and    c1.colid = r.rkey4
  16057.     and r.fkeyid = o2.id
  16058.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16059.     and    o2.id = c2.id    
  16060.     and    c2.colid = r.fkey4
  16061.     and i.id = r.rkeyid
  16062.     and i.indid = r.rkeyindid
  16063.     and u.uid = user_id()
  16064.     and ( suser_id() = 1     /* User is the System Administrator */
  16065.     or (
  16066.         o1.uid = user_id()     /* User created the object */
  16067.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16068.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16069.             from sysprotects p
  16070.             where p.id = o1.id
  16071.             /* get rows for public,current user,user's group */
  16072.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16073.             /* check for SELECT,EXECUTE privilege */
  16074.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16075.             ) = 1    /* final magic...compare Grants      */
  16076.         )
  16077.     and (
  16078.         o2.uid = user_id()     /* User created the object */
  16079.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16080.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16081.             from sysprotects p
  16082.             where p.id = o2.id
  16083.             /* get rows for public,current user,user's group */
  16084.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16085.             /* check for SELECT,EXECUTE privilege */
  16086.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16087.             ) = 1    /* final magic...compare Grants      */
  16088.         )
  16089.     )    
  16090.     union all
  16091.     select
  16092.         db_name(r.rkeydbid),
  16093.         user_name(o1.uid),
  16094.         o1.name,
  16095.         c1.name,
  16096.         convert(binary(16),null),
  16097.         convert(int,null),
  16098.         db_name(r.fkeydbid),
  16099.         user_name(o2.uid),
  16100.         o2.name,
  16101.         c2.name,
  16102.         convert(binary(16),null),
  16103.         convert(int,null),
  16104.         convert(int,5),
  16105.         'NO ACTION',
  16106.         'NO ACTION',
  16107.         i.name,
  16108.         object_name(r.constid),
  16109.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16110.     from
  16111.         sysobjects o1, sysobjects o2,
  16112.         syscolumns c1, syscolumns c2,
  16113.         sysreferences r, sysindexes i, sysusers u
  16114.     where    
  16115.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16116.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16117.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16118.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16119.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16120.     and    o1.id = r.rkeyid
  16121.     and    r.keycnt >= 5
  16122.     and    o1.id = c1.id
  16123.     and    c1.colid = r.rkey5
  16124.     and r.fkeyid = o2.id
  16125.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16126.     and    o2.id = c2.id    
  16127.     and    c2.colid = r.fkey5
  16128.     and i.id = r.rkeyid
  16129.     and i.indid = r.rkeyindid
  16130.     and u.uid = user_id()
  16131.     and ( suser_id() = 1     /* User is the System Administrator */
  16132.     or (
  16133.         o1.uid = user_id()     /* User created the object */
  16134.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16135.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16136.             from sysprotects p
  16137.             where p.id = o1.id
  16138.             /* get rows for public,current user,user's group */
  16139.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16140.             /* check for SELECT,EXECUTE privilege */
  16141.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16142.             ) = 1    /* final magic...compare Grants      */
  16143.         )
  16144.     and (
  16145.         o2.uid = user_id()     /* User created the object */
  16146.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16147.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16148.             from sysprotects p
  16149.             where p.id = o2.id
  16150.             /* get rows for public,current user,user's group */
  16151.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16152.             /* check for SELECT,EXECUTE privilege */
  16153.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16154.             ) = 1    /* final magic...compare Grants      */
  16155.         )
  16156.     )    
  16157.     union all
  16158.     select
  16159.         db_name(r.rkeydbid),
  16160.         user_name(o1.uid),
  16161.         o1.name,
  16162.         c1.name,
  16163.         convert(binary(16),null),
  16164.         convert(int,null),
  16165.         db_name(r.fkeydbid),
  16166.         user_name(o2.uid),
  16167.         o2.name,
  16168.         c2.name,
  16169.         convert(binary(16),null),
  16170.         convert(int,null),
  16171.         convert(int,6),
  16172.         'NO ACTION',
  16173.         'NO ACTION',
  16174.         i.name,
  16175.         object_name(r.constid),
  16176.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16177.     from
  16178.         sysobjects o1, sysobjects o2,
  16179.         syscolumns c1, syscolumns c2,
  16180.         sysreferences r, sysindexes i, sysusers u
  16181.     where    
  16182.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16183.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16184.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16185.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16186.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16187.     and    o1.id = r.rkeyid
  16188.     and    r.keycnt >= 6
  16189.     and    o1.id = c1.id
  16190.     and    c1.colid = r.rkey6
  16191.     and r.fkeyid = o2.id
  16192.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16193.     and    o2.id = c2.id    
  16194.     and    c2.colid = r.fkey6
  16195.     and i.id = r.rkeyid
  16196.     and i.indid = r.rkeyindid
  16197.     and u.uid = user_id()
  16198.     and ( suser_id() = 1     /* User is the System Administrator */
  16199.     or (
  16200.         o1.uid = user_id()     /* User created the object */
  16201.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16202.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16203.             from sysprotects p
  16204.             where p.id = o1.id
  16205.             /* get rows for public,current user,user's group */
  16206.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16207.             /* check for SELECT,EXECUTE privilege */
  16208.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16209.             ) = 1    /* final magic...compare Grants      */
  16210.         )
  16211.     and (
  16212.         o2.uid = user_id()     /* User created the object */
  16213.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16214.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16215.             from sysprotects p
  16216.             where p.id = o2.id
  16217.             /* get rows for public,current user,user's group */
  16218.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16219.             /* check for SELECT,EXECUTE privilege */
  16220.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16221.             ) = 1    /* final magic...compare Grants      */
  16222.         )
  16223.     )    
  16224.     union all
  16225.     select
  16226.         db_name(r.rkeydbid),
  16227.         user_name(o1.uid),
  16228.         o1.name,
  16229.         c1.name,
  16230.         convert(binary(16),null),
  16231.         convert(int,null),
  16232.         db_name(r.fkeydbid),
  16233.         user_name(o2.uid),
  16234.         o2.name,
  16235.         c2.name,
  16236.         convert(binary(16),null),
  16237.         convert(int,null),
  16238.         convert(int,7),
  16239.         'NO ACTION',
  16240.         'NO ACTION',
  16241.         i.name,
  16242.         object_name(r.constid),
  16243.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16244.     from
  16245.         sysobjects o1, sysobjects o2,
  16246.         syscolumns c1, syscolumns c2,
  16247.         sysreferences r, sysindexes i, sysusers u
  16248.     where    
  16249.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16250.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16251.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16252.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16253.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16254.     and    o1.id = r.rkeyid
  16255.     and    r.keycnt >= 7
  16256.     and    o1.id = c1.id
  16257.     and    c1.colid = r.rkey7
  16258.     and r.fkeyid = o2.id
  16259.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16260.     and    o2.id = c2.id    
  16261.     and    c2.colid = r.fkey7
  16262.     and i.id = r.rkeyid
  16263.     and i.indid = r.rkeyindid
  16264.     and u.uid = user_id()
  16265.     and ( suser_id() = 1     /* User is the System Administrator */
  16266.     or (
  16267.         o1.uid = user_id()     /* User created the object */
  16268.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16269.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16270.             from sysprotects p
  16271.             where p.id = o1.id
  16272.             /* get rows for public,current user,user's group */
  16273.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16274.             /* check for SELECT,EXECUTE privilege */
  16275.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16276.             ) = 1    /* final magic...compare Grants      */
  16277.         )
  16278.     and (
  16279.         o2.uid = user_id()     /* User created the object */
  16280.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16281.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16282.             from sysprotects p
  16283.             where p.id = o2.id
  16284.             /* get rows for public,current user,user's group */
  16285.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16286.             /* check for SELECT,EXECUTE privilege */
  16287.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16288.             ) = 1    /* final magic...compare Grants      */
  16289.         )
  16290.     )    
  16291.     union all
  16292.     select
  16293.         db_name(r.rkeydbid),
  16294.         user_name(o1.uid),
  16295.         o1.name,
  16296.         c1.name,
  16297.         convert(binary(16),null),
  16298.         convert(int,null),
  16299.         db_name(r.fkeydbid),
  16300.         user_name(o2.uid),
  16301.         o2.name,
  16302.         c2.name,
  16303.         convert(binary(16),null),
  16304.         convert(int,null),
  16305.         convert(int,8),
  16306.         'NO ACTION',
  16307.         'NO ACTION',
  16308.         i.name,
  16309.         object_name(r.constid),
  16310.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16311.     from
  16312.         sysobjects o1, sysobjects o2,
  16313.         syscolumns c1, syscolumns c2,
  16314.         sysreferences r, sysindexes i, sysusers u
  16315.     where    
  16316.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16317.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16318.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16319.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16320.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16321.     and    o1.id = r.rkeyid
  16322.     and    r.keycnt >= 8
  16323.     and    o1.id = c1.id
  16324.     and    c1.colid = r.rkey8
  16325.     and r.fkeyid = o2.id
  16326.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16327.     and    o2.id = c2.id    
  16328.     and    c2.colid = r.fkey8
  16329.     and i.id = r.rkeyid
  16330.     and i.indid = r.rkeyindid
  16331.     and u.uid = user_id()
  16332.     and ( suser_id() = 1     /* User is the System Administrator */
  16333.     or (
  16334.         o1.uid = user_id()     /* User created the object */
  16335.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16336.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16337.             from sysprotects p
  16338.             where p.id = o1.id
  16339.             /* get rows for public,current user,user's group */
  16340.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16341.             /* check for SELECT,EXECUTE privilege */
  16342.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16343.             ) = 1    /* final magic...compare Grants      */
  16344.         )
  16345.     and (
  16346.         o2.uid = user_id()     /* User created the object */
  16347.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16348.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16349.             from sysprotects p
  16350.             where p.id = o2.id
  16351.             /* get rows for public,current user,user's group */
  16352.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16353.             /* check for SELECT,EXECUTE privilege */
  16354.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16355.             ) = 1    /* final magic...compare Grants      */
  16356.         )
  16357.     )    
  16358.     union all
  16359.     select
  16360.         db_name(r.rkeydbid),
  16361.         user_name(o1.uid),
  16362.         o1.name,
  16363.         c1.name,
  16364.         convert(binary(16),null),
  16365.         convert(int,null),
  16366.         db_name(r.fkeydbid),
  16367.         user_name(o2.uid),
  16368.         o2.name,
  16369.         c2.name,
  16370.         convert(binary(16),null),
  16371.         convert(int,null),
  16372.         convert(int,9),
  16373.         'NO ACTION',
  16374.         'NO ACTION',
  16375.         i.name,
  16376.         object_name(r.constid),
  16377.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16378.     from
  16379.         sysobjects o1, sysobjects o2,
  16380.         syscolumns c1, syscolumns c2,
  16381.         sysreferences r, sysindexes i, sysusers u
  16382.     where    
  16383.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16384.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16385.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16386.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16387.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16388.     and    o1.id = r.rkeyid
  16389.     and    r.keycnt >= 9
  16390.     and    o1.id = c1.id
  16391.     and    c1.colid = r.rkey9
  16392.     and r.fkeyid = o2.id
  16393.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16394.     and    o2.id = c2.id    
  16395.     and    c2.colid = r.fkey9
  16396.     and i.id = r.rkeyid
  16397.     and i.indid = r.rkeyindid
  16398.     and u.uid = user_id()
  16399.     and ( suser_id() = 1     /* User is the System Administrator */
  16400.     or (
  16401.         o1.uid = user_id()     /* User created the object */
  16402.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16403.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16404.             from sysprotects p
  16405.             where p.id = o1.id
  16406.             /* get rows for public,current user,user's group */
  16407.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16408.             /* check for SELECT,EXECUTE privilege */
  16409.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16410.             ) = 1    /* final magic...compare Grants      */
  16411.         )
  16412.     and (
  16413.         o2.uid = user_id()     /* User created the object */
  16414.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16415.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16416.             from sysprotects p
  16417.             where p.id = o2.id
  16418.             /* get rows for public,current user,user's group */
  16419.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16420.             /* check for SELECT,EXECUTE privilege */
  16421.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16422.             ) = 1    /* final magic...compare Grants      */
  16423.         )
  16424.     )    
  16425.     union all
  16426.     select
  16427.         db_name(r.rkeydbid),
  16428.         user_name(o1.uid),
  16429.         o1.name,
  16430.         c1.name,
  16431.         convert(binary(16),null),
  16432.         convert(int,null),
  16433.         db_name(r.fkeydbid),
  16434.         user_name(o2.uid),
  16435.         o2.name,
  16436.         c2.name,
  16437.         convert(binary(16),null),
  16438.         convert(int,null),
  16439.         convert(int,10),
  16440.         'NO ACTION',
  16441.         'NO ACTION',
  16442.         i.name,
  16443.         object_name(r.constid),
  16444.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16445.     from
  16446.         sysobjects o1, sysobjects o2,
  16447.         syscolumns c1, syscolumns c2,
  16448.         sysreferences r, sysindexes i, sysusers u
  16449.     where    
  16450.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16451.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16452.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16453.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16454.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16455.     and    o1.id = r.rkeyid
  16456.     and    r.keycnt >= 10
  16457.     and    o1.id = c1.id
  16458.     and    c1.colid = r.rkey10
  16459.     and r.fkeyid = o2.id
  16460.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16461.     and    o2.id = c2.id    
  16462.     and    c2.colid = r.fkey10
  16463.     and i.id = r.rkeyid
  16464.     and i.indid = r.rkeyindid
  16465.     and u.uid = user_id()
  16466.     and ( suser_id() = 1     /* User is the System Administrator */
  16467.     or (
  16468.         o1.uid = user_id()     /* User created the object */
  16469.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16470.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16471.             from sysprotects p
  16472.             where p.id = o1.id
  16473.             /* get rows for public,current user,user's group */
  16474.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16475.             /* check for SELECT,EXECUTE privilege */
  16476.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16477.             ) = 1    /* final magic...compare Grants      */
  16478.         )
  16479.     and (
  16480.         o2.uid = user_id()     /* User created the object */
  16481.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16482.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16483.             from sysprotects p
  16484.             where p.id = o2.id
  16485.             /* get rows for public,current user,user's group */
  16486.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16487.             /* check for SELECT,EXECUTE privilege */
  16488.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16489.             ) = 1    /* final magic...compare Grants      */
  16490.         )
  16491.     )    
  16492.     union all
  16493.     select
  16494.         db_name(r.rkeydbid),
  16495.         user_name(o1.uid),
  16496.         o1.name,
  16497.         c1.name,
  16498.         convert(binary(16),null),
  16499.         convert(int,null),
  16500.         db_name(r.fkeydbid),
  16501.         user_name(o2.uid),
  16502.         o2.name,
  16503.         c2.name,
  16504.         convert(binary(16),null),
  16505.         convert(int,null),
  16506.         convert(int,11),
  16507.         'NO ACTION',
  16508.         'NO ACTION',
  16509.         i.name,
  16510.         object_name(r.constid),
  16511.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16512.     from
  16513.         sysobjects o1, sysobjects o2,
  16514.         syscolumns c1, syscolumns c2,
  16515.         sysreferences r, sysindexes i, sysusers u
  16516.     where    
  16517.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16518.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16519.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16520.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16521.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16522.     and    o1.id = r.rkeyid
  16523.     and    r.keycnt >= 11
  16524.     and    o1.id = c1.id
  16525.     and    c1.colid = r.rkey11
  16526.     and r.fkeyid = o2.id
  16527.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16528.     and    o2.id = c2.id    
  16529.     and    c2.colid = r.fkey11
  16530.     and i.id = r.rkeyid
  16531.     and i.indid = r.rkeyindid
  16532.     and u.uid = user_id()
  16533.     and ( suser_id() = 1     /* User is the System Administrator */
  16534.     or (
  16535.         o1.uid = user_id()     /* User created the object */
  16536.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16537.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16538.             from sysprotects p
  16539.             where p.id = o1.id
  16540.             /* get rows for public,current user,user's group */
  16541.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16542.             /* check for SELECT,EXECUTE privilege */
  16543.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16544.             ) = 1    /* final magic...compare Grants      */
  16545.         )
  16546.     and (
  16547.         o2.uid = user_id()     /* User created the object */
  16548.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16549.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16550.             from sysprotects p
  16551.             where p.id = o2.id
  16552.             /* get rows for public,current user,user's group */
  16553.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16554.             /* check for SELECT,EXECUTE privilege */
  16555.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16556.             ) = 1    /* final magic...compare Grants      */
  16557.         )
  16558.     )    
  16559.     union all
  16560.     select
  16561.         db_name(r.rkeydbid),
  16562.         user_name(o1.uid),
  16563.         o1.name,
  16564.         c1.name,
  16565.         convert(binary(16),null),
  16566.         convert(int,null),
  16567.         db_name(r.fkeydbid),
  16568.         user_name(o2.uid),
  16569.         o2.name,
  16570.         c2.name,
  16571.         convert(binary(16),null),
  16572.         convert(int,null),
  16573.         convert(int,12),
  16574.         'NO ACTION',
  16575.         'NO ACTION',
  16576.         i.name,
  16577.         object_name(r.constid),
  16578.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16579.     from
  16580.         sysobjects o1, sysobjects o2,
  16581.         syscolumns c1, syscolumns c2,
  16582.         sysreferences r, sysindexes i, sysusers u
  16583.     where    
  16584.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16585.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16586.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16587.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16588.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16589.     and    o1.id = r.rkeyid
  16590.     and    r.keycnt >= 12
  16591.     and    o1.id = c1.id
  16592.     and    c1.colid = r.rkey12
  16593.     and r.fkeyid = o2.id
  16594.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16595.     and    o2.id = c2.id    
  16596.     and    c2.colid = r.fkey12
  16597.     and i.id = r.rkeyid
  16598.     and i.indid = r.rkeyindid
  16599.     and u.uid = user_id()
  16600.     and ( suser_id() = 1     /* User is the System Administrator */
  16601.     or (
  16602.         o1.uid = user_id()     /* User created the object */
  16603.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16604.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16605.             from sysprotects p
  16606.             where p.id = o1.id
  16607.             /* get rows for public,current user,user's group */
  16608.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16609.             /* check for SELECT,EXECUTE privilege */
  16610.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16611.             ) = 1    /* final magic...compare Grants      */
  16612.         )
  16613.     and (
  16614.         o2.uid = user_id()     /* User created the object */
  16615.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16616.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16617.             from sysprotects p
  16618.             where p.id = o2.id
  16619.             /* get rows for public,current user,user's group */
  16620.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16621.             /* check for SELECT,EXECUTE privilege */
  16622.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16623.             ) = 1    /* final magic...compare Grants      */
  16624.         )
  16625.     )    
  16626.     union all
  16627.     select
  16628.         db_name(r.rkeydbid),
  16629.         user_name(o1.uid),
  16630.         o1.name,
  16631.         c1.name,
  16632.         convert(binary(16),null),
  16633.         convert(int,null),
  16634.         db_name(r.fkeydbid),
  16635.         user_name(o2.uid),
  16636.         o2.name,
  16637.         c2.name,
  16638.         convert(binary(16),null),
  16639.         convert(int,null),
  16640.         convert(int,13),
  16641.         'NO ACTION',
  16642.         'NO ACTION',
  16643.         i.name,
  16644.         object_name(r.constid),
  16645.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16646.     from
  16647.         sysobjects o1, sysobjects o2,
  16648.         syscolumns c1, syscolumns c2,
  16649.         sysreferences r, sysindexes i, sysusers u
  16650.     where    
  16651.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16652.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16653.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16654.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16655.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16656.     and    o1.id = r.rkeyid
  16657.     and    r.keycnt >= 13
  16658.     and    o1.id = c1.id
  16659.     and    c1.colid = r.rkey13
  16660.     and r.fkeyid = o2.id
  16661.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16662.     and    o2.id = c2.id    
  16663.     and    c2.colid = r.fkey13
  16664.     and i.id = r.rkeyid
  16665.     and i.indid = r.rkeyindid
  16666.     and u.uid = user_id()
  16667.     and ( suser_id() = 1     /* User is the System Administrator */
  16668.     or (
  16669.         o1.uid = user_id()     /* User created the object */
  16670.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16671.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16672.             from sysprotects p
  16673.             where p.id = o1.id
  16674.             /* get rows for public,current user,user's group */
  16675.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16676.             /* check for SELECT,EXECUTE privilege */
  16677.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16678.             ) = 1    /* final magic...compare Grants      */
  16679.         )
  16680.     and (
  16681.         o2.uid = user_id()     /* User created the object */
  16682.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16683.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16684.             from sysprotects p
  16685.             where p.id = o2.id
  16686.             /* get rows for public,current user,user's group */
  16687.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16688.             /* check for SELECT,EXECUTE privilege */
  16689.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16690.             ) = 1    /* final magic...compare Grants      */
  16691.         )
  16692.     )    
  16693.     union all
  16694.     select
  16695.         db_name(r.rkeydbid),
  16696.         user_name(o1.uid),
  16697.         o1.name,
  16698.         c1.name,
  16699.         convert(binary(16),null),
  16700.         convert(int,null),
  16701.         db_name(r.fkeydbid),
  16702.         user_name(o2.uid),
  16703.         o2.name,
  16704.         c2.name,
  16705.         convert(binary(16),null),
  16706.         convert(int,null),
  16707.         convert(int,14),
  16708.         'NO ACTION',
  16709.         'NO ACTION',
  16710.         i.name,
  16711.         object_name(r.constid),
  16712.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16713.     from
  16714.         sysobjects o1, sysobjects o2,
  16715.         syscolumns c1, syscolumns c2,
  16716.         sysreferences r, sysindexes i, sysusers u
  16717.     where    
  16718.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16719.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16720.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16721.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16722.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16723.     and    o1.id = r.rkeyid
  16724.     and    r.keycnt >= 14
  16725.     and    o1.id = c1.id
  16726.     and    c1.colid = r.rkey14
  16727.     and r.fkeyid = o2.id
  16728.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16729.     and    o2.id = c2.id    
  16730.     and    c2.colid = r.fkey14
  16731.     and i.id = r.rkeyid
  16732.     and i.indid = r.rkeyindid
  16733.     and u.uid = user_id()
  16734.     and ( suser_id() = 1     /* User is the System Administrator */
  16735.     or (
  16736.         o1.uid = user_id()     /* User created the object */
  16737.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16738.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16739.             from sysprotects p
  16740.             where p.id = o1.id
  16741.             /* get rows for public,current user,user's group */
  16742.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16743.             /* check for SELECT,EXECUTE privilege */
  16744.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16745.             ) = 1    /* final magic...compare Grants      */
  16746.         )
  16747.     and (
  16748.         o2.uid = user_id()     /* User created the object */
  16749.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16750.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16751.             from sysprotects p
  16752.             where p.id = o2.id
  16753.             /* get rows for public,current user,user's group */
  16754.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16755.             /* check for SELECT,EXECUTE privilege */
  16756.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16757.             ) = 1    /* final magic...compare Grants      */
  16758.         )
  16759.     )    
  16760.     union all
  16761.     select
  16762.         db_name(r.rkeydbid),
  16763.         user_name(o1.uid),
  16764.         o1.name,
  16765.         c1.name,
  16766.         convert(binary(16),null),
  16767.         convert(int,null),
  16768.         db_name(r.fkeydbid),
  16769.         user_name(o2.uid),
  16770.         o2.name,
  16771.         c2.name,
  16772.         convert(binary(16),null),
  16773.         convert(int,null),
  16774.         convert(int,15),
  16775.         'NO ACTION',
  16776.         'NO ACTION',
  16777.         i.name,
  16778.         object_name(r.constid),
  16779.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16780.     from
  16781.         sysobjects o1, sysobjects o2,
  16782.         syscolumns c1, syscolumns c2,
  16783.         sysreferences r, sysindexes i, sysusers u
  16784.     where    
  16785.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16786.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16787.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16788.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16789.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16790.     and    o1.id = r.rkeyid
  16791.     and    r.keycnt >= 15
  16792.     and    o1.id = c1.id
  16793.     and    c1.colid = r.rkey15
  16794.     and r.fkeyid = o2.id
  16795.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16796.     and    o2.id = c2.id    
  16797.     and    c2.colid = r.fkey15
  16798.     and i.id = r.rkeyid
  16799.     and i.indid = r.rkeyindid
  16800.     and u.uid = user_id()
  16801.     and ( suser_id() = 1     /* User is the System Administrator */
  16802.     or (
  16803.         o1.uid = user_id()     /* User created the object */
  16804.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16805.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16806.             from sysprotects p
  16807.             where p.id = o1.id
  16808.             /* get rows for public,current user,user's group */
  16809.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16810.             /* check for SELECT,EXECUTE privilege */
  16811.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16812.             ) = 1    /* final magic...compare Grants      */
  16813.         )
  16814.     and (
  16815.         o2.uid = user_id()     /* User created the object */
  16816.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16817.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16818.             from sysprotects p
  16819.             where p.id = o2.id
  16820.             /* get rows for public,current user,user's group */
  16821.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16822.             /* check for SELECT,EXECUTE privilege */
  16823.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16824.             ) = 1    /* final magic...compare Grants      */
  16825.         )
  16826.     )    
  16827.     union all
  16828.     select
  16829.         db_name(r.rkeydbid),
  16830.         user_name(o1.uid),
  16831.         o1.name,
  16832.         c1.name,
  16833.         convert(binary(16),null),
  16834.         convert(int,null),
  16835.         db_name(r.fkeydbid),
  16836.         user_name(o2.uid),
  16837.         o2.name,
  16838.         c2.name,
  16839.         convert(binary(16),null),
  16840.         convert(int,null),
  16841.         convert(int,16),
  16842.         'NO ACTION',
  16843.         'NO ACTION',
  16844.         i.name,
  16845.         object_name(r.constid),
  16846.         convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16847.     from
  16848.         sysobjects o1, sysobjects o2,
  16849.         syscolumns c1, syscolumns c2,
  16850.         sysreferences r, sysindexes i, sysusers u
  16851.     where    
  16852.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  16853.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16854.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16855.     and (@pk_table_name is null or @pk_table_name = o1.name)
  16856.     and (@fk_table_name is null or @fk_table_name = o2.name)
  16857.     and    o1.id = r.rkeyid
  16858.     and    o1.id = c1.id
  16859.     and    r.keycnt >= 16
  16860.     and    c1.colid = r.rkey16
  16861.     and r.fkeyid = o2.id
  16862.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16863.     and    o2.id = c2.id    
  16864.     and    c2.colid = r.fkey16
  16865.     and i.id = r.rkeyid
  16866.     and i.indid = r.rkeyindid
  16867.     and u.uid = user_id()
  16868.     and ( suser_id() = 1     /* User is the System Administrator */
  16869.     or (
  16870.         o1.uid = user_id()     /* User created the object */
  16871.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16872.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16873.             from sysprotects p
  16874.             where p.id = o1.id
  16875.             /* get rows for public,current user,user's group */
  16876.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16877.             /* check for SELECT,EXECUTE privilege */
  16878.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16879.             ) = 1    /* final magic...compare Grants      */
  16880.         )
  16881.     and (
  16882.         o2.uid = user_id()     /* User created the object */
  16883.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  16884.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  16885.             from sysprotects p
  16886.             where p.id = o2.id
  16887.             /* get rows for public,current user,user's group */
  16888.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  16889.             /* check for SELECT,EXECUTE privilege */
  16890.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  16891.             ) = 1    /* final magic...compare Grants      */
  16892.         )
  16893.     )
  16894.     order by 8,9,2,3,13
  16895.     END
  16896.  
  16897.     exec @ret = sp_cursoropen @handle output, 'select * from #spfkeysrowset1',
  16898.         @scrollopt output, @ccopt output, @rows output
  16899.  
  16900.     drop table #spfkeysrowset1
  16901.        return isnull(@ret,0)
  16902. go
  16903. dump tran master with no_log
  16904. go
  16905. CREATE PROCEDURE sp_foreign_keys_rowset;3
  16906. as
  16907.     select
  16908.         PK_TABLE_CATALOG    = convert(sysname,' '),
  16909.         PK_TABLE_SCHEMA        = convert(sysname,' '),
  16910.         PK_TABLE_NAME         = convert(sysname,' '),
  16911.         PK_COLUMN_NAME         = convert(sysname,' '),
  16912.         PK_COLUMN_GUID        = convert(binary(16),null),
  16913.         PK_COLUMN_PROPID    = convert(int,null),
  16914.         FK_TABLE_CATALOG    = convert(sysname,' '),
  16915.         FK_TABLE_SCHEMA        = convert(sysname,' '),
  16916.         FK_TABLE_NAME         = convert(sysname,' '),
  16917.         FK_COLUMN_NAME         = convert(sysname,' '),
  16918.         FK_COLUMN_GUID        = convert(binary(16),null),
  16919.         FK_COLUMN_PROPID    = convert(int,null),
  16920.         ORDINAL                = convert(int,1),
  16921.         UPDATE_RULE            = 'NO ACTION',
  16922.         DELETE_RULE         = 'NO ACTION',
  16923.         PK_NAME                = convert(sysname, ' '),
  16924.         FK_NAME                = convert(sysname, ' '),
  16925.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16926.     where    1=0
  16927. go
  16928. dump tran master with no_log
  16929. go
  16930.  
  16931.  
  16932. if (charindex('7.00', @@version) = 0 and
  16933.     charindex('8.00', @@version) = 0)
  16934. begin
  16935.     print ''
  16936.     print ''
  16937.     print 'Warning:'
  16938.     print 'you are installing the stored procedures '
  16939.     print 'on a pre 8.0 SQL Server.'
  16940.     print 'Ignore the following errors.'
  16941. end
  16942. else
  16943.     drop proc sp_foreign_keys_rowset
  16944. go
  16945.  
  16946.  
  16947. /*    Procedure for 8.0 server */
  16948. CREATE PROCEDURE sp_foreign_keys_rowset
  16949.     (
  16950.     @pk_table_name        sysname,
  16951.     @pk_table_schema    sysname = null,
  16952.     @fk_table_name        sysname = null,
  16953.     @fk_table_schema    sysname = null,
  16954.     @fk_table_catalog    sysname = null
  16955.     )
  16956. as
  16957.     select
  16958.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16959.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  16960.         PK_TABLE_NAME         = o1.name,
  16961.         PK_COLUMN_NAME         = c1.name,
  16962.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16963.         PK_COLUMN_PROPID    = convert(int,null),
  16964.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  16965.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  16966.         FK_TABLE_NAME         = o2.name,
  16967.         FK_COLUMN_NAME         = c2.name,
  16968.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  16969.         FK_COLUMN_PROPID    = convert(int,null),
  16970.         ORDINAL                = convert(int,1),
  16971.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  16972.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  16973.         PK_NAME                = i.name,
  16974.         FK_NAME                = object_name(r.constid),
  16975.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  16976.     from
  16977.         sysobjects o1, sysobjects o2,
  16978.         syscolumns c1, syscolumns c2,
  16979.         sysreferences r, sysindexes i
  16980.     where    
  16981.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  16982.     and    o1.name = @pk_table_name
  16983.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  16984.     and    o1.id = r.rkeyid
  16985.     and    o1.id = c1.id
  16986.     and    c1.colid = r.rkey1
  16987.     and r.fkeyid = o2.id
  16988.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  16989.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  16990.     and    o2.id = c2.id    
  16991.     and    c2.colid = r.fkey1
  16992.     and permissions(o1.id) <> 0
  16993.     and permissions(o2.id) <> 0
  16994.     and i.id = r.rkeyid
  16995.     and i.indid = r.rkeyindid
  16996.     union all
  16997.     select
  16998.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  16999.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17000.         PK_TABLE_NAME         = o1.name,
  17001.         PK_COLUMN_NAME         = c1.name,
  17002.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17003.         PK_COLUMN_PROPID    = convert(int,null),
  17004.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17005.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17006.         FK_TABLE_NAME         = o2.name,
  17007.         FK_COLUMN_NAME         = c2.name,
  17008.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17009.         FK_COLUMN_PROPID    = convert(int,null),
  17010.         ORDINAL                = convert(int,2),
  17011.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17012.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17013.         PK_NAME                = i.name,
  17014.         FK_NAME                = object_name(r.constid),
  17015.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17016.     from
  17017.         sysobjects o1, sysobjects o2,
  17018.         syscolumns c1, syscolumns c2,
  17019.         sysreferences r, sysindexes i
  17020.     where    
  17021.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17022.     and    o1.name = @pk_table_name
  17023.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17024.     and    o1.id = r.rkeyid
  17025.     and    o1.id = c1.id
  17026.     and    c1.colid = r.rkey2
  17027.     and    r.keycnt >= 2
  17028.     and r.fkeyid = o2.id
  17029.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17030.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17031.     and    o2.id = c2.id    
  17032.     and    c2.colid = r.fkey2
  17033.     and permissions(o1.id) <> 0
  17034.     and permissions(o2.id) <> 0
  17035.     and i.id = r.rkeyid
  17036.     and i.indid = r.rkeyindid
  17037.     union all
  17038.     select
  17039.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17040.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17041.         PK_TABLE_NAME         = o1.name,
  17042.         PK_COLUMN_NAME         = c1.name,
  17043.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17044.         PK_COLUMN_PROPID    = convert(int,null),
  17045.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17046.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17047.         FK_TABLE_NAME         = o2.name,
  17048.         FK_COLUMN_NAME         = c2.name,
  17049.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17050.         FK_COLUMN_PROPID    = convert(int,null),
  17051.         ORDINAL                = convert(int,3),
  17052.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17053.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17054.         PK_NAME                = i.name,
  17055.         FK_NAME                = object_name(r.constid),
  17056.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17057.     from
  17058.         sysobjects o1, sysobjects o2,
  17059.         syscolumns c1, syscolumns c2,
  17060.         sysreferences r, sysindexes i
  17061.     where    
  17062.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17063.     and    o1.name = @pk_table_name
  17064.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17065.     and    o1.id = r.rkeyid
  17066.     and    o1.id = c1.id
  17067.     and    c1.colid = r.rkey3
  17068.     and    r.keycnt >= 3
  17069.     and r.fkeyid = o2.id
  17070.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17071.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17072.     and    o2.id = c2.id    
  17073.     and    c2.colid = r.fkey3
  17074.     and permissions(o1.id) <> 0
  17075.     and permissions(o2.id) <> 0    
  17076.     and i.id = r.rkeyid
  17077.     and i.indid = r.rkeyindid
  17078.     union all
  17079.     select
  17080.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17081.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17082.         PK_TABLE_NAME         = o1.name,
  17083.         PK_COLUMN_NAME         = c1.name,
  17084.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17085.         PK_COLUMN_PROPID    = convert(int,null),
  17086.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17087.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17088.         FK_TABLE_NAME         = o2.name,
  17089.         FK_COLUMN_NAME         = c2.name,
  17090.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17091.         FK_COLUMN_PROPID    = convert(int,null),
  17092.         ORDINAL                = convert(int,4),
  17093.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17094.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17095.         PK_NAME                = i.name,
  17096.         FK_NAME                = object_name(r.constid),
  17097.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17098.     from
  17099.         sysobjects o1, sysobjects o2,
  17100.         syscolumns c1, syscolumns c2,
  17101.         sysreferences r, sysindexes i
  17102.     where    
  17103.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17104.     and    o1.name = @pk_table_name
  17105.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17106.     and    o1.id = r.rkeyid
  17107.     and    r.keycnt >= 4
  17108.     and    o1.id = c1.id
  17109.     and    c1.colid = r.rkey4
  17110.     and r.fkeyid = o2.id
  17111.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17112.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17113.     and    o2.id = c2.id    
  17114.     and    c2.colid = r.fkey4
  17115.     and permissions(o1.id) <> 0
  17116.     and permissions(o2.id) <> 0
  17117.     and i.id = r.rkeyid
  17118.     and i.indid = r.rkeyindid    
  17119.     union all
  17120.     select
  17121.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17122.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17123.         PK_TABLE_NAME         = o1.name,
  17124.         PK_COLUMN_NAME         = c1.name,
  17125.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17126.         PK_COLUMN_PROPID    = convert(int,null),
  17127.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17128.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17129.         FK_TABLE_NAME         = o2.name,
  17130.         FK_COLUMN_NAME         = c2.name,
  17131.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17132.         FK_COLUMN_PROPID    = convert(int,null),
  17133.         ORDINAL                = convert(int,5),
  17134.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17135.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17136.         PK_NAME                = i.name,
  17137.         FK_NAME                = object_name(r.constid),
  17138.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17139.     from
  17140.         sysobjects o1, sysobjects o2,
  17141.         syscolumns c1, syscolumns c2,
  17142.         sysreferences r, sysindexes i
  17143.     where    
  17144.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17145.     and    o1.name = @pk_table_name
  17146.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17147.     and    o1.id = r.rkeyid
  17148.     and    r.keycnt >= 5
  17149.     and    o1.id = c1.id
  17150.     and    c1.colid = r.rkey5
  17151.     and r.fkeyid = o2.id
  17152.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17153.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17154.     and    o2.id = c2.id    
  17155.     and    c2.colid = r.fkey5
  17156.     and permissions(o1.id) <> 0
  17157.     and permissions(o2.id) <> 0
  17158.     and i.id = r.rkeyid
  17159.     and i.indid = r.rkeyindid        
  17160.     union all
  17161.     select
  17162.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17163.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17164.         PK_TABLE_NAME         = o1.name,
  17165.         PK_COLUMN_NAME         = c1.name,
  17166.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17167.         PK_COLUMN_PROPID    = convert(int,null),
  17168.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17169.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17170.         FK_TABLE_NAME         = o2.name,
  17171.         FK_COLUMN_NAME         = c2.name,
  17172.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17173.         FK_COLUMN_PROPID    = convert(int,null),
  17174.         ORDINAL                = convert(int,6),
  17175.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17176.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17177.         PK_NAME                = i.name,
  17178.         FK_NAME                = object_name(r.constid),
  17179.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17180.     from
  17181.         sysobjects o1, sysobjects o2,
  17182.         syscolumns c1, syscolumns c2,
  17183.         sysreferences r, sysindexes i
  17184.     where    
  17185.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17186.     and    o1.name = @pk_table_name
  17187.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17188.     and    o1.id = r.rkeyid
  17189.     and    r.keycnt >= 6
  17190.     and    o1.id = c1.id
  17191.     and    c1.colid = r.rkey6
  17192.     and r.fkeyid = o2.id
  17193.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17194.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17195.     and    o2.id = c2.id    
  17196.     and    c2.colid = r.fkey6
  17197.     and permissions(o1.id) <> 0
  17198.     and permissions(o2.id) <> 0
  17199.     and i.id = r.rkeyid
  17200.     and i.indid = r.rkeyindid            
  17201.     union all
  17202.     select
  17203.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17204.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17205.         PK_TABLE_NAME         = o1.name,
  17206.         PK_COLUMN_NAME         = c1.name,
  17207.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17208.         PK_COLUMN_PROPID    = convert(int,null),
  17209.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17210.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17211.         FK_TABLE_NAME         = o2.name,
  17212.         FK_COLUMN_NAME         = c2.name,
  17213.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17214.         FK_COLUMN_PROPID    = convert(int,null),
  17215.         ORDINAL                = convert(int,7),
  17216.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17217.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17218.         PK_NAME                = i.name,
  17219.         FK_NAME                = object_name(r.constid),
  17220.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17221.     from
  17222.         sysobjects o1, sysobjects o2,
  17223.         syscolumns c1, syscolumns c2,
  17224.         sysreferences r, sysindexes i
  17225.     where    
  17226.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17227.     and    o1.name = @pk_table_name
  17228.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17229.     and    o1.id = r.rkeyid
  17230.     and    r.keycnt >= 7
  17231.     and    o1.id = c1.id
  17232.     and    c1.colid = r.rkey7
  17233.     and r.fkeyid = o2.id
  17234.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17235.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17236.     and    o2.id = c2.id    
  17237.     and    c2.colid = r.fkey7
  17238.     and permissions(o1.id) <> 0
  17239.     and permissions(o2.id) <> 0
  17240.     and i.id = r.rkeyid
  17241.     and i.indid = r.rkeyindid            
  17242.     union all
  17243.     select
  17244.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17245.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17246.         PK_TABLE_NAME         = o1.name,
  17247.         PK_COLUMN_NAME         = c1.name,
  17248.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17249.         PK_COLUMN_PROPID    = convert(int,null),
  17250.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17251.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17252.         FK_TABLE_NAME         = o2.name,
  17253.         FK_COLUMN_NAME         = c2.name,
  17254.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17255.         FK_COLUMN_PROPID    = convert(int,null),
  17256.         ORDINAL                = convert(int,8),
  17257.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17258.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17259.         PK_NAME                = i.name,
  17260.         FK_NAME                = object_name(r.constid),
  17261.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17262.     from
  17263.         sysobjects o1, sysobjects o2,
  17264.         syscolumns c1, syscolumns c2,
  17265.         sysreferences r, sysindexes i
  17266.     where    
  17267.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17268.     and    o1.name = @pk_table_name
  17269.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17270.     and    o1.id = r.rkeyid
  17271.     and    r.keycnt >= 8
  17272.     and    o1.id = c1.id
  17273.     and    c1.colid = r.rkey8
  17274.     and r.fkeyid = o2.id
  17275.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17276.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17277.     and    o2.id = c2.id    
  17278.     and    c2.colid = r.fkey8
  17279.     and permissions(o1.id) <> 0
  17280.     and permissions(o2.id) <> 0
  17281.     and i.id = r.rkeyid
  17282.     and i.indid = r.rkeyindid            
  17283.     union all
  17284.     select
  17285.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17286.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17287.         PK_TABLE_NAME         = o1.name,
  17288.         PK_COLUMN_NAME         = c1.name,
  17289.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17290.         PK_COLUMN_PROPID    = convert(int,null),
  17291.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17292.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17293.         FK_TABLE_NAME         = o2.name,
  17294.         FK_COLUMN_NAME         = c2.name,
  17295.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17296.         FK_COLUMN_PROPID    = convert(int,null),
  17297.         ORDINAL                = convert(int,9),
  17298.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17299.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17300.         PK_NAME                = i.name,
  17301.         FK_NAME                = object_name(r.constid),
  17302.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17303.     from
  17304.         sysobjects o1, sysobjects o2,
  17305.         syscolumns c1, syscolumns c2,
  17306.         sysreferences r, sysindexes i
  17307.     where    
  17308.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17309.     and    o1.name = @pk_table_name
  17310.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17311.     and    o1.id = r.rkeyid
  17312.     and    r.keycnt >= 9
  17313.     and    o1.id = c1.id
  17314.     and    c1.colid = r.rkey9
  17315.     and r.fkeyid = o2.id
  17316.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17317.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17318.     and    o2.id = c2.id    
  17319.     and    c2.colid = r.fkey9
  17320.     and permissions(o1.id) <> 0
  17321.     and permissions(o2.id) <> 0
  17322.     and i.id = r.rkeyid
  17323.     and i.indid = r.rkeyindid            
  17324.     union all
  17325.     select
  17326.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17327.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17328.         PK_TABLE_NAME         = o1.name,
  17329.         PK_COLUMN_NAME         = c1.name,
  17330.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17331.         PK_COLUMN_PROPID    = convert(int,null),
  17332.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17333.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17334.         FK_TABLE_NAME         = o2.name,
  17335.         FK_COLUMN_NAME         = c2.name,
  17336.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17337.         FK_COLUMN_PROPID    = convert(int,null),
  17338.         ORDINAL                = convert(int,10),
  17339.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17340.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17341.         PK_NAME                = i.name,
  17342.         FK_NAME                = object_name(r.constid),
  17343.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17344.     from
  17345.         sysobjects o1, sysobjects o2,
  17346.         syscolumns c1, syscolumns c2,
  17347.         sysreferences r, sysindexes i
  17348.     where    
  17349.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17350.     and    o1.name = @pk_table_name
  17351.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17352.     and    o1.id = r.rkeyid
  17353.     and    r.keycnt >= 10
  17354.     and    o1.id = c1.id
  17355.     and    c1.colid = r.rkey10
  17356.     and r.fkeyid = o2.id
  17357.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17358.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17359.     and    o2.id = c2.id    
  17360.     and    c2.colid = r.fkey10
  17361.     and permissions(o1.id) <> 0
  17362.     and permissions(o2.id) <> 0
  17363.     and i.id = r.rkeyid
  17364.     and i.indid = r.rkeyindid            
  17365.     union all
  17366.     select
  17367.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17368.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17369.         PK_TABLE_NAME         = o1.name,
  17370.         PK_COLUMN_NAME         = c1.name,
  17371.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17372.         PK_COLUMN_PROPID    = convert(int,null),
  17373.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17374.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17375.         FK_TABLE_NAME         = o2.name,
  17376.         FK_COLUMN_NAME         = c2.name,
  17377.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17378.         FK_COLUMN_PROPID    = convert(int,null),
  17379.         ORDINAL                = convert(int,11),
  17380.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17381.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17382.         PK_NAME                = i.name,
  17383.         FK_NAME                = object_name(r.constid),
  17384.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17385.     from
  17386.         sysobjects o1, sysobjects o2,
  17387.         syscolumns c1, syscolumns c2,
  17388.         sysreferences r, sysindexes i
  17389.     where    
  17390.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17391.     and    o1.name = @pk_table_name
  17392.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17393.     and    o1.id = r.rkeyid
  17394.     and    r.keycnt >= 11
  17395.     and    o1.id = c1.id
  17396.     and    c1.colid = r.rkey11
  17397.     and r.fkeyid = o2.id
  17398.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17399.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17400.     and    o2.id = c2.id    
  17401.     and    c2.colid = r.fkey11
  17402.     and permissions(o1.id) <> 0
  17403.     and permissions(o2.id) <> 0
  17404.     and i.id = r.rkeyid
  17405.     and i.indid = r.rkeyindid            
  17406.     union all
  17407.     select
  17408.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17409.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17410.         PK_TABLE_NAME         = o1.name,
  17411.         PK_COLUMN_NAME         = c1.name,
  17412.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17413.         PK_COLUMN_PROPID    = convert(int,null),
  17414.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17415.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17416.         FK_TABLE_NAME         = o2.name,
  17417.         FK_COLUMN_NAME         = c2.name,
  17418.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17419.         FK_COLUMN_PROPID    = convert(int,null),
  17420.         ORDINAL                = convert(int,12),
  17421.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17422.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17423.         PK_NAME                = i.name,
  17424.         FK_NAME                = object_name(r.constid),
  17425.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17426.     from
  17427.         sysobjects o1, sysobjects o2,
  17428.         syscolumns c1, syscolumns c2,
  17429.         sysreferences r, sysindexes i
  17430.     where    
  17431.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17432.     and    o1.name = @pk_table_name
  17433.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17434.     and    o1.id = r.rkeyid
  17435.     and    r.keycnt >= 12
  17436.     and    o1.id = c1.id
  17437.     and    c1.colid = r.rkey12
  17438.     and r.fkeyid = o2.id
  17439.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17440.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17441.     and    o2.id = c2.id    
  17442.     and    c2.colid = r.fkey12
  17443.     and permissions(o1.id) <> 0
  17444.     and permissions(o2.id) <> 0
  17445.     and i.id = r.rkeyid
  17446.     and i.indid = r.rkeyindid            
  17447.     union all
  17448.     select
  17449.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17450.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17451.         PK_TABLE_NAME         = o1.name,
  17452.         PK_COLUMN_NAME         = c1.name,
  17453.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17454.         PK_COLUMN_PROPID    = convert(int,null),
  17455.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17456.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17457.         FK_TABLE_NAME         = o2.name,
  17458.         FK_COLUMN_NAME         = c2.name,
  17459.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17460.         FK_COLUMN_PROPID    = convert(int,null),
  17461.         ORDINAL                = convert(int,13),
  17462.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17463.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17464.         PK_NAME                = i.name,
  17465.         FK_NAME                = object_name(r.constid),
  17466.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17467.     from
  17468.         sysobjects o1, sysobjects o2,
  17469.         syscolumns c1, syscolumns c2,
  17470.         sysreferences r, sysindexes i
  17471.     where    
  17472.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17473.     and    o1.name = @pk_table_name
  17474.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17475.     and    o1.id = r.rkeyid
  17476.     and    r.keycnt >= 13
  17477.     and    o1.id = c1.id
  17478.     and    c1.colid = r.rkey13
  17479.     and r.fkeyid = o2.id
  17480.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17481.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17482.     and    o2.id = c2.id    
  17483.     and    c2.colid = r.fkey13
  17484.     and permissions(o1.id) <> 0
  17485.     and permissions(o2.id) <> 0
  17486.     and i.id = r.rkeyid
  17487.     and i.indid = r.rkeyindid            
  17488.     union all
  17489.     select
  17490.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17491.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17492.         PK_TABLE_NAME         = o1.name,
  17493.         PK_COLUMN_NAME         = c1.name,
  17494.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17495.         PK_COLUMN_PROPID    = convert(int,null),
  17496.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17497.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17498.         FK_TABLE_NAME         = o2.name,
  17499.         FK_COLUMN_NAME         = c2.name,
  17500.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17501.         FK_COLUMN_PROPID    = convert(int,null),
  17502.         ORDINAL                = convert(int,14),
  17503.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17504.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17505.         PK_NAME                = i.name,
  17506.         FK_NAME                = object_name(r.constid),
  17507.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17508.     from
  17509.         sysobjects o1, sysobjects o2,
  17510.         syscolumns c1, syscolumns c2,
  17511.         sysreferences r, sysindexes i
  17512.     where    
  17513.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17514.     and    o1.name = @pk_table_name
  17515.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17516.     and    o1.id = r.rkeyid
  17517.     and    r.keycnt >= 14
  17518.     and    o1.id = c1.id
  17519.     and    c1.colid = r.rkey14
  17520.     and r.fkeyid = o2.id
  17521.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17522.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17523.     and    o2.id = c2.id    
  17524.     and    c2.colid = r.fkey14
  17525.     and permissions(o1.id) <> 0
  17526.     and permissions(o2.id) <> 0
  17527.     and i.id = r.rkeyid
  17528.     and i.indid = r.rkeyindid            
  17529.     union all
  17530.     select
  17531.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17532.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17533.         PK_TABLE_NAME         = o1.name,
  17534.         PK_COLUMN_NAME         = c1.name,
  17535.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17536.         PK_COLUMN_PROPID    = convert(int,null),
  17537.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17538.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17539.         FK_TABLE_NAME         = o2.name,
  17540.         FK_COLUMN_NAME         = c2.name,
  17541.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17542.         FK_COLUMN_PROPID    = convert(int,null),
  17543.         ORDINAL                = convert(int,15),
  17544.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17545.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17546.         PK_NAME                = i.name,
  17547.         FK_NAME                = object_name(r.constid),
  17548.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17549.     from
  17550.         sysobjects o1, sysobjects o2,
  17551.         syscolumns c1, syscolumns c2,
  17552.         sysreferences r, sysindexes i
  17553.     where    
  17554.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17555.     and    o1.name = @pk_table_name
  17556.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17557.     and    o1.id = r.rkeyid
  17558.     and    r.keycnt >= 15
  17559.     and    o1.id = c1.id
  17560.     and    c1.colid = r.rkey15
  17561.     and r.fkeyid = o2.id
  17562.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17563.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17564.     and    o2.id = c2.id    
  17565.     and    c2.colid = r.fkey15
  17566.     and permissions(o1.id) <> 0
  17567.     and permissions(o2.id) <> 0
  17568.     and i.id = r.rkeyid
  17569.     and i.indid = r.rkeyindid            
  17570.     union all
  17571.     select
  17572.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17573.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17574.         PK_TABLE_NAME         = o1.name,
  17575.         PK_COLUMN_NAME         = c1.name,
  17576.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17577.         PK_COLUMN_PROPID    = convert(int,null),
  17578.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17579.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17580.         FK_TABLE_NAME         = o2.name,
  17581.         FK_COLUMN_NAME         = c2.name,
  17582.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17583.         FK_COLUMN_PROPID    = convert(int,null),
  17584.         ORDINAL                = convert(int,16),
  17585.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17586.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17587.         PK_NAME                = i.name,
  17588.         FK_NAME                = object_name(r.constid),
  17589.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17590.     from
  17591.         sysobjects o1, sysobjects o2,
  17592.         syscolumns c1, syscolumns c2,
  17593.         sysreferences r, sysindexes i
  17594.     where    
  17595.         (@fk_table_catalog is null or @fk_table_catalog = db_name())
  17596.     and    o1.name = @pk_table_name
  17597.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17598.     and    o1.id = r.rkeyid
  17599.     and    r.keycnt >= 16
  17600.     and    o1.id = c1.id
  17601.     and    c1.colid = r.rkey16
  17602.     and r.fkeyid = o2.id
  17603.     and    (@fk_table_name is null or @fk_table_name = o2.name)
  17604.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17605.     and    o2.id = c2.id    
  17606.     and    c2.colid = r.fkey16
  17607.     and permissions(o1.id) <> 0
  17608.     and permissions(o2.id) <> 0
  17609.     and i.id = r.rkeyid
  17610.     and i.indid = r.rkeyindid        
  17611.     order by 8,9,2,3,13
  17612. go
  17613. dump tran master with no_log
  17614. go
  17615. CREATE PROCEDURE sp_foreign_keys_rowset;2
  17616.     (
  17617.     @fk_table_name        sysname,
  17618.     @fk_table_schema    sysname = null,
  17619.     @pk_table_name        sysname = null,
  17620.     @pk_table_schema    sysname = null,
  17621.     @pk_table_catalog    sysname = null
  17622.     )
  17623. as
  17624.     select
  17625.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17626.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17627.         PK_TABLE_NAME         = o1.name,
  17628.         PK_COLUMN_NAME         = c1.name,
  17629.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17630.         PK_COLUMN_PROPID    = convert(int,null),
  17631.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17632.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17633.         FK_TABLE_NAME         = o2.name,
  17634.         FK_COLUMN_NAME         = c2.name,
  17635.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17636.         FK_COLUMN_PROPID    = convert(int,null),
  17637.         ORDINAL                = convert(int,1),
  17638.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17639.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17640.         PK_NAME                = i.name,
  17641.         FK_NAME                = object_name(r.constid),
  17642.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17643.     from
  17644.         sysobjects o1, sysobjects o2,
  17645.         syscolumns c1, syscolumns c2,
  17646.         sysreferences r, sysindexes i
  17647.     where    
  17648.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17649.     and    o2.name = @fk_table_name
  17650.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17651.     and    o2.id = r.fkeyid
  17652.     and    o2.id = c2.id
  17653.     and    c2.colid = r.fkey1
  17654.     and r.rkeyid = o1.id
  17655.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17656.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17657.     and    o1.id = c1.id    
  17658.     and    c1.colid = r.rkey1
  17659.     and permissions(o1.id) <> 0
  17660.     and permissions(o2.id) <> 0
  17661.     and i.id = r.rkeyid
  17662.     and i.indid = r.rkeyindid        
  17663.     union    all
  17664.     select
  17665.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17666.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17667.         PK_TABLE_NAME         = o1.name,
  17668.         PK_COLUMN_NAME         = c1.name,
  17669.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17670.         PK_COLUMN_PROPID    = convert(int,null),
  17671.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17672.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17673.         FK_TABLE_NAME         = o2.name,
  17674.         FK_COLUMN_NAME         = c2.name,
  17675.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17676.         FK_COLUMN_PROPID    = convert(int,null),
  17677.         ORDINAL                = convert(int,2),
  17678.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17679.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17680.         PK_NAME                = i.name,
  17681.         FK_NAME                = object_name(r.constid),
  17682.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17683.     from
  17684.         sysobjects o1, sysobjects o2,
  17685.         syscolumns c1, syscolumns c2,
  17686.         sysreferences r, sysindexes i
  17687.     where    
  17688.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17689.     and    o2.name = @fk_table_name
  17690.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17691.     and    o2.id = r.fkeyid
  17692.     and    r.keycnt >= 2
  17693.     and    o2.id = c2.id
  17694.     and    c2.colid = r.fkey2
  17695.     and    r.rkeyid = o1.id
  17696.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17697.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17698.     and    o1.id = c1.id    
  17699.     and    c1.colid = r.rkey2
  17700.     and permissions(o1.id) <> 0
  17701.     and permissions(o2.id) <> 0
  17702.     and i.id = r.rkeyid
  17703.     and i.indid = r.rkeyindid            
  17704.     union    all
  17705.     select
  17706.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17707.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17708.         PK_TABLE_NAME         = o1.name,
  17709.         PK_COLUMN_NAME         = c1.name,
  17710.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17711.         PK_COLUMN_PROPID    = convert(int,null),
  17712.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17713.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17714.         FK_TABLE_NAME         = o2.name,
  17715.         FK_COLUMN_NAME         = c2.name,
  17716.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17717.         FK_COLUMN_PROPID    = convert(int,null),
  17718.         ORDINAL                = convert(int,3),
  17719.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17720.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17721.         PK_NAME                = i.name,
  17722.         FK_NAME                = object_name(r.constid),
  17723.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17724.     from
  17725.         sysobjects o1, sysobjects o2,
  17726.         syscolumns c1, syscolumns c2,
  17727.         sysreferences r, sysindexes i
  17728.     where    
  17729.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17730.     and    o2.name = @fk_table_name
  17731.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17732.     and    o2.id = r.fkeyid
  17733.     and    r.keycnt >= 3
  17734.     and    o2.id = c2.id
  17735.     and    c2.colid = r.fkey3
  17736.     and r.rkeyid = o1.id
  17737.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17738.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17739.     and    o1.id = c1.id    
  17740.     and    c1.colid = r.rkey3
  17741.     and permissions(o1.id) <> 0
  17742.     and permissions(o2.id) <> 0
  17743.     and i.id = r.rkeyid
  17744.     and i.indid = r.rkeyindid            
  17745.     union    all
  17746.     select
  17747.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17748.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17749.         PK_TABLE_NAME         = o1.name,
  17750.         PK_COLUMN_NAME         = c1.name,
  17751.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17752.         PK_COLUMN_PROPID    = convert(int,null),
  17753.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17754.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17755.         FK_TABLE_NAME         = o2.name,
  17756.         FK_COLUMN_NAME         = c2.name,
  17757.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17758.         FK_COLUMN_PROPID    = convert(int,null),
  17759.         ORDINAL                = convert(int,4),
  17760.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17761.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17762.         PK_NAME                = i.name,
  17763.         FK_NAME                = object_name(r.constid),
  17764.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17765.     from
  17766.         sysobjects o1, sysobjects o2,
  17767.         syscolumns c1, syscolumns c2,
  17768.         sysreferences r, sysindexes i
  17769.     where    
  17770.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17771.     and    o2.name = @fk_table_name
  17772.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17773.     and    o2.id = r.fkeyid
  17774.     and    r.keycnt >= 4
  17775.     and    o2.id = c2.id
  17776.     and    c2.colid = r.fkey4
  17777.     and r.rkeyid = o1.id
  17778.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17779.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17780.     and    o1.id = c1.id    
  17781.     and    c1.colid = r.rkey4
  17782.     and permissions(o1.id) <> 0
  17783.     and permissions(o2.id) <> 0
  17784.     and i.id = r.rkeyid
  17785.     and i.indid = r.rkeyindid            
  17786.     union    all
  17787.     select
  17788.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17789.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17790.         PK_TABLE_NAME         = o1.name,
  17791.         PK_COLUMN_NAME         = c1.name,
  17792.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17793.         PK_COLUMN_PROPID    = convert(int,null),
  17794.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17795.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17796.         FK_TABLE_NAME         = o2.name,
  17797.         FK_COLUMN_NAME         = c2.name,
  17798.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17799.         FK_COLUMN_PROPID    = convert(int,null),
  17800.         ORDINAL                = convert(int,5),
  17801.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17802.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17803.         PK_NAME                = i.name,
  17804.         FK_NAME                = object_name(r.constid),
  17805.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17806.     from
  17807.         sysobjects o1, sysobjects o2,
  17808.         syscolumns c1, syscolumns c2,
  17809.         sysreferences r, sysindexes i
  17810.     where    
  17811.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17812.     and    o2.name = @fk_table_name
  17813.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17814.     and    o2.id = r.fkeyid
  17815.     and    r.keycnt >= 5
  17816.     and    o2.id = c2.id
  17817.     and    c2.colid = r.fkey5
  17818.     and    r.rkeyid = o1.id
  17819.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17820.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17821.     and    o1.id = c1.id    
  17822.     and    c1.colid = r.rkey5
  17823.     and permissions(o1.id) <> 0
  17824.     and permissions(o2.id) <> 0
  17825.     and i.id = r.rkeyid
  17826.     and i.indid = r.rkeyindid            
  17827.     union    all
  17828.     select
  17829.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17830.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17831.         PK_TABLE_NAME         = o1.name,
  17832.         PK_COLUMN_NAME         = c1.name,
  17833.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17834.         PK_COLUMN_PROPID    = convert(int,null),
  17835.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17836.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17837.         FK_TABLE_NAME         = o2.name,
  17838.         FK_COLUMN_NAME         = c2.name,
  17839.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17840.         FK_COLUMN_PROPID    = convert(int,null),
  17841.         ORDINAL                = convert(int,6),
  17842.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17843.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17844.         PK_NAME                = i.name,
  17845.         FK_NAME                = object_name(r.constid),
  17846.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17847.     from
  17848.         sysobjects o1, sysobjects o2,
  17849.         syscolumns c1, syscolumns c2,
  17850.         sysreferences r, sysindexes i
  17851.     where    
  17852.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17853.     and    o2.name = @fk_table_name
  17854.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17855.     and    o2.id = r.fkeyid
  17856.     and    r.keycnt >= 6
  17857.     and    o2.id = c2.id
  17858.     and    c2.colid = r.fkey6
  17859.     and r.rkeyid = o1.id
  17860.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17861.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17862.     and    o1.id = c1.id        
  17863.     and    c1.colid = r.rkey6
  17864.     and permissions(o1.id) <> 0
  17865.     and permissions(o2.id) <> 0
  17866.     and i.id = r.rkeyid
  17867.     and i.indid = r.rkeyindid        
  17868.     union    all
  17869.     select
  17870.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17871.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17872.         PK_TABLE_NAME         = o1.name,
  17873.         PK_COLUMN_NAME         = c1.name,
  17874.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17875.         PK_COLUMN_PROPID    = convert(int,null),
  17876.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17877.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  17878.         FK_TABLE_NAME         = o2.name,
  17879.         FK_COLUMN_NAME         = c2.name,
  17880.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17881.         FK_COLUMN_PROPID    = convert(int,null),
  17882.         ORDINAL                = convert(int,7),
  17883.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17884.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17885.         PK_NAME                = i.name,
  17886.         FK_NAME                = object_name(r.constid),
  17887.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17888.     from
  17889.         sysobjects o1, sysobjects o2,
  17890.         syscolumns c1, syscolumns c2,
  17891.         sysreferences r, sysindexes i
  17892.     where    
  17893.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17894.     and    o2.name = @fk_table_name
  17895.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17896.     and    o2.id = r.fkeyid
  17897.     and    r.keycnt >= 7
  17898.     and    o2.id = c2.id
  17899.     and    c2.colid = r.fkey7
  17900.     and    r.rkeyid = o1.id
  17901.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17902.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17903.     and    o1.id = c1.id    
  17904.     and    c1.colid = r.rkey7
  17905.     and permissions(o1.id) <> 0
  17906.     and permissions(o2.id) <> 0
  17907.     and i.id = r.rkeyid
  17908.     and i.indid = r.rkeyindid            
  17909.     union    all
  17910.     select
  17911.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17912.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17913.         PK_TABLE_NAME         = o1.name,
  17914.         PK_COLUMN_NAME         = c1.name,
  17915.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17916.         PK_COLUMN_PROPID    = convert(int,null),
  17917.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17918.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17919.         FK_TABLE_NAME         = o2.name,
  17920.         FK_COLUMN_NAME         = c2.name,
  17921.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17922.         FK_COLUMN_PROPID    = convert(int,null),
  17923.         ORDINAL                = convert(int,8),
  17924.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17925.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17926.         PK_NAME                = i.name,
  17927.         FK_NAME                = object_name(r.constid),
  17928.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17929.     from
  17930.         sysobjects o1, sysobjects o2,
  17931.         syscolumns c1, syscolumns c2,
  17932.         sysreferences r, sysindexes i
  17933.     where    
  17934.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17935.     and    o2.name = @fk_table_name
  17936.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17937.     and    o2.id = r.fkeyid
  17938.     and    r.keycnt >= 8
  17939.     and    o2.id = c2.id
  17940.     and    c2.colid = r.fkey8
  17941.     and r.rkeyid = o1.id
  17942.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17943.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17944.     and    o1.id = c1.id    
  17945.     and    c1.colid = r.rkey8
  17946.     and permissions(o1.id) <> 0
  17947.     and permissions(o2.id) <> 0
  17948.     and i.id = r.rkeyid
  17949.     and i.indid = r.rkeyindid            
  17950.     union    all
  17951.     select
  17952.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17953.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17954.         PK_TABLE_NAME         = o1.name,
  17955.         PK_COLUMN_NAME         = c1.name,
  17956.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17957.         PK_COLUMN_PROPID    = convert(int,null),
  17958.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  17959.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  17960.         FK_TABLE_NAME         = o2.name,
  17961.         FK_COLUMN_NAME         = c2.name,
  17962.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17963.         FK_COLUMN_PROPID    = convert(int,null),
  17964.         ORDINAL                = convert(int,9),
  17965.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17966.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  17967.         PK_NAME                = i.name,
  17968.         FK_NAME                = object_name(r.constid),
  17969.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  17970.     from
  17971.         sysobjects o1, sysobjects o2,
  17972.         syscolumns c1, syscolumns c2,
  17973.         sysreferences r, sysindexes i
  17974.     where    
  17975.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  17976.     and    o2.name = @fk_table_name
  17977.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  17978.     and    o2.id = r.fkeyid
  17979.     and    r.keycnt >= 9
  17980.     and    o2.id = c2.id
  17981.     and    c2.colid = r.fkey9
  17982.     and    r.rkeyid = o1.id
  17983.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  17984.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  17985.     and    o1.id = c1.id    
  17986.     and    c1.colid = r.rkey9
  17987.     and permissions(o1.id) <> 0
  17988.     and permissions(o2.id) <> 0
  17989.     and i.id = r.rkeyid
  17990.     and i.indid = r.rkeyindid            
  17991.     union    all
  17992.     select
  17993.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  17994.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  17995.         PK_TABLE_NAME         = o1.name,
  17996.         PK_COLUMN_NAME         = c1.name,
  17997.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  17998.         PK_COLUMN_PROPID    = convert(int,null),
  17999.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18000.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18001.         FK_TABLE_NAME         = o2.name,
  18002.         FK_COLUMN_NAME         = c2.name,
  18003.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18004.         FK_COLUMN_PROPID    = convert(int,null),
  18005.         ORDINAL                = convert(int,10),
  18006.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18007.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18008.         PK_NAME                = i.name,
  18009.         FK_NAME                = object_name(r.constid),
  18010.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18011.     from
  18012.         sysobjects o1, sysobjects o2,
  18013.         syscolumns c1, syscolumns c2,
  18014.         sysreferences r, sysindexes i
  18015.     where    
  18016.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18017.     and    o2.name = @fk_table_name
  18018.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18019.     and    o2.id = r.fkeyid
  18020.     and    r.keycnt >= 10
  18021.     and    o2.id = c2.id
  18022.     and    c2.colid = r.fkey10
  18023.     and r.rkeyid = o1.id
  18024.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18025.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18026.     and    o1.id = c1.id    
  18027.     and    c1.colid = r.rkey10
  18028.     and permissions(o1.id) <> 0
  18029.     and permissions(o2.id) <> 0
  18030.     and i.id = r.rkeyid
  18031.     and i.indid = r.rkeyindid            
  18032.     union    all
  18033.     select
  18034.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18035.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18036.         PK_TABLE_NAME         = o1.name,
  18037.         PK_COLUMN_NAME         = c1.name,
  18038.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18039.         PK_COLUMN_PROPID    = convert(int,null),
  18040.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18041.         FK_TABLE_SCHEMA     = user_name(o2.uid),
  18042.         FK_TABLE_NAME         = o2.name,
  18043.         FK_COLUMN_NAME         = c2.name,
  18044.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18045.         FK_COLUMN_PROPID    = convert(int,null),
  18046.         ORDINAL                = convert(int,11),
  18047.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18048.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18049.         PK_NAME                = i.name,
  18050.         FK_NAME                = object_name(r.constid),
  18051.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18052.     from
  18053.         sysobjects o1, sysobjects o2,
  18054.         syscolumns c1, syscolumns c2,
  18055.         sysreferences r, sysindexes i
  18056.     where    
  18057.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18058.     and    o2.name = @fk_table_name
  18059.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18060.     and    o2.id = r.fkeyid
  18061.     and    r.keycnt >= 11
  18062.     and    o2.id = c2.id
  18063.     and    c2.colid = r.fkey11
  18064.     and r.rkeyid = o1.id
  18065.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18066.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18067.     and    o1.id = c1.id    
  18068.     and    c1.colid = r.rkey11
  18069.     and permissions(o1.id) <> 0
  18070.     and permissions(o2.id) <> 0
  18071.     and i.id = r.rkeyid
  18072.     and i.indid = r.rkeyindid            
  18073.     union    all
  18074.     select
  18075.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18076.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18077.         PK_TABLE_NAME         = o1.name,
  18078.         PK_COLUMN_NAME         = c1.name,
  18079.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18080.         PK_COLUMN_PROPID    = convert(int,null),
  18081.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18082.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18083.         FK_TABLE_NAME         = o2.name,
  18084.         FK_COLUMN_NAME         = c2.name,
  18085.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18086.         FK_COLUMN_PROPID    = convert(int,null),
  18087.         ORDINAL                = convert(int,12),
  18088.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18089.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18090.         PK_NAME                = i.name,
  18091.         FK_NAME                = object_name(r.constid),
  18092.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18093.     from
  18094.         sysobjects o1, sysobjects o2,
  18095.         syscolumns c1, syscolumns c2,
  18096.         sysreferences r, sysindexes i
  18097.     where    
  18098.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18099.     and    o2.name = @fk_table_name
  18100.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18101.     and    o2.id = r.fkeyid
  18102.     and    r.keycnt >= 12
  18103.     and    o2.id = c2.id
  18104.     and    c2.colid = r.fkey12
  18105.     and r.rkeyid = o1.id
  18106.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18107.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18108.     and    o1.id = c1.id    
  18109.     and    c1.colid = r.rkey12
  18110.     and permissions(o1.id) <> 0
  18111.     and permissions(o2.id) <> 0
  18112.     and i.id = r.rkeyid
  18113.     and i.indid = r.rkeyindid            
  18114.     union    all
  18115.     select
  18116.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18117.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18118.         PK_TABLE_NAME         = o1.name,
  18119.         PK_COLUMN_NAME         = c1.name,
  18120.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18121.         PK_COLUMN_PROPID    = convert(int,null),
  18122.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18123.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18124.         FK_TABLE_NAME         = o2.name,
  18125.         FK_COLUMN_NAME         = c2.name,
  18126.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18127.         FK_COLUMN_PROPID    = convert(int,null),
  18128.         ORDINAL                = convert(int,13),
  18129.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18130.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18131.         PK_NAME                = i.name,
  18132.         FK_NAME                = object_name(r.constid),
  18133.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18134.     from
  18135.         sysobjects o1, sysobjects o2,
  18136.         syscolumns c1, syscolumns c2,
  18137.         sysreferences r, sysindexes i
  18138.     where    
  18139.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18140.     and    o2.name = @fk_table_name
  18141.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18142.     and    o2.id = r.fkeyid
  18143.     and    r.keycnt >= 13
  18144.     and    o2.id = c2.id
  18145.     and    c2.colid = r.fkey13
  18146.     and r.rkeyid = o1.id
  18147.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18148.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18149.     and    o1.id = c1.id    
  18150.     and    c1.colid = r.rkey13
  18151.     and permissions(o1.id) <> 0
  18152.     and permissions(o2.id) <> 0
  18153.     and i.id = r.rkeyid
  18154.     and i.indid = r.rkeyindid            
  18155.     union    all
  18156.     select
  18157.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18158.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18159.         PK_TABLE_NAME         = o1.name,
  18160.         PK_COLUMN_NAME         = c1.name,
  18161.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18162.         PK_COLUMN_PROPID    = convert(int,null),
  18163.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18164.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18165.         FK_TABLE_NAME         = o2.name,
  18166.         FK_COLUMN_NAME         = c2.name,
  18167.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18168.         FK_COLUMN_PROPID    = convert(int,null),
  18169.         ORDINAL                = convert(int,14),
  18170.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18171.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18172.         PK_NAME                = i.name,
  18173.         FK_NAME                = object_name(r.constid),
  18174.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18175.     from
  18176.         sysobjects o1, sysobjects o2,
  18177.         syscolumns c1, syscolumns c2,
  18178.         sysreferences r, sysindexes i
  18179.     where    
  18180.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18181.     and    o2.name = @fk_table_name
  18182.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18183.     and    o2.id = r.fkeyid
  18184.     and    r.keycnt >= 14
  18185.     and    o2.id = c2.id
  18186.     and    c2.colid = r.fkey14
  18187.     and r.rkeyid = o1.id
  18188.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18189.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18190.     and    o1.id = c1.id    
  18191.     and    c1.colid = r.rkey14
  18192.     and permissions(o1.id) <> 0
  18193.     and permissions(o2.id) <> 0
  18194.     and i.id = r.rkeyid
  18195.     and i.indid = r.rkeyindid            
  18196.     union    all
  18197.     select
  18198.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18199.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18200.         PK_TABLE_NAME         = o1.name,
  18201.         PK_COLUMN_NAME         = c1.name,
  18202.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18203.         PK_COLUMN_PROPID    = convert(int,null),
  18204.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18205.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18206.         FK_TABLE_NAME         = o2.name,
  18207.         FK_COLUMN_NAME         = c2.name,
  18208.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18209.         FK_COLUMN_PROPID    = convert(int,null),
  18210.         ORDINAL                = convert(int,15),
  18211.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18212.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18213.         PK_NAME                = i.name,
  18214.         FK_NAME                = object_name(r.constid),
  18215.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/        
  18216.     from
  18217.         sysobjects o1, sysobjects o2,
  18218.         syscolumns c1, syscolumns c2,
  18219.         sysreferences r, sysindexes i
  18220.     where    
  18221.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18222.     and    o2.name = @fk_table_name
  18223.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18224.     and    o2.id = r.fkeyid
  18225.     and    r.keycnt >= 15
  18226.     and    o2.id = c2.id
  18227.     and    c2.colid = r.fkey15
  18228.     and r.rkeyid = o1.id
  18229.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18230.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18231.     and    o1.id = c1.id    
  18232.     and    c1.colid = r.rkey15
  18233.     and permissions(o1.id) <> 0
  18234.     and permissions(o2.id) <> 0
  18235.     and i.id = r.rkeyid
  18236.     and i.indid = r.rkeyindid            
  18237.     union    all
  18238.     select
  18239.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18240.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18241.         PK_TABLE_NAME         = o1.name,
  18242.         PK_COLUMN_NAME         = c1.name,
  18243.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18244.         PK_COLUMN_PROPID    = convert(int,null),
  18245.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18246.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18247.         FK_TABLE_NAME         = o2.name,
  18248.         FK_COLUMN_NAME         = c2.name,
  18249.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18250.         FK_COLUMN_PROPID    = convert(int,null),
  18251.         ORDINAL                = convert(int,16),
  18252.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18253.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18254.         PK_NAME                = i.name,
  18255.         FK_NAME                = object_name(r.constid),
  18256.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/        
  18257.     from
  18258.         sysobjects o1, sysobjects o2,
  18259.         syscolumns c1, syscolumns c2,
  18260.         sysreferences r, sysindexes i
  18261.     where    
  18262.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18263.     and    o2.name = @fk_table_name
  18264.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18265.     and    o2.id = r.fkeyid
  18266.     and    r.keycnt >= 16
  18267.     and    o2.id = c2.id
  18268.     and    c2.colid = r.fkey16
  18269.     and r.rkeyid = o1.id
  18270.     and    (@pk_table_name is null or @pk_table_name = o1.name)
  18271.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18272.     and    o1.id = c1.id    
  18273.     and    c1.colid = r.rkey16
  18274.     and permissions(o1.id) <> 0
  18275.     and permissions(o2.id) <> 0
  18276.     and i.id = r.rkeyid
  18277.     and i.indid = r.rkeyindid        
  18278.     order by 8,9,2,3,13
  18279. go
  18280. dump tran master with no_log
  18281. go
  18282. CREATE PROCEDURE sp_foreign_keys_rowset;3
  18283.     (
  18284.     @pk_table_schema    sysname = null,
  18285.     @pk_table_catalog    sysname = null,
  18286.     @fk_table_schema    sysname = null,
  18287.     @fk_table_catalog    sysname = null
  18288.     )
  18289. as
  18290.     select
  18291.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18292.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18293.         PK_TABLE_NAME         = o1.name,
  18294.         PK_COLUMN_NAME         = c1.name,
  18295.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18296.         PK_COLUMN_PROPID    = convert(int,null),
  18297.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18298.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18299.         FK_TABLE_NAME         = o2.name,
  18300.         FK_COLUMN_NAME         = c2.name,
  18301.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18302.         FK_COLUMN_PROPID    = convert(int,null),
  18303.         ORDINAL                = convert(int,1),
  18304.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18305.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18306.         PK_NAME                = i.name,
  18307.         FK_NAME                = object_name(r.constid),
  18308.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/        
  18309.     from
  18310.         sysobjects o1, sysobjects o2,
  18311.         syscolumns c1, syscolumns c2,
  18312.         sysreferences r, sysindexes i
  18313.     where    
  18314.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18315.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18316.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18317.     and    o1.id = r.rkeyid
  18318.     and    o1.id = c1.id
  18319.     and    c1.colid = r.rkey1
  18320.     and r.fkeyid = o2.id
  18321.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18322.     and    o2.id = c2.id    
  18323.     and    c2.colid = r.fkey1
  18324.     and permissions(o1.id) <> 0
  18325.     and permissions(o2.id) <> 0
  18326.     and i.id = r.rkeyid
  18327.     and i.indid = r.rkeyindid        
  18328.     union all
  18329.     select
  18330.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18331.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18332.         PK_TABLE_NAME         = o1.name,
  18333.         PK_COLUMN_NAME         = c1.name,
  18334.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18335.         PK_COLUMN_PROPID    = convert(int,null),
  18336.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18337.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18338.         FK_TABLE_NAME         = o2.name,
  18339.         FK_COLUMN_NAME         = c2.name,
  18340.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18341.         FK_COLUMN_PROPID    = convert(int,null),
  18342.         ORDINAL                = convert(int,2),
  18343.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18344.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18345.         PK_NAME                = i.name,
  18346.         FK_NAME                = object_name(r.constid),
  18347.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18348.     from
  18349.         sysobjects o1, sysobjects o2,
  18350.         syscolumns c1, syscolumns c2,
  18351.         sysreferences r, sysindexes i
  18352.     where    
  18353.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18354.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18355.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18356.     and    o1.id = r.rkeyid
  18357.     and    r.keycnt >= 2
  18358.     and    o1.id = c1.id
  18359.     and    c1.colid = r.rkey2
  18360.     and r.fkeyid = o2.id
  18361.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18362.     and    o2.id = c2.id    
  18363.     and    c2.colid = r.fkey2
  18364.     and permissions(o1.id) <> 0
  18365.     and permissions(o2.id) <> 0
  18366.     and i.id = r.rkeyid
  18367.     and i.indid = r.rkeyindid        
  18368.     union all
  18369.     select
  18370.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18371.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18372.         PK_TABLE_NAME         = o1.name,
  18373.         PK_COLUMN_NAME         = c1.name,
  18374.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18375.         PK_COLUMN_PROPID    = convert(int,null),
  18376.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18377.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18378.         FK_TABLE_NAME         = o2.name,
  18379.         FK_COLUMN_NAME         = c2.name,
  18380.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18381.         FK_COLUMN_PROPID    = convert(int,null),
  18382.         ORDINAL                = convert(int,3),
  18383.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18384.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18385.         PK_NAME                = i.name,
  18386.         FK_NAME                = object_name(r.constid),
  18387.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18388.     from
  18389.         sysobjects o1, sysobjects o2,
  18390.         syscolumns c1, syscolumns c2,
  18391.         sysreferences r, sysindexes i
  18392.     where    
  18393.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18394.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18395.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18396.     and    o1.id = r.rkeyid
  18397.     and    r.keycnt >= 3
  18398.     and    o1.id = c1.id
  18399.     and    c1.colid = r.rkey3
  18400.     and r.fkeyid = o2.id
  18401.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18402.     and    o2.id = c2.id    
  18403.     and    c2.colid = r.fkey3
  18404.     and permissions(o1.id) <> 0
  18405.     and permissions(o2.id) <> 0
  18406.     and i.id = r.rkeyid
  18407.     and i.indid = r.rkeyindid        
  18408.     union all
  18409.     select
  18410.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18411.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18412.         PK_TABLE_NAME         = o1.name,
  18413.         PK_COLUMN_NAME         = c1.name,
  18414.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18415.         PK_COLUMN_PROPID    = convert(int,null),
  18416.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18417.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18418.         FK_TABLE_NAME         = o2.name,
  18419.         FK_COLUMN_NAME         = c2.name,
  18420.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18421.         FK_COLUMN_PROPID    = convert(int,null),
  18422.         ORDINAL                = convert(int,4),
  18423.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18424.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18425.         PK_NAME                = i.name,
  18426.         FK_NAME                = object_name(r.constid),
  18427.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18428.     from
  18429.         sysobjects o1, sysobjects o2,
  18430.         syscolumns c1, syscolumns c2,
  18431.         sysreferences r, sysindexes i
  18432.     where    
  18433.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18434.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18435.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18436.     and    o1.id = r.rkeyid
  18437.     and    r.keycnt >= 4
  18438.     and    o1.id = c1.id
  18439.     and    c1.colid = r.rkey4
  18440.     and r.fkeyid = o2.id
  18441.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18442.     and    o2.id = c2.id    
  18443.     and    c2.colid = r.fkey4
  18444.     and permissions(o1.id) <> 0
  18445.     and permissions(o2.id) <> 0
  18446.     and i.id = r.rkeyid
  18447.     and i.indid = r.rkeyindid        
  18448.     union all
  18449.     select
  18450.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18451.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18452.         PK_TABLE_NAME         = o1.name,
  18453.         PK_COLUMN_NAME         = c1.name,
  18454.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18455.         PK_COLUMN_PROPID    = convert(int,null),
  18456.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18457.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18458.         FK_TABLE_NAME         = o2.name,
  18459.         FK_COLUMN_NAME         = c2.name,
  18460.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18461.         FK_COLUMN_PROPID    = convert(int,null),
  18462.         ORDINAL                = convert(int,5),
  18463.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18464.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18465.         PK_NAME                = i.name,
  18466.         FK_NAME                = object_name(r.constid),
  18467.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18468.     from
  18469.         sysobjects o1, sysobjects o2,
  18470.         syscolumns c1, syscolumns c2,
  18471.         sysreferences r, sysindexes i
  18472.     where    
  18473.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18474.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18475.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18476.     and    o1.id = r.rkeyid
  18477.     and    r.keycnt >= 5
  18478.     and    o1.id = c1.id
  18479.     and    c1.colid = r.rkey5
  18480.     and r.fkeyid = o2.id
  18481.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18482.     and    o2.id = c2.id    
  18483.     and    c2.colid = r.fkey5
  18484.     and permissions(o1.id) <> 0
  18485.     and permissions(o2.id) <> 0
  18486.     and i.id = r.rkeyid
  18487.     and i.indid = r.rkeyindid        
  18488.     union all
  18489.     select
  18490.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18491.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18492.         PK_TABLE_NAME         = o1.name,
  18493.         PK_COLUMN_NAME         = c1.name,
  18494.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18495.         PK_COLUMN_PROPID    = convert(int,null),
  18496.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18497.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18498.         FK_TABLE_NAME         = o2.name,
  18499.         FK_COLUMN_NAME         = c2.name,
  18500.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18501.         FK_COLUMN_PROPID    = convert(int,null),
  18502.         ORDINAL                = convert(int,6),
  18503.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18504.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18505.         PK_NAME                = i.name,
  18506.         FK_NAME                = object_name(r.constid),
  18507.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18508.     from
  18509.         sysobjects o1, sysobjects o2,
  18510.         syscolumns c1, syscolumns c2,
  18511.         sysreferences r, sysindexes i
  18512.     where    
  18513.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18514.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18515.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18516.     and    o1.id = r.rkeyid
  18517.     and    r.keycnt >= 6
  18518.     and    o1.id = c1.id
  18519.     and    c1.colid = r.rkey6
  18520.     and r.fkeyid = o2.id
  18521.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18522.     and    o2.id = c2.id    
  18523.     and    c2.colid = r.fkey6
  18524.     and permissions(o1.id) <> 0
  18525.     and permissions(o2.id) <> 0
  18526.     and i.id = r.rkeyid
  18527.     and i.indid = r.rkeyindid        
  18528.     union all
  18529.     select
  18530.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18531.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18532.         PK_TABLE_NAME         = o1.name,
  18533.         PK_COLUMN_NAME         = c1.name,
  18534.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18535.         PK_COLUMN_PROPID    = convert(int,null),
  18536.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18537.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18538.         FK_TABLE_NAME         = o2.name,
  18539.         FK_COLUMN_NAME         = c2.name,
  18540.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18541.         FK_COLUMN_PROPID    = convert(int,null),
  18542.         ORDINAL                = convert(int,7),
  18543.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18544.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18545.         PK_NAME                = i.name,
  18546.         FK_NAME                = object_name(r.constid),
  18547.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18548.     from
  18549.         sysobjects o1, sysobjects o2,
  18550.         syscolumns c1, syscolumns c2,
  18551.         sysreferences r, sysindexes i
  18552.     where    
  18553.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18554.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18555.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18556.     and    o1.id = r.rkeyid
  18557.     and    r.keycnt >= 7
  18558.     and    o1.id = c1.id
  18559.     and    c1.colid = r.rkey7
  18560.     and r.fkeyid = o2.id
  18561.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18562.     and    o2.id = c2.id    
  18563.     and    c2.colid = r.fkey7
  18564.     and permissions(o1.id) <> 0
  18565.     and permissions(o2.id) <> 0
  18566.     and i.id = r.rkeyid
  18567.     and i.indid = r.rkeyindid        
  18568.     union all
  18569.     select
  18570.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18571.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18572.         PK_TABLE_NAME         = o1.name,
  18573.         PK_COLUMN_NAME         = c1.name,
  18574.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18575.         PK_COLUMN_PROPID    = convert(int,null),
  18576.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18577.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18578.         FK_TABLE_NAME         = o2.name,
  18579.         FK_COLUMN_NAME         = c2.name,
  18580.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18581.         FK_COLUMN_PROPID    = convert(int,null),
  18582.         ORDINAL                = convert(int,8),
  18583.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18584.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18585.         PK_NAME                = i.name,
  18586.         FK_NAME                = object_name(r.constid),
  18587.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18588.     from
  18589.         sysobjects o1, sysobjects o2,
  18590.         syscolumns c1, syscolumns c2,
  18591.         sysreferences r, sysindexes i
  18592.     where    
  18593.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18594.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18595.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18596.     and    o1.id = r.rkeyid
  18597.     and    r.keycnt >= 8
  18598.     and    o1.id = c1.id
  18599.     and    c1.colid = r.rkey8
  18600.     and r.fkeyid = o2.id
  18601.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18602.     and    o2.id = c2.id    
  18603.     and    c2.colid = r.fkey8
  18604.     and permissions(o1.id) <> 0
  18605.     and permissions(o2.id) <> 0
  18606.     and i.id = r.rkeyid
  18607.     and i.indid = r.rkeyindid        
  18608.     union all
  18609.     select
  18610.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18611.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18612.         PK_TABLE_NAME         = o1.name,
  18613.         PK_COLUMN_NAME         = c1.name,
  18614.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18615.         PK_COLUMN_PROPID    = convert(int,null),
  18616.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18617.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18618.         FK_TABLE_NAME         = o2.name,
  18619.         FK_COLUMN_NAME         = c2.name,
  18620.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18621.         FK_COLUMN_PROPID    = convert(int,null),
  18622.         ORDINAL                = convert(int,9),
  18623.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18624.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18625.         PK_NAME                = i.name,
  18626.         FK_NAME                = object_name(r.constid),
  18627.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18628.     from
  18629.         sysobjects o1, sysobjects o2,
  18630.         syscolumns c1, syscolumns c2,
  18631.         sysreferences r, sysindexes i
  18632.     where    
  18633.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18634.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18635.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18636.     and    o1.id = r.rkeyid
  18637.     and    r.keycnt >= 9
  18638.     and    o1.id = c1.id
  18639.     and    c1.colid = r.rkey9
  18640.     and r.fkeyid = o2.id
  18641.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18642.     and    o2.id = c2.id    
  18643.     and    c2.colid = r.fkey9
  18644.     and permissions(o1.id) <> 0
  18645.     and permissions(o2.id) <> 0
  18646.     and i.id = r.rkeyid
  18647.     and i.indid = r.rkeyindid        
  18648.     union all
  18649.     select
  18650.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18651.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18652.         PK_TABLE_NAME         = o1.name,
  18653.         PK_COLUMN_NAME         = c1.name,
  18654.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18655.         PK_COLUMN_PROPID    = convert(int,null),
  18656.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18657.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18658.         FK_TABLE_NAME         = o2.name,
  18659.         FK_COLUMN_NAME         = c2.name,
  18660.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18661.         FK_COLUMN_PROPID    = convert(int,null),
  18662.         ORDINAL                = convert(int,10),
  18663.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18664.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18665.         PK_NAME                = i.name,
  18666.         FK_NAME                = object_name(r.constid),
  18667.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18668.     from
  18669.         sysobjects o1, sysobjects o2,
  18670.         syscolumns c1, syscolumns c2,
  18671.         sysreferences r, sysindexes i
  18672.     where    
  18673.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18674.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18675.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18676.     and    o1.id = r.rkeyid
  18677.     and    r.keycnt >= 10
  18678.     and    o1.id = c1.id
  18679.     and    c1.colid = r.rkey10
  18680.     and r.fkeyid = o2.id
  18681.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18682.     and    o2.id = c2.id    
  18683.     and    c2.colid = r.fkey10
  18684.     and permissions(o1.id) <> 0
  18685.     and permissions(o2.id) <> 0
  18686.     and i.id = r.rkeyid
  18687.     and i.indid = r.rkeyindid        
  18688.     union all
  18689.     select
  18690.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18691.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18692.         PK_TABLE_NAME         = o1.name,
  18693.         PK_COLUMN_NAME         = c1.name,
  18694.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18695.         PK_COLUMN_PROPID    = convert(int,null),
  18696.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18697.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18698.         FK_TABLE_NAME         = o2.name,
  18699.         FK_COLUMN_NAME         = c2.name,
  18700.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18701.         FK_COLUMN_PROPID    = convert(int,null),
  18702.         ORDINAL                = convert(int,11),
  18703.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18704.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18705.         PK_NAME                = i.name,
  18706.         FK_NAME                = object_name(r.constid),
  18707.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18708.     from
  18709.         sysobjects o1, sysobjects o2,
  18710.         syscolumns c1, syscolumns c2,
  18711.         sysreferences r, sysindexes i
  18712.     where    
  18713.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18714.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18715.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18716.     and    o1.id = r.rkeyid
  18717.     and    r.keycnt >= 11
  18718.     and    o1.id = c1.id
  18719.     and    c1.colid = r.rkey11
  18720.     and r.fkeyid = o2.id
  18721.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18722.     and    o2.id = c2.id    
  18723.     and    c2.colid = r.fkey11
  18724.     and permissions(o1.id) <> 0
  18725.     and permissions(o2.id) <> 0
  18726.     and i.id = r.rkeyid
  18727.     and i.indid = r.rkeyindid        
  18728.     union all
  18729.     select
  18730.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18731.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18732.         PK_TABLE_NAME         = o1.name,
  18733.         PK_COLUMN_NAME         = c1.name,
  18734.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18735.         PK_COLUMN_PROPID    = convert(int,null),
  18736.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18737.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18738.         FK_TABLE_NAME         = o2.name,
  18739.         FK_COLUMN_NAME         = c2.name,
  18740.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18741.         FK_COLUMN_PROPID    = convert(int,null),
  18742.         ORDINAL                = convert(int,12),
  18743.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18744.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18745.         PK_NAME                = i.name,
  18746.         FK_NAME                = object_name(r.constid),
  18747.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18748.     from
  18749.         sysobjects o1, sysobjects o2,
  18750.         syscolumns c1, syscolumns c2,
  18751.         sysreferences r, sysindexes i
  18752.     where    
  18753.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18754.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18755.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18756.     and    o1.id = r.rkeyid
  18757.     and    r.keycnt >= 12
  18758.     and    o1.id = c1.id
  18759.     and    c1.colid = r.rkey12
  18760.     and r.fkeyid = o2.id
  18761.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18762.     and    o2.id = c2.id    
  18763.     and    c2.colid = r.fkey12
  18764.     and permissions(o1.id) <> 0
  18765.     and permissions(o2.id) <> 0
  18766.     and i.id = r.rkeyid
  18767.     and i.indid = r.rkeyindid        
  18768.     union all
  18769.     select
  18770.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18771.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18772.         PK_TABLE_NAME         = o1.name,
  18773.         PK_COLUMN_NAME         = c1.name,
  18774.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18775.         PK_COLUMN_PROPID    = convert(int,null),
  18776.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18777.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18778.         FK_TABLE_NAME         = o2.name,
  18779.         FK_COLUMN_NAME         = c2.name,
  18780.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18781.         FK_COLUMN_PROPID    = convert(int,null),
  18782.         ORDINAL                = convert(int,13),
  18783.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18784.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18785.         PK_NAME                = i.name,
  18786.         FK_NAME                = object_name(r.constid),
  18787.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18788.     from
  18789.         sysobjects o1, sysobjects o2,
  18790.         syscolumns c1, syscolumns c2,
  18791.         sysreferences r, sysindexes i
  18792.     where    
  18793.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18794.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18795.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18796.     and    o1.id = r.rkeyid
  18797.     and    r.keycnt >= 13
  18798.     and    o1.id = c1.id
  18799.     and    c1.colid = r.rkey13
  18800.     and r.fkeyid = o2.id
  18801.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18802.     and    o2.id = c2.id    
  18803.     and    c2.colid = r.fkey13
  18804.     and permissions(o1.id) <> 0
  18805.     and permissions(o2.id) <> 0
  18806.     and i.id = r.rkeyid
  18807.     and i.indid = r.rkeyindid        
  18808.     union all
  18809.     select
  18810.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18811.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18812.         PK_TABLE_NAME         = o1.name,
  18813.         PK_COLUMN_NAME         = c1.name,
  18814.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18815.         PK_COLUMN_PROPID    = convert(int,null),
  18816.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18817.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18818.         FK_TABLE_NAME         = o2.name,
  18819.         FK_COLUMN_NAME         = c2.name,
  18820.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18821.         FK_COLUMN_PROPID    = convert(int,null),
  18822.         ORDINAL                = convert(int,14),
  18823.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18824.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18825.         PK_NAME                = i.name,
  18826.         FK_NAME                = object_name(r.constid),
  18827.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18828.     from
  18829.         sysobjects o1, sysobjects o2,
  18830.         syscolumns c1, syscolumns c2,
  18831.         sysreferences r, sysindexes i
  18832.     where    
  18833.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18834.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18835.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18836.     and    o1.id = r.rkeyid
  18837.     and    r.keycnt >= 14
  18838.     and    o1.id = c1.id
  18839.     and    c1.colid = r.rkey14
  18840.     and r.fkeyid = o2.id
  18841.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18842.     and    o2.id = c2.id    
  18843.     and    c2.colid = r.fkey14
  18844.     and permissions(o1.id) <> 0
  18845.     and permissions(o2.id) <> 0
  18846.     and i.id = r.rkeyid
  18847.     and i.indid = r.rkeyindid        
  18848.     union all
  18849.     select
  18850.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18851.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18852.         PK_TABLE_NAME         = o1.name,
  18853.         PK_COLUMN_NAME         = c1.name,
  18854.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18855.         PK_COLUMN_PROPID    = convert(int,null),
  18856.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18857.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18858.         FK_TABLE_NAME         = o2.name,
  18859.         FK_COLUMN_NAME         = c2.name,
  18860.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18861.         FK_COLUMN_PROPID    = convert(int,null),
  18862.         ORDINAL                = convert(int,15),
  18863.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18864.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18865.         PK_NAME                = i.name,
  18866.         FK_NAME                = object_name(r.constid),
  18867.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18868.     from
  18869.         sysobjects o1, sysobjects o2,
  18870.         syscolumns c1, syscolumns c2,
  18871.         sysreferences r, sysindexes i
  18872.     where    
  18873.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18874.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18875.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18876.     and    o1.id = r.rkeyid
  18877.     and    r.keycnt >= 15
  18878.     and    o1.id = c1.id
  18879.     and    c1.colid = r.rkey15
  18880.     and r.fkeyid = o2.id
  18881.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18882.     and    o2.id = c2.id    
  18883.     and    c2.colid = r.fkey15
  18884.     and permissions(o1.id) <> 0
  18885.     and permissions(o2.id) <> 0
  18886.     and i.id = r.rkeyid
  18887.     and i.indid = r.rkeyindid        
  18888.     union all
  18889.     select
  18890.         PK_TABLE_CATALOG    = db_name(r.rkeydbid),
  18891.         PK_TABLE_SCHEMA        = user_name(o1.uid),
  18892.         PK_TABLE_NAME         = o1.name,
  18893.         PK_COLUMN_NAME         = c1.name,
  18894.         PK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18895.         PK_COLUMN_PROPID    = convert(int,null),
  18896.         FK_TABLE_CATALOG    = db_name(r.fkeydbid),
  18897.         FK_TABLE_SCHEMA        = user_name(o2.uid),
  18898.         FK_TABLE_NAME         = o2.name,
  18899.         FK_COLUMN_NAME         = c2.name,
  18900.         FK_COLUMN_GUID        = convert(uniqueidentifier,null),
  18901.         FK_COLUMN_PROPID    = convert(int,null),
  18902.         ORDINAL                = convert(int,16),
  18903.         UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18904.         DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
  18905.         PK_NAME                = i.name,
  18906.         FK_NAME                = object_name(r.constid),
  18907.         DEFERRABILITY        = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
  18908.     from
  18909.         sysobjects o1, sysobjects o2,
  18910.         syscolumns c1, syscolumns c2,
  18911.         sysreferences r, sysindexes i
  18912.     where    
  18913.         (@pk_table_catalog is null or @pk_table_catalog = db_name())
  18914.     and     (@fk_table_catalog is null or @fk_table_catalog = db_name())
  18915.     and    (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
  18916.     and    o1.id = r.rkeyid
  18917.     and    o1.id = c1.id
  18918.     and    r.keycnt >= 16
  18919.     and    c1.colid = r.rkey16
  18920.     and r.fkeyid = o2.id
  18921.     and    (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
  18922.     and    o2.id = c2.id    
  18923.     and    c2.colid = r.fkey16
  18924.     and permissions(o1.id) <> 0
  18925.     and permissions(o2.id) <> 0
  18926.     and i.id = r.rkeyid
  18927.     and i.indid = r.rkeyindid        
  18928.     order by 8,9,2,3,13
  18929. go
  18930. dump tran master with no_log
  18931. go
  18932. create procedure sp_foreign_keys_rowset;5
  18933.     (
  18934.     @server_name        sysname,
  18935.     @pk_catalog_name    sysname = null,
  18936.     @fk_catalog_name    sysname = null,
  18937.     @pk_table_name        sysname = null,
  18938.     @pk_table_schema    sysname = null,
  18939.     @fk_table_name        sysname = null,
  18940.     @fk_table_schema    sysname = null
  18941.     )
  18942. as
  18943.     select
  18944.         PK_TABLE_CATALOG,
  18945.         PK_TABLE_SCHEMA,    
  18946.         PK_TABLE_NAME,     
  18947.         PK_COLUMN_NAME,     
  18948.         PK_COLUMN_GUID,    
  18949.         PK_COLUMN_PROPID,
  18950.         FK_TABLE_CATALOG,
  18951.         FK_TABLE_SCHEMA, 
  18952.         FK_TABLE_NAME,     
  18953.         FK_COLUMN_NAME,     
  18954.         FK_COLUMN_GUID,    
  18955.         FK_COLUMN_PROPID,
  18956.         ORDINAL,        
  18957.         UPDATE_RULE,    
  18958.         DELETE_RULE
  18959.         --PK_NAME,        
  18960.         --FK_NAME,
  18961.         --DEFERRABILITY    
  18962.     from master.dbo.SYSREMOTE_FOREIGN_KEYS <
  18963.                 @server_name,
  18964.                 @pk_catalog_name,
  18965.                 @pk_table_schema,
  18966.                 @pk_table_name,
  18967.                 @fk_catalog_name,
  18968.                 @fk_table_schema,
  18969.                 @fk_table_name >
  18970.     order by 7,8,9,1,2,3,13
  18971. go
  18972.  
  18973. grant execute on sp_foreign_keys_rowset to public
  18974. go
  18975.  
  18976. dump tran master with no_log
  18977. go
  18978. if (charindex('6.00', @@version) > 0)
  18979.     begin
  18980.     if (exists (select * from sysobjects
  18981.             where name = 'sp_foreign_keys_rowset' and type = 'P '))
  18982.         begin
  18983.         drop procedure sp_foreign_keys_rowset
  18984.         dump tran master with no_log
  18985.         end
  18986.     end
  18987. go
  18988.  
  18989.  
  18990. print ''
  18991. print 'creating sp_indexes_rowset'
  18992. go
  18993.  
  18994. /*    6.0 and 6.5 version */
  18995. create procedure sp_indexes_rowset
  18996.     (
  18997.     @table_name    varchar(255), 
  18998.     @index_name    varchar(255) = null,
  18999.     @table_schema    varchar(255) = null     
  19000.     )
  19001. as
  19002.     select    TABLE_CATALOG        = db_name(),
  19003.         TABLE_SCHEMA        = user_name(o.uid),
  19004.         TABLE_NAME        = o.name,
  19005.         INDEX_CATALOG        = db_name(),        
  19006.         INDEX_SCHEMA        = user_name(o.uid),
  19007.         INDEX_NAME        = x.name,
  19008.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19009.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19010.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19011.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19012.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19013.         INITIAL_SIZE        = convert(int,null),
  19014.         NULLS            = convert(int,null),
  19015.         SORT_BOOKMARKS        = convert(bit,0),
  19016.         AUTO_UPDATE        = convert(bit,1),
  19017.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19018.         ORDINAL_POSITION     = convert(int,
  19019.                        (
  19020.                         select count(*)
  19021.                         from syscolumns sc
  19022.                         where sc.id     =  c.id
  19023.                           AND sc.number =  c.number
  19024.                           AND sc.colid  <= c.colid
  19025.                         )),
  19026.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  19027.         COLUMN_GUID        = convert(binary(16),null),
  19028.         COLUMN_PROPID        = convert(int,null),
  19029.         COLLATION    = convert(smallint, 1 /* DB_COLLATION_ASC */),
  19030.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19031.         PAGES            = convert(int, x.dpages),
  19032.         FILTER_CONDITION    = convert(varchar(1),null),
  19033.         INTEGRATED        = convert(bit,(x.status & 16)/16)
  19034.         
  19035.     from    sysobjects o, sysindexes x, syscolumns c, sysusers u
  19036.     where    o.type in ('U')
  19037.     and     o.name = @table_name
  19038.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19039.     and    (@index_name is null or @index_name = x.name)
  19040.     and     x.id = o.id
  19041.     and     x.id = c.id
  19042.     and      c.colid < x.keycnt+(x.status&16)/16
  19043.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  19044.     and     (
  19045.         suser_id() = 1     /* User is the System Administrator */
  19046.         or o.uid = user_id()     /* User created the object */
  19047.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  19048.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  19049.             from sysprotects p
  19050.             where p.id = o.id
  19051.             /* get rows for public,current user,user's group */
  19052.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  19053.             /* check for SELECT,EXECUTE privilege */
  19054.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  19055.             ) = 1    /* final magic...compare Grants      */
  19056.            )
  19057.     order by 8 desc, 4, 5, 6, 17
  19058. go
  19059. dump tran master with no_log
  19060. go
  19061. create procedure sp_indexes_rowset;2
  19062.     (
  19063.     @index_name    varchar(255) = null,
  19064.     @table_schema    varchar(255) = null     
  19065.     )
  19066. as
  19067.     select    TABLE_CATALOG        = db_name(),
  19068.         TABLE_SCHEMA        = user_name(o.uid),
  19069.         TABLE_NAME        = o.name,
  19070.         INDEX_CATALOG        = db_name(),        
  19071.         INDEX_SCHEMA        = user_name(o.uid),
  19072.         INDEX_NAME        = x.name,
  19073.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19074.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19075.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19076.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19077.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19078.         INITIAL_SIZE        = convert(int,null),
  19079.         NULLS            = convert(int,null),
  19080.         SORT_BOOKMARKS        = convert(bit,0),
  19081.         AUTO_UPDATE        = convert(bit,1),
  19082.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19083.         ORDINAL_POSITION     = convert(int,
  19084.                        (
  19085.                         select count(*)
  19086.                         from syscolumns sc
  19087.                         where sc.id     =  c.id
  19088.                           AND sc.number =  c.number
  19089.                           AND sc.colid  <= c.colid
  19090.                         )),
  19091.         COLUMN_NAME        = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
  19092.         COLUMN_GUID        = convert(binary(16),null),
  19093.         COLUMN_PROPID        = convert(int,null),
  19094.         COLLATION    = convert(smallint, 1 /* DB_COLLATION_ASC */),
  19095.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19096.         PAGES            = convert(int, x.dpages),
  19097.         FILTER_CONDITION    = convert(varchar(1),null),
  19098.         INTEGRATED        = convert(bit,(x.status & 16)/16) 
  19099.         
  19100.     from    sysobjects o, sysindexes x, syscolumns c, sysusers u
  19101.     where    o.type in ('U')
  19102.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19103.     and    (@index_name is null or @index_name = x.name)
  19104.     and     x.id = o.id
  19105.     and     x.id = c.id
  19106.     and      c.colid < x.keycnt+(x.status&16)/16
  19107.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  19108.     and     (
  19109.         suser_id() = 1     /* User is the System Administrator */
  19110.         or o.uid = user_id()     /* User created the object */
  19111.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  19112.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  19113.             from sysprotects p
  19114.             where p.id = o.id
  19115.             /* get rows for public,current user,user's group */
  19116.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  19117.             /* check for SELECT,EXECUTE privilege */
  19118.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  19119.             ) = 1    /* final magic...compare Grants      */
  19120.            )
  19121.     order by 8 desc, 4, 5, 6, 17
  19122. go
  19123. dump tran master with no_log
  19124. go
  19125.  
  19126. if (charindex('7.00', @@version) > 0 or
  19127.     charindex('8.00', @@version) > 0)
  19128.     drop procedure sp_indexes_rowset
  19129. else
  19130. begin
  19131.     print ''
  19132.     print ''
  19133.     print 'Warning:'
  19134.     print 'you are installing the stored procedures '
  19135.     print 'on a pre 7.0 SQL Server.'
  19136.     print 'Ignore the following errors.'
  19137. end
  19138. go
  19139.  
  19140. /*    7.0 version */
  19141. create procedure sp_indexes_rowset
  19142.     (
  19143.     @table_name    sysname, 
  19144.     @index_name    sysname = null,
  19145.     @table_schema    sysname = null     
  19146.     )
  19147. as
  19148.     select    TABLE_CATALOG        = db_name(),
  19149.         TABLE_SCHEMA        = user_name(o.uid),
  19150.         TABLE_NAME        = o.name,
  19151.         INDEX_CATALOG        = db_name(),        
  19152.         INDEX_SCHEMA        = user_name(o.uid),
  19153.         INDEX_NAME        = x.name,
  19154.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19155.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19156.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19157.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19158.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19159.         INITIAL_SIZE        = convert(int,null),
  19160.         NULLS            = convert(int,null),
  19161.         SORT_BOOKMARKS        = convert(bit,0),
  19162.         AUTO_UPDATE        = convert(bit,1),
  19163.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19164.         ORDINAL_POSITION     = convert(int, xk.keyno),
  19165.         COLUMN_NAME        = c.name,
  19166.         COLUMN_GUID        = convert(uniqueidentifier,null),
  19167.         COLUMN_PROPID        = convert(int,null),
  19168.         COLLATION    = convert(smallint, 1 /* DB_COLLATION_ASC */),
  19169.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19170.         PAGES            = convert(int, x.dpages),
  19171.         FILTER_CONDITION    = convert(nvarchar(1),null),
  19172.         INTEGRATED        = convert(bit,(x.status & 16)/16) 
  19173.         
  19174.     from    sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
  19175.     where    o.type in ('U')
  19176.     and     o.name = @table_name
  19177.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19178.     and    (@index_name is null or @index_name = x.name)
  19179.     and    x.id = o.id
  19180.     and    o.id = c.id
  19181.     and    o.id = xk.id
  19182.     and    x.indid = xk.indid
  19183.     and    c.colid = xk.colid
  19184.     and    xk.keyno <= x.keycnt
  19185.     and    permissions(o.id, c.name) <> 0
  19186.     and     (x.status&32) = 0  -- No hypothetical indexes
  19187.     order by 8 desc, 4, 5, 6, 17
  19188. go
  19189. dump tran master with no_log
  19190. go
  19191. create procedure sp_indexes_rowset;2
  19192.     (
  19193.     @index_name    sysname = null,
  19194.     @table_schema    sysname = null     
  19195.     )
  19196. as
  19197.     select    TABLE_CATALOG        = db_name(),
  19198.         TABLE_SCHEMA        = user_name(o.uid),
  19199.         TABLE_NAME        = o.name,
  19200.         INDEX_CATALOG        = db_name(),        
  19201.         INDEX_SCHEMA        = user_name(o.uid),
  19202.         INDEX_NAME        = x.name,
  19203.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19204.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19205.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19206.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19207.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19208.         INITIAL_SIZE        = convert(int,null),
  19209.         NULLS            = convert(int,null),
  19210.         SORT_BOOKMARKS        = convert(bit,0),
  19211.         AUTO_UPDATE        = convert(bit,1),
  19212.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19213.         ORDINAL_POSITION     = convert(int, xk.keyno),
  19214.         COLUMN_NAME        = c.name,
  19215.         COLUMN_GUID        = convert(uniqueidentifier,null),
  19216.         COLUMN_PROPID        = convert(int,null),
  19217.         COLLATION    = convert(smallint, 1 /* DB_COLLATION_ASC */),
  19218.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19219.         PAGES            = convert(int, x.dpages),
  19220.         FILTER_CONDITION    = convert(nvarchar(1),null),
  19221.         INTEGRATED        = convert(bit,(x.status & 16)/16) 
  19222.         
  19223.     from    sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
  19224.     where    o.type in ('U')
  19225.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19226.     and    (@index_name is null or @index_name = x.name)
  19227.     and    x.id = o.id
  19228.     and    o.id = c.id
  19229.     and    o.id = xk.id
  19230.     and    x.indid = xk.indid
  19231.     and    c.colid = xk.colid
  19232.     and    xk.keyno <= x.keycnt
  19233.     and    permissions(o.id, c.name) <> 0
  19234.     and    (x.status&32) = 0  -- No hypothetical indexes
  19235.     order by 8 desc, 4, 5, 6, 17
  19236. go
  19237. dump tran master with no_log
  19238. go
  19239. create procedure sp_indexes_rowset;5
  19240.     (
  19241.     @table_server        sysname,
  19242.     @table_catalog        sysname = null,
  19243.     @table_name        sysname = null,
  19244.     @index_name        sysname = null,
  19245.     @table_schema        sysname = null
  19246.     )
  19247. as
  19248.     select
  19249.         TABLE_CATALOG,    
  19250.         TABLE_SCHEMA,    
  19251.         TABLE_NAME,    
  19252.         INDEX_CATALOG,        
  19253.         INDEX_SCHEMA,    
  19254.         INDEX_NAME,    
  19255.         PRIMARY_KEY,    
  19256.         "UNIQUE",    
  19257.         "CLUSTERED",    
  19258.         "TYPE",        
  19259.         FILL_FACTOR,    
  19260.         INITIAL_SIZE,    
  19261.         NULLS,        
  19262.         SORT_BOOKMARKS,    
  19263.         AUTO_UPDATE,    
  19264.         NULL_COLLATION,    
  19265.         ORDINAL_POSITION,
  19266.         COLUMN_NAME,    
  19267.         COLUMN_GUID,    
  19268.         COLUMN_PROPID,    
  19269.         COLLATION,    
  19270.         CARDINALITY,    
  19271.         PAGES,        
  19272.         FILTER_CONDITION
  19273.     --    INTEGRATED
  19274.     from master.dbo.SYSREMOTE_INDEXES <
  19275.                 @table_server,
  19276.                 @table_catalog,
  19277.                 @table_schema,
  19278.                 @index_name,
  19279.                 NULL,            /* TYPE (index type) */
  19280.                 @table_name >
  19281.     order by 8 desc, 4, 5, 6, 17
  19282. go
  19283.  
  19284. grant execute on sp_indexes_rowset to public
  19285. go
  19286.  
  19287. dump tran master with no_log
  19288. go
  19289.  
  19290. if (charindex('8.00', @@version) > 0)
  19291.     drop procedure sp_indexes_rowset
  19292. else
  19293. begin
  19294.     print ''
  19295.     print ''
  19296.     print 'Warning:'
  19297.     print 'you are installing the stored procedures '
  19298.     print 'on a pre 8.0 SQL Server.'
  19299.     print 'Ignore the following errors.'
  19300. end
  19301. go
  19302.  
  19303. /*    8.0 version */
  19304. create procedure sp_indexes_rowset
  19305.     (
  19306.     @table_name    sysname, 
  19307.     @index_name    sysname = null,
  19308.     @table_schema    sysname = null     
  19309.     )
  19310. as
  19311.     select    TABLE_CATALOG        = db_name(),
  19312.         TABLE_SCHEMA        = user_name(o.uid),
  19313.         TABLE_NAME        = o.name,
  19314.         INDEX_CATALOG        = db_name(),        
  19315.         INDEX_SCHEMA        = user_name(o.uid),
  19316.         INDEX_NAME        = x.name,
  19317.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19318.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19319.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19320.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19321.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19322.         INITIAL_SIZE        = convert(int,null),
  19323.         NULLS            = convert(int,null),
  19324.         SORT_BOOKMARKS        = convert(bit,0),
  19325.         AUTO_UPDATE        = convert(bit,1),
  19326.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19327.         ORDINAL_POSITION     = convert(int, xk.keyno),
  19328.         COLUMN_NAME        = c.name,
  19329.         COLUMN_GUID        = convert(uniqueidentifier,null),
  19330.         COLUMN_PROPID        = convert(int,null),
  19331.         COLLATION    = convert(smallint,
  19332.                         case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1
  19333.                         then 2        /* DB_COLLATION_DESC */ 
  19334.                         else 1        /* DB_COLLATION_ASC */ 
  19335.                         end),
  19336.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19337.         PAGES            = convert(int, x.dpages),
  19338.         FILTER_CONDITION    = convert(nvarchar(1),null),
  19339.         INTEGRATED        = convert(bit,(x.status & 16)/16) 
  19340.         
  19341.     from    sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
  19342.     where    o.type in ('U')
  19343.     and     o.name = @table_name
  19344.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19345.     and    (@index_name is null or @index_name = x.name)
  19346.     and    x.id = o.id
  19347.     and    o.id = c.id
  19348.     and    o.id = xk.id
  19349.     and    x.indid = xk.indid
  19350.     and    c.colid = xk.colid
  19351.     and    xk.keyno <= x.keycnt
  19352.     and    permissions(o.id, c.name) <> 0
  19353.     and     (x.status&32) = 0  -- No hypothetical indexes
  19354.     order by 8 desc, 4, 5, 6, 17
  19355. go
  19356. dump tran master with no_log
  19357. go
  19358. create procedure sp_indexes_rowset;2
  19359.     (
  19360.     @index_name    sysname = null,
  19361.     @table_schema    sysname = null     
  19362.     )
  19363. as
  19364.     select    TABLE_CATALOG        = db_name(),
  19365.         TABLE_SCHEMA        = user_name(o.uid),
  19366.         TABLE_NAME        = o.name,
  19367.         INDEX_CATALOG        = db_name(),        
  19368.         INDEX_SCHEMA        = user_name(o.uid),
  19369.         INDEX_NAME        = x.name,
  19370.         PRIMARY_KEY        = convert(bit,(x.status & 0x800)/0x800),
  19371.         "UNIQUE"        = convert(bit,(x.status & 2)/2),
  19372.         "CLUSTERED"        = convert(bit,(x.status & 16)/16),
  19373.         "TYPE"            = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
  19374.         FILL_FACTOR        = convert(int, x.OrigFillFactor),
  19375.         INITIAL_SIZE        = convert(int,null),
  19376.         NULLS            = convert(int,null),
  19377.         SORT_BOOKMARKS        = convert(bit,0),
  19378.         AUTO_UPDATE        = convert(bit,1),
  19379.         NULL_COLLATION        = convert(int,4 /*DBPROPVAL_NC_LOW*/),
  19380.         ORDINAL_POSITION     = convert(int, xk.keyno),
  19381.         COLUMN_NAME        = c.name,
  19382.         COLUMN_GUID        = convert(uniqueidentifier,null),
  19383.         COLUMN_PROPID        = convert(int,null),
  19384.         COLLATION    = convert(smallint,
  19385.                         case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1
  19386.                         then 2        /* DB_COLLATION_DESC */ 
  19387.                         else 1        /* DB_COLLATION_ASC */ 
  19388.                         end),
  19389.         CARDINALITY        = case when (x.status & 2) = 2 then x.rows else null end,
  19390.         PAGES            = convert(int, x.dpages),
  19391.         FILTER_CONDITION    = convert(nvarchar(1),null),
  19392.         INTEGRATED        = convert(bit,(x.status & 16)/16) 
  19393.         
  19394.     from    sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
  19395.     where    o.type in ('U')
  19396.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19397.     and    (@index_name is null or @index_name = x.name)
  19398.     and    x.id = o.id
  19399.     and    o.id = c.id
  19400.     and    o.id = xk.id
  19401.     and    x.indid = xk.indid
  19402.     and    c.colid = xk.colid
  19403.     and    xk.keyno <= x.keycnt
  19404.     and    permissions(o.id, c.name) <> 0
  19405.     and    (x.status&32) = 0  -- No hypothetical indexes
  19406.     order by 8 desc, 4, 5, 6, 17
  19407. go
  19408. dump tran master with no_log
  19409. go
  19410. create procedure sp_indexes_rowset;5
  19411.     (
  19412.     @table_server        sysname,
  19413.     @table_catalog        sysname = null,
  19414.     @table_name        sysname = null,
  19415.     @index_name        sysname = null,
  19416.     @table_schema        sysname = null
  19417.     )
  19418. as
  19419.     select
  19420.         TABLE_CATALOG,    
  19421.         TABLE_SCHEMA,    
  19422.         TABLE_NAME,    
  19423.         INDEX_CATALOG,        
  19424.         INDEX_SCHEMA,    
  19425.         INDEX_NAME,    
  19426.         PRIMARY_KEY,    
  19427.         "UNIQUE",    
  19428.         "CLUSTERED",    
  19429.         "TYPE",        
  19430.         FILL_FACTOR,    
  19431.         INITIAL_SIZE,    
  19432.         NULLS,        
  19433.         SORT_BOOKMARKS,    
  19434.         AUTO_UPDATE,    
  19435.         NULL_COLLATION,    
  19436.         ORDINAL_POSITION,
  19437.         COLUMN_NAME,    
  19438.         COLUMN_GUID,    
  19439.         COLUMN_PROPID,    
  19440.         COLLATION,    
  19441.         CARDINALITY,    
  19442.         PAGES,        
  19443.         FILTER_CONDITION
  19444.     --    INTEGRATED
  19445.     from master.dbo.SYSREMOTE_INDEXES <
  19446.                 @table_server,
  19447.                 @table_catalog,
  19448.                 @table_schema,
  19449.                 @index_name,
  19450.                 NULL,            /* TYPE (index type) */
  19451.                 @table_name >
  19452.     order by 8 desc, 4, 5, 6, 17
  19453. go
  19454.  
  19455. grant execute on sp_indexes_rowset to public
  19456. go
  19457.  
  19458. dump tran master with no_log
  19459. go
  19460. if (charindex('6.00', @@version) > 0)
  19461.     begin
  19462.     if (exists (select * from sysobjects
  19463.             where name = 'sp_indexes_rowset' and type = 'P '))
  19464.         begin
  19465.         drop procedure sp_indexes_rowset
  19466.         dump tran master with no_log
  19467.         end
  19468.     end
  19469. go
  19470.  
  19471.  
  19472. print ''
  19473. print 'creating sp_primary_keys_rowset'
  19474. go
  19475.  
  19476. /*    Procedure for 6.0 and 6.5 servers */
  19477. create procedure sp_primary_keys_rowset
  19478.     (
  19479.        @table_name        varchar(255),
  19480.     @table_schema         varchar(244) = null
  19481.     )
  19482. as
  19483.     select    TABLE_CATALOG    = db_name(),
  19484.             TABLE_SCHEMA    = user_name(o.uid),
  19485.             TABLE_NAME        = o.name,    
  19486.             COLUMN_NAME        = c.name,
  19487.             COLUMN_GUID        = convert(binary(16),null),
  19488.             COLUMN_PROPID    = convert(int,null),
  19489.             ORDINAL            = convert(int,c1.colid),
  19490.             PK_NAME            = i.name
  19491.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1, sysusers u
  19492.     where    o.type in ('U')
  19493.     and     o.name = @table_name
  19494.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19495.     and     o.id = c.id
  19496.     and     o.id = i.id
  19497.     and     (i.status & 0x800) = 0x800
  19498.     and     c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19499.     and     c1.id = c.id
  19500.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19501.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  19502.     and     (
  19503.         suser_id() = 1     /* User is the System Administrator */
  19504.         or o.uid = user_id()     /* User created the object */
  19505.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  19506.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  19507.             from sysprotects p
  19508.             where p.id = o.id
  19509.             /* get rows for public,current user,user's group */
  19510.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  19511.             /* check for SELECT,EXECUTE privilege */
  19512.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  19513.             ) = 1    /* final magic...compare Grants      */
  19514.            )
  19515.     order by 2, 3
  19516. go
  19517. dump tran master with no_log
  19518. go
  19519. create procedure sp_primary_keys_rowset;2
  19520.     (
  19521.      @table_schema         varchar(244) = null
  19522.     )
  19523. as
  19524.     select    TABLE_CATALOG    = db_name(),
  19525.             TABLE_SCHEMA    = user_name(o.uid),
  19526.             TABLE_NAME        = o.name,    
  19527.             COLUMN_NAME        = c.name,
  19528.             COLUMN_GUID        = convert(binary(16),null),
  19529.             COLUMN_PROPID    = convert(int,null),
  19530.             ORDINAL            = convert(int,c1.colid),
  19531.             PK_NAME            = i.name
  19532.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1, sysusers u
  19533.     where    o.type in ('U')
  19534.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19535.     and     o.id = c.id
  19536.     and     o.id = i.id
  19537.     and     (i.status & 0x800) = 0x800
  19538.     and     c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19539.     and     c1.id = c.id
  19540.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19541.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  19542.     and     (
  19543.         suser_id() = 1     /* User is the System Administrator */
  19544.         or o.uid = user_id()     /* User created the object */
  19545.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  19546.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  19547.             from sysprotects p
  19548.             where p.id = o.id
  19549.             /* get rows for public,current user,user's group */
  19550.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  19551.             /* check for SELECT,EXECUTE privilege */
  19552.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  19553.             ) = 1    /* final magic...compare Grants      */
  19554.            )
  19555.     order by 2, 3
  19556. go
  19557.  
  19558. if (charindex('7.00', @@version) = 0 and
  19559.     charindex('8.00', @@version) = 0)
  19560. begin
  19561.     print ''
  19562.     print ''
  19563.     print 'Warning:'
  19564.     print 'you are installing the stored procedures '
  19565.     print 'on a pre 8.0 SQL Server.'
  19566.     print 'Ignore the following errors.'
  19567. end
  19568. else
  19569.     drop proc sp_primary_keys_rowset
  19570. go
  19571.  
  19572. /*    Procedure for 8.0 servers */
  19573. create procedure sp_primary_keys_rowset
  19574.     (
  19575.        @table_name        sysname,
  19576.     @table_schema         sysname = null
  19577.     )
  19578. as
  19579.     select    TABLE_CATALOG    = db_name(),
  19580.             TABLE_SCHEMA    = user_name(o.uid),
  19581.             TABLE_NAME        = o.name,    
  19582.             COLUMN_NAME        = c.name,
  19583.             COLUMN_GUID        = convert(uniqueidentifier,null),
  19584.             COLUMN_PROPID    = convert(int,null),
  19585.             ORDINAL            = convert(int,c1.colid),
  19586.             PK_NAME            = i.name
  19587.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  19588.     where    o.type in ('U')
  19589.     and     o.name = @table_name
  19590.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19591.     and     o.id = c.id
  19592.     and     o.id = i.id
  19593.     and     (i.status & 0x800) = 0x800
  19594.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19595.     and     c1.id = c.id
  19596.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19597.     and    permissions(o.id) <> 0
  19598.     order by 2, 3
  19599. go
  19600. dump tran master with no_log
  19601. go
  19602. create procedure sp_primary_keys_rowset;2
  19603.     (
  19604.      @table_schema     sysname = null
  19605.     )
  19606. as
  19607.     select    TABLE_CATALOG    = db_name(),
  19608.             TABLE_SCHEMA    = user_name(o.uid),
  19609.             TABLE_NAME        = o.name,    
  19610.             COLUMN_NAME        = c.name,
  19611.             COLUMN_GUID        = convert(uniqueidentifier,null),
  19612.             COLUMN_PROPID    = convert(int,null),
  19613.             ORDINAL            = convert(int,c1.colid),
  19614.             PK_NAME            = i.name
  19615.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  19616.     where    o.type in ('U')
  19617.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19618.     and     o.id = c.id
  19619.     and     o.id = i.id
  19620.     and     (i.status & 0x800) = 0x800
  19621.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19622.     and     c1.id = c.id
  19623.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19624.     and    permissions(o.id) <> 0
  19625.     order by 2, 3
  19626. go
  19627. dump tran master with no_log
  19628. go
  19629. create procedure sp_primary_keys_rowset;3
  19630.     (
  19631.        @table_name        sysname = null,
  19632.     @table_schema         sysname = null
  19633.     )
  19634. as
  19635. IF @table_name is not NULL
  19636.     BEGIN
  19637.     select    TABLE_CATALOG    = db_name(),
  19638.             TABLE_SCHEMA    = user_name(o.uid),
  19639.             TABLE_NAME        = o.name,    
  19640.             COLUMN_NAME        = c.name,
  19641.             COLUMN_GUID        = convert(uniqueidentifier,null),
  19642.             COLUMN_PROPID    = convert(int,null),
  19643.             ORDINAL            = convert(int,c1.colid),
  19644.             PK_NAME            = i.name
  19645.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  19646.     where    o.type in ('U')
  19647.     and     o.name = @table_name
  19648.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19649.     and     o.id = c.id
  19650.     and     o.id = i.id
  19651.     and     (i.status & 0x800) = 0x800
  19652.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19653.     and     c1.id = c.id
  19654.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19655.     and    permissions(o.id) <> 0
  19656.     END
  19657. ELSE
  19658.     BEGIN
  19659.     select    TABLE_CATALOG    = db_name(),
  19660.             TABLE_SCHEMA    = user_name(o.uid),
  19661.             TABLE_NAME        = o.name,    
  19662.             COLUMN_NAME        = c.name,
  19663.             COLUMN_GUID        = convert(uniqueidentifier,null),
  19664.             COLUMN_PROPID    = convert(int,null),
  19665.             ORDINAL            = convert(int,c1.colid),
  19666.             PK_NAME            = i.name
  19667.     from    sysindexes i, syscolumns c, sysobjects o, syscolumns c1
  19668.     where    o.type in ('U')
  19669.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  19670.     and     o.id = c.id
  19671.     and     o.id = i.id
  19672.     and     (i.status & 0x800) = 0x800
  19673.     and     c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, c1.colid)
  19674.     and     c1.id = c.id
  19675.     and     c1.colid <= i.keycnt    /* create rows from 1 to keycnt */
  19676.     and    permissions(o.id) <> 0
  19677.     END
  19678. go
  19679. dump tran master with no_log
  19680. go
  19681. create procedure sp_primary_keys_rowset;5
  19682.     (
  19683.     @table_server        sysname,
  19684.     @table_catalog        sysname = null,
  19685.     @table_name            sysname = null,
  19686.     @table_schema        sysname = null
  19687.     )
  19688. as
  19689.     select
  19690.         TABLE_CATALOG,    
  19691.         TABLE_SCHEMA,    
  19692.         TABLE_NAME,    
  19693.         COLUMN_NAME,    
  19694.         COLUMN_GUID,    
  19695.         COLUMN_PROPID,    
  19696.         ORDINAL
  19697.         --PK_NAME        
  19698.     from master.dbo.SYSREMOTE_PRIMARY_KEYS <
  19699.                 @table_server,
  19700.                 @table_catalog,
  19701.                 @table_schema,
  19702.                 @table_name >
  19703.     order by 1,2,3
  19704. go
  19705.  
  19706. grant execute on sp_primary_keys_rowset to public
  19707. go
  19708.  
  19709. dump tran master with no_log
  19710. go
  19711. if (charindex('6.00', @@version) > 0)
  19712.     begin
  19713.     if (exists (select * from sysobjects
  19714.             where name = 'sp_primary_keys_rowset' and type = 'P '))
  19715.         begin
  19716.         drop procedure sp_primary_keys_rowset
  19717.         dump tran master with no_log
  19718.         end
  19719.     end
  19720. go
  19721.  
  19722.  
  19723. print ''
  19724. print 'creating sp_provider_types_rowset'
  19725. go
  19726.  
  19727. /*    Procedure for 6.0 and 6.50 servers */
  19728. create proc sp_provider_types_rowset
  19729.     (
  19730.     @data_type     smallint = null,
  19731.     @best_match    tinyint  = null
  19732.     )
  19733. as
  19734.     select
  19735.         TYPE_NAME         = case when t.usertype = 80 then t.name 
  19736.                         else d.type_name 
  19737.                         end,
  19738.         DATA_TYPE         = d.oledb_data_type,                            
  19739.         COLUMN_SIZE        = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  19740.                             then @@max_precision
  19741.                             else coalesce(d.column_size,d.data_precision,t.prec) end,
  19742.         LITERAL_PREFIX         = d.literal_prefix,
  19743.         LITERAL_SUFFIX         = d.literal_suffix,
  19744.         CREATE_PARAMS         = convert(varchar(32),e.CREATE_PARAMS),
  19745.         IS_NULLABLE        = t.allownulls,
  19746.         CASE_SENSITIVE        = d.case_sensitive,
  19747.         SEARCHABLE         = d.searchable,
  19748.         UNSIGNED_ATTRIBUTE    = d.unsigned_attribute,
  19749.         FIXED_PREC_SCALE    = d.fixed_prec_scale,
  19750.         AUTO_UNIQUE_VALUE    = d.auto_unique_value, 
  19751.         LOCAL_TYPE_NAME        = case    when t.usertype = 80 then t.name 
  19752.                         else d.local_type_name
  19753.                         end,
  19754.         MINIMUM_SCALE        = convert(smallint,
  19755.                         case 
  19756.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0 
  19757.                         else null 
  19758.                         end),
  19759.         MAXIMUM_SCALE        = convert(smallint,
  19760.                         case 
  19761.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  19762.                         then @@max_precision
  19763.                         else null 
  19764.                         end),
  19765.         GUID            = convert(binary(16),null),
  19766.         TYPELIB            = convert(varchar(1),null),
  19767.         VERSION            = convert(varchar(1),null),
  19768.         IS_LONG            = d.is_long,
  19769.         BEST_MATCH        = case when t.usertype = 80
  19770.                         then convert(bit,0)
  19771.                         else d.best_match
  19772.                         end,
  19773.         IS_FIXEDLENGTH        = convert(bit, 
  19774.                         case when d.fixlen is null then 0 else 1 end)
  19775.     from     master.dbo.spt_provider_types d, master.dbo.spt_datatype_info_ext e, systypes t
  19776.     where    d.ss_dtype = t.type 
  19777.     and    t.usertype <= 100
  19778.     and    t.usertype <> 18 /* sysname */
  19779.     and    (case when t.usertype = 80 /* TIMESTAMP */ then 1 else 0 end 
  19780.             = case when d.type_name = 'timestamp' then 1 else 0 end)
  19781.     and     t.usertype *= e.user_type 
  19782.     and     e.AUTO_INCREMENT = 0
  19783.     and     t.type not in (111,109,38,110,55,63)    /* get rid of nullable types */
  19784.     and    (@data_type is null or d.oledb_data_type = @data_type)
  19785.     and    (@best_match is null or d.best_match = @best_match)
  19786.     order by 2
  19787. go
  19788. dump tran master with no_log
  19789. go
  19790.  
  19791. if (charindex('7.00', @@version) = 0 and
  19792.     charindex('8.00', @@version) = 0)
  19793. begin
  19794.     print ''
  19795.     print ''
  19796.     print 'Warning:'
  19797.     print 'you are installing the stored procedures '
  19798.     print 'on a pre 8.0 SQL Server.'
  19799.     print 'Ignore the following errors.'
  19800. end
  19801. else
  19802.     drop proc sp_provider_types_rowset
  19803. go
  19804.  
  19805. /*    Procedure for 8.0 server */
  19806. create proc sp_provider_types_rowset
  19807.     (
  19808.     @data_type     smallint = null,
  19809.     @best_match    tinyint  = null
  19810.     )
  19811. as
  19812.     select
  19813.         TYPE_NAME         = case    when t.usertype = 80 then t.name 
  19814.                         else d.type_name 
  19815.                         end,
  19816.         DATA_TYPE         = d.oledb_data_type,                            
  19817.  
  19818.  
  19819.         COLUMN_SIZE        = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  19820.                             then @@max_precision
  19821.                             else coalesce(d.column_size,d.data_precision,t.prec) end,
  19822.         LITERAL_PREFIX         = d.literal_prefix,
  19823.         LITERAL_SUFFIX         = d.literal_suffix,
  19824.         CREATE_PARAMS         = convert(nvarchar(32),e.CREATE_PARAMS),
  19825.         IS_NULLABLE        = t.allownulls,
  19826.         CASE_SENSITIVE        = d.case_sensitive,
  19827.         SEARCHABLE         = d.searchable,
  19828.         UNSIGNED_ATTRIBUTE    = d.unsigned_attribute,
  19829.         FIXED_PREC_SCALE    = d.fixed_prec_scale,
  19830.         AUTO_UNIQUE_VALUE    = d.auto_unique_value, 
  19831.         LOCAL_TYPE_NAME        = case    when t.usertype = 80 then t.name 
  19832.                         else d.local_type_name
  19833.                         end,
  19834.         MINIMUM_SCALE        = convert(smallint,
  19835.                         case 
  19836.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0 
  19837.                         else null 
  19838.                         end),
  19839.         MAXIMUM_SCALE        = convert(smallint,
  19840.                         case 
  19841.                         when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ 
  19842.                         then @@max_precision
  19843.                         else null 
  19844.                         end),
  19845.         GUID            = convert(uniqueidentifier,null),
  19846.         TYPELIB            = convert(nvarchar(1),null),
  19847.         VERSION            = convert(nvarchar(1),null),
  19848.         IS_LONG            = d.is_long,
  19849.         BEST_MATCH        = case    when t.usertype = 80
  19850.                         then convert(bit,0)
  19851.                         else d.best_match
  19852.                         end,
  19853.         IS_FIXEDLENGTH        = convert(bit, 
  19854.                         case when d.fixlen is null then 0 else 1 end)
  19855.  
  19856.     from master.dbo.spt_provider_types d
  19857.         INNER JOIN master.dbo.systypes t on d.ss_dtype = t.xtype
  19858.         LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
  19859.             t.xusertype = e.user_type
  19860.             and e.AUTO_INCREMENT = 0
  19861.     where    (@data_type is null or d.oledb_data_type = @data_type)
  19862.     and    (@best_match is null or d.best_match = @best_match)    
  19863.     and    t.usertype <= 255
  19864.     and    t.usertype <> 18 /* sysname */
  19865.     order by 2
  19866. go
  19867.  
  19868. grant execute on sp_provider_types_rowset to public
  19869. go
  19870.  
  19871. dump tran master with no_log
  19872. go
  19873. if (charindex('6.00', @@version) > 0)
  19874.     begin
  19875.     if (exists (select * from sysobjects
  19876.         where name = 'sp_provider_types_rowset' and type = 'P '))
  19877.         begin
  19878.         drop procedure sp_provider_types_rowset
  19879.         dump tran master with no_log
  19880.         end
  19881.     end
  19882. go
  19883.  
  19884.  
  19885. print ''
  19886. print 'creating sp_procedure_params_rowset'
  19887. go
  19888.  
  19889. /*    Procedure for 6.0 and 6.50 servers */
  19890. create procedure sp_procedure_params_rowset
  19891.     (
  19892.        @procedure_name        varchar(255) = null,
  19893.     @group_number        int = null,
  19894.     @procedure_schema     varchar(255) = null,
  19895.     @parameter_name        varchar(255) = null
  19896.     )
  19897. as
  19898. IF @procedure_name is not null
  19899.     BEGIN
  19900.     select
  19901.         PROCEDURE_CATALOG     = db_name(),
  19902.         PROCEDURE_SCHEMA     = user_name(o.uid),
  19903.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  19904.         PARAMETER_NAME         = c.name,
  19905.         ORDINAL_POSITION     = convert(smallint, c.colid),
  19906.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  19907.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  19908.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  19909.         IS_NULLABLE        = convert(bit,
  19910.                         case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/ 
  19911.                         then 0 else 1
  19912.                         end),
  19913.         DATA_TYPE        = d.oledb_data_type,
  19914.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  19915.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  19916.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  19917.                         then coalesce(d.column_size,c.length)
  19918.                         else null 
  19919.                         end),
  19920.         CHARACTER_OCTET_LENGTH    = convert(int,
  19921.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  19922.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  19923.                         then coalesce(d.column_size,c.length)
  19924.                         else null 
  19925.                         end),
  19926.         NUMERIC_PRECISION    = convert(smallint,
  19927.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec 
  19928.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  19929.                             then d.data_precision else null end),
  19930.         NUMERIC_SCALE        = convert(smallint, 
  19931.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  19932.         DESCRIPTION        = convert(varchar(1),null),
  19933.         TYPE_NAME        = d.type_name,
  19934.         LOCAL_TYPE_NAME        = d.local_type_name
  19935.     
  19936.     from
  19937.         syscolumns c,
  19938.         sysobjects o,
  19939.         master.dbo.spt_provider_types d,
  19940.         systypes t
  19941.     where
  19942.         o.name = @procedure_name
  19943.     and    o.type = 'P'                            /* Just Procedures */
  19944.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  19945.     and    o.id = c.id
  19946.     and    c.number = @group_number
  19947.     and    c.type = d.ss_dtype
  19948.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  19949.     and    c.usertype = t.usertype
  19950.     and    (t.usertype != 80 or d.type_name='timestamp')
  19951.     and    (@parameter_name is null or @parameter_name = c.name)
  19952.     UNION ALL
  19953.     SELECT           /* return value row*/
  19954.         PROCEDURE_CATALOG     = db_name(),
  19955.         PROCEDURE_SCHEMA     = user_name(o.uid),
  19956.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  19957.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  19958.         ORDINAL_POSITION     = convert(smallint,0),
  19959.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  19960.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  19961.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  19962.         IS_NULLABLE        = convert(bit,0),
  19963.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  19964.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  19965.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  19966.         NUMERIC_PRECISION    = convert(smallint,10),
  19967.         NUMERIC_SCALE        = convert(smallint,null),
  19968.         DESCRIPTION        = convert(varchar(1),null),
  19969.         TYPE_NAME        = convert(sysname,'int'),
  19970.         LOCAL_TYPE_NAME        = convert(sysname,'int')
  19971.     from
  19972.         syscomments c,
  19973.         sysobjects o
  19974.     where
  19975.         o.name = @procedure_name
  19976.     and    o.type = 'P'                        /* Just Procedures */
  19977.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  19978.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  19979.     and    c.id = o.id
  19980.     and    c.number = @group_number
  19981.     and c.colid = 1
  19982.     order by 2, 3, 5
  19983.     END
  19984. ELSE
  19985.     BEGIN
  19986.     select
  19987.         PROCEDURE_CATALOG     = db_name(),
  19988.         PROCEDURE_SCHEMA     = user_name(o.uid),
  19989.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  19990.         PARAMETER_NAME         = c.name,
  19991.         ORDINAL_POSITION     = convert(smallint, c.colid),
  19992.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  19993.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  19994.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  19995.         IS_NULLABLE        = convert(bit,
  19996.                         case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/ 
  19997.                         then 0 else 1
  19998.                         end),
  19999.         DATA_TYPE        = d.oledb_data_type,
  20000.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20001.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20002.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20003.                         then coalesce(d.column_size,c.length)
  20004.                         else null 
  20005.                         end),
  20006.         CHARACTER_OCTET_LENGTH    = convert(int,
  20007.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20008.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20009.                         then coalesce(d.column_size,c.length)
  20010.                         else null 
  20011.                         end),
  20012.         NUMERIC_PRECISION    = convert(smallint,
  20013.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20014.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20015.                             then d.data_precision else null end),
  20016.         NUMERIC_SCALE        = convert(smallint, 
  20017.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20018.         DESCRIPTION        = convert(varchar(1),null),
  20019.         TYPE_NAME        = d.type_name,
  20020.         LOCAL_TYPE_NAME        = d.local_type_name
  20021.     
  20022.     from
  20023.         syscolumns c,
  20024.         sysobjects o,
  20025.         master.dbo.spt_provider_types d,
  20026.         systypes t
  20027.     where
  20028.         o.type = 'P'                            /* Just Procedures */
  20029.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20030.     and    o.id = c.id
  20031.     and    c.type = d.ss_dtype
  20032.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20033.     and    c.usertype = t.usertype
  20034.     and    (t.usertype != 80 or d.type_name='timestamp')
  20035.     and    (@parameter_name is null or @parameter_name = c.name)
  20036.     UNION ALL
  20037.     SELECT           /* return value row*/
  20038.         PROCEDURE_CATALOG     = db_name(),
  20039.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20040.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  20041.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20042.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20043.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20044.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  20045.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20046.         IS_NULLABLE        = convert(bit,0),
  20047.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20048.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20049.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20050.         NUMERIC_PRECISION    = convert(smallint,10),
  20051.         NUMERIC_SCALE        = convert(smallint,null),
  20052.         DESCRIPTION        = convert(varchar(1),null),
  20053.         TYPE_NAME        = convert(sysname,'int'),
  20054.         LOCAL_TYPE_NAME        = convert(sysname,'int')
  20055.     from
  20056.         syscomments c,
  20057.         sysobjects o
  20058.     where
  20059.         o.type = 'P'                        /* Just Procedures */
  20060.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20061.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20062.     and    c.id = o.id
  20063.     and     c.colid = 1
  20064.     order by 2, 3, 5
  20065.     END
  20066. go
  20067. dump tran master with no_log
  20068. go
  20069. create procedure sp_procedure_params_rowset;2
  20070.     (
  20071.       @handle            int output,
  20072.        @scrollopt        int output,
  20073.     @ccopt            int output,
  20074.     @rows            int output,
  20075.        @procedure_name        varchar(255) = null,
  20076.     @group_number        int = null,
  20077.     @procedure_schema     varchar(255) = null,
  20078.     @parameter_name        varchar(255) = null
  20079.     )
  20080. as
  20081.     declare @ret int
  20082.  
  20083.  
  20084. SET NOCOUNT ON
  20085.  
  20086.     create table #spprocparamrowset1
  20087.         (
  20088.         PROCEDURE_CATALOG     sysname not null,
  20089.         PROCEDURE_SCHEMA     sysname not null,
  20090.         PROCEDURE_NAME         varchar(35) not null,
  20091.         PARAMETER_NAME         sysname not null,
  20092.         ORDINAL_POSITION     smallint not null,
  20093.         PARAMETER_TYPE         smallint null,
  20094.         PARAMETER_HASDEFAULT    tinyint null,
  20095.         PARAMETER_DEFAULT    varchar(255) null,
  20096.         IS_NULLABLE        bit not null,
  20097.         DATA_TYPE        smallint null,
  20098.         CHARACTER_MAXIMUM_LENGTH int null,
  20099.         CHARACTER_OCTET_LENGTH    int null,
  20100.         NUMERIC_PRECISION    smallint null,
  20101.         NUMERIC_SCALE        smallint null,
  20102.         DESCRIPTION        varchar(1) null,
  20103.         TYPE_NAME        sysname null,
  20104.         LOCAL_TYPE_NAME        sysname null,
  20105.         )
  20106.  
  20107. IF @procedure_name is not null
  20108.     BEGIN
  20109.     insert into #spprocparamrowset1
  20110.     select
  20111.         PROCEDURE_CATALOG     = db_name(),
  20112.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20113.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  20114.         PARAMETER_NAME         = c.name,
  20115.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20116.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  20117.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20118.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20119.         IS_NULLABLE        = convert(bit,
  20120.                         case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/ 
  20121.                         then 0 else 1
  20122.                         end),
  20123.         DATA_TYPE        = d.oledb_data_type,
  20124.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20125.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20126.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20127.                         then coalesce(d.column_size,c.length)
  20128.                         else null 
  20129.                         end),
  20130.         CHARACTER_OCTET_LENGTH    = convert(int,
  20131.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20132.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20133.                         then coalesce(d.column_size,c.length)
  20134.                         else null 
  20135.                         end),
  20136.         NUMERIC_PRECISION    = convert(smallint,
  20137.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20138.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20139.                             then d.data_precision else null end),
  20140.         NUMERIC_SCALE        = convert(smallint, 
  20141.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20142.         DESCRIPTION        = convert(varchar(1),null),
  20143.         TYPE_NAME        = d.type_name,
  20144.         LOCAL_TYPE_NAME        = d.local_type_name
  20145.     
  20146.     from
  20147.         syscolumns c,
  20148.         sysobjects o,
  20149.         master.dbo.spt_provider_types d,
  20150.         systypes t
  20151.     where
  20152.         o.name = @procedure_name
  20153.     and    o.type = 'P'                            /* Just Procedures */
  20154.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20155.     and    o.id = c.id
  20156.     and    c.number = @group_number
  20157.     and    c.type = d.ss_dtype
  20158.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20159.     and    c.usertype = t.usertype
  20160.     and    (t.usertype != 80 or d.type_name='timestamp')
  20161.     and    (@parameter_name is null or @parameter_name = c.name)
  20162.     UNION ALL
  20163.     SELECT           /* return value row*/
  20164.         PROCEDURE_CATALOG     = db_name(),
  20165.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20166.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  20167.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20168.         ORDINAL_POSITION     = convert(smallint,0),
  20169.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20170.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  20171.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20172.         IS_NULLABLE        = convert(bit,0),
  20173.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20174.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20175.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20176.         NUMERIC_PRECISION    = convert(smallint,10),
  20177.         NUMERIC_SCALE        = convert(smallint,null),
  20178.         DESCRIPTION        = convert(varchar(1),null),
  20179.         TYPE_NAME        = convert(sysname,'int'),
  20180.         LOCAL_TYPE_NAME        = convert(sysname,'int')
  20181.     from
  20182.         syscomments c,
  20183.         sysobjects o
  20184.     where
  20185.         o.name = @procedure_name
  20186.     and    o.type = 'P'                        /* Just Procedures */
  20187.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20188.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20189.     and    c.id = o.id
  20190.     and    c.number = @group_number
  20191.     and c.colid = 1
  20192.     order by 2, 3, 5
  20193.     END
  20194. ELSE
  20195.     BEGIN
  20196.     insert into #spprocparamrowset1
  20197.     select
  20198.         PROCEDURE_CATALOG     = db_name(),
  20199.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20200.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  20201.         PARAMETER_NAME         = c.name,
  20202.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20203.         PARAMETER_TYPE         = convert(smallint, 1+((c.status/64)&1)),
  20204.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  20205.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20206.         IS_NULLABLE        = convert(bit,
  20207.                         case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/ 
  20208.                         then 0 else 1
  20209.                         end),
  20210.         DATA_TYPE        = d.oledb_data_type,
  20211.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20212.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20213.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20214.                         then coalesce(d.column_size,c.length)
  20215.                         else null 
  20216.                         end),
  20217.         CHARACTER_OCTET_LENGTH    = convert(int,
  20218.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20219.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20220.                         then coalesce(d.column_size,c.length)
  20221.                         else null 
  20222.                         end),
  20223.         NUMERIC_PRECISION    = convert(smallint,
  20224.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20225.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20226.                             then d.data_precision else null end),
  20227.         NUMERIC_SCALE        = convert(smallint, 
  20228.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20229.         DESCRIPTION        = convert(varchar(1),null),
  20230.         TYPE_NAME        = d.type_name,
  20231.         LOCAL_TYPE_NAME        = d.local_type_name
  20232.     
  20233.     from
  20234.         syscolumns c,
  20235.         sysobjects o,
  20236.         master.dbo.spt_provider_types d,
  20237.         systypes t
  20238.     where
  20239.         o.type = 'P'                            /* Just Procedures */
  20240.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20241.     and    o.id = c.id
  20242.     and    c.type = d.ss_dtype
  20243.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20244.     and    c.usertype = t.usertype
  20245.     and    (t.usertype != 80 or d.type_name='timestamp')
  20246.     and    (@parameter_name is null or @parameter_name = c.name)
  20247.     UNION ALL
  20248.     SELECT           /* return value row*/
  20249.         PROCEDURE_CATALOG     = db_name(),
  20250.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20251.         PROCEDURE_NAME         = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
  20252.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20253.         ORDINAL_POSITION     = convert(smallint,0),
  20254.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20255.         PARAMETER_HASDEFAULT    = convert(tinyint,0),
  20256.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20257.         IS_NULLABLE        = convert(bit,0),
  20258.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20259.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20260.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20261.         NUMERIC_PRECISION    = convert(smallint,10),
  20262.         NUMERIC_SCALE        = convert(smallint,null),
  20263.         DESCRIPTION        = convert(varchar(1),null),
  20264.         TYPE_NAME        = convert(sysname,'int'),
  20265.         LOCAL_TYPE_NAME        = convert(sysname,'int')
  20266.     from
  20267.         syscomments c,
  20268.         sysobjects o
  20269.     where
  20270.         o.type = 'P'                        /* Just Procedures */
  20271.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20272.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20273.     and    c.id = o.id
  20274.     and     c.colid = 1
  20275.     order by 2, 3, 5
  20276.     END
  20277.  
  20278.     exec @ret = sp_cursoropen @handle output, 'select * from #spprocparamrowset1',
  20279.         @scrollopt output, @ccopt output, @rows output
  20280.  
  20281.     drop table #spprocparamrowset1
  20282.        return isnull(@ret,0)
  20283. go
  20284. dump tran master with no_log
  20285. go
  20286. create procedure sp_procedure_params_rowset;3
  20287. as
  20288.     select
  20289.         PROCEDURE_CATALOG     = convert(sysname, ' '),
  20290.         PROCEDURE_SCHEMA     = convert(sysname, ' '),
  20291.         PROCEDURE_NAME         = convert(varchar(35), ' '),
  20292.         PARAMETER_NAME         = convert(sysname, ' '),
  20293.         ORDINAL_POSITION     = convert(smallint, 0),
  20294.         PARAMETER_TYPE         = convert(smallint, 0),
  20295.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20296.         PARAMETER_DEFAULT    = convert(varchar(255),null),
  20297.         IS_NULLABLE        = convert(bit, 0),
  20298.         DATA_TYPE        = convert(smallint, 0),
  20299.         CHARACTER_MAXIMUM_LENGTH= convert(int, 0),
  20300.         CHARACTER_OCTET_LENGTH    = convert(int, 0),
  20301.         NUMERIC_PRECISION    = convert(smallint, 0),
  20302.         NUMERIC_SCALE        = convert(smallint, 0),
  20303.         DESCRIPTION        = convert(varchar(1),null),
  20304.         TYPE_NAME        = convert(sysname,null),
  20305.         LOCAL_TYPE_NAME        = convert(sysname,null)
  20306.     where    1=0
  20307. go
  20308. dump tran master with no_log
  20309. go
  20310.  
  20311.  
  20312. if (charindex('7.00', @@version) > 0 or
  20313.     charindex('8.00', @@version) > 0)
  20314.     drop procedure sp_procedure_params_rowset
  20315. else
  20316. begin
  20317.     print ''
  20318.     print ''
  20319.     print 'Warning:'
  20320.     print 'you are installing the stored procedures '
  20321.     print 'on a pre 7.0 SQL Server.'
  20322.     print 'Ignore the following errors.'
  20323. end
  20324. go
  20325.  
  20326. /*    Procedure for 7.0 servers */
  20327. create procedure sp_procedure_params_rowset
  20328.     (
  20329.        @procedure_name        sysname,
  20330.     @group_number        int = 1,
  20331.     @procedure_schema     sysname = null,
  20332.     @parameter_name        sysname = null
  20333.     )
  20334. as
  20335.     select
  20336.         PROCEDURE_CATALOG     = db_name(),
  20337.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20338.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20339.         PARAMETER_NAME         = c.name,
  20340.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20341.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  20342.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20343.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20344.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  20345.         DATA_TYPE        = d.oledb_data_type,
  20346.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20347.                         case 
  20348.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20349.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20350.                         then coalesce(d.column_size,c.length)
  20351.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20352.                         then coalesce(d.column_size,c.length/2)
  20353.                         else null 
  20354.                         end),
  20355.         CHARACTER_OCTET_LENGTH    = convert(int,
  20356.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20357.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20358.                         then coalesce(d.column_size,c.length)
  20359.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20360.                         then coalesce(d.column_size*2,c.length)
  20361.                         else null 
  20362.                         end),
  20363.         NUMERIC_PRECISION    = convert(smallint,
  20364.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20365.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20366.                             then d.data_precision else null end),
  20367.         NUMERIC_SCALE        = convert(smallint, 
  20368.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20369.         DESCRIPTION        = convert(nvarchar(1),null),
  20370.         TYPE_NAME        = d.type_name,
  20371.         LOCAL_TYPE_NAME        = d.local_type_name
  20372.     
  20373.     from
  20374.         sysobjects o,
  20375.         syscolumns c,
  20376.         master.dbo.spt_provider_types d,
  20377.         systypes t
  20378.     where
  20379.         o.name = @procedure_name
  20380.     and    o.type = 'P'                            /* Just Procedures */
  20381.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20382.     and    o.id = c.id
  20383.     and    c.number = @group_number
  20384.     and    c.xtype = d.ss_dtype
  20385.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20386.     and    c.xusertype = t.xusertype
  20387.     and    (@parameter_name is null or @parameter_name = c.name)
  20388.     UNION ALL
  20389.     SELECT           /* return value row*/
  20390.         PROCEDURE_CATALOG     = db_name(),
  20391.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20392.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20393.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20394.         ORDINAL_POSITION     = convert(smallint,0),
  20395.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20396.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20397.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20398.         IS_NULLABLE        = convert(bit,0),
  20399.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20400.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20401.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20402.         NUMERIC_PRECISION    = convert(smallint,10),
  20403.         NUMERIC_SCALE        = convert(smallint,null),
  20404.         DESCRIPTION        = convert(nvarchar(1),null),
  20405.         TYPE_NAME        = convert(sysname,N'int'),
  20406.         LOCAL_TYPE_NAME        = convert(sysname,N'int')
  20407.     from
  20408.         sysobjects o,
  20409.         syscomments c
  20410.     where
  20411.         o.name = @procedure_name
  20412.     and    o.id = c.id 
  20413.     and    c.number = @group_number
  20414.     and    c.colid = 1
  20415.     and    o.type = 'P'                        /* Just Procedures */
  20416.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20417.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20418.     order by 2, 3, 5
  20419. go
  20420. dump tran master with no_log
  20421. go
  20422. create procedure sp_procedure_params_rowset;2
  20423.     (
  20424.     @procedure_schema     sysname = null,
  20425.     @parameter_name        sysname = null
  20426.     )
  20427. as
  20428.     select
  20429.         PROCEDURE_CATALOG     = db_name(),
  20430.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20431.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20432.         PARAMETER_NAME         = c.name,
  20433.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20434.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  20435.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20436.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20437.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  20438.         DATA_TYPE        = d.oledb_data_type,
  20439.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20440.                         case 
  20441.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20442.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20443.                         then coalesce(d.column_size,c.length)
  20444.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20445.                         then coalesce(d.column_size,c.length/2)
  20446.                         else null 
  20447.                         end),
  20448.         CHARACTER_OCTET_LENGTH    = convert(int,
  20449.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20450.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20451.                         then coalesce(d.column_size,c.length)
  20452.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20453.                         then coalesce(d.column_size*2,c.length)
  20454.                         else null 
  20455.                         end),
  20456.         NUMERIC_PRECISION    = convert(smallint,
  20457.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20458.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20459.                             then d.data_precision else null end),
  20460.         NUMERIC_SCALE        = convert(smallint, 
  20461.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20462.         DESCRIPTION        = convert(nvarchar(1),null),
  20463.         TYPE_NAME        = d.type_name,
  20464.         LOCAL_TYPE_NAME        = d.local_type_name
  20465.     
  20466.     from
  20467.         sysobjects o,
  20468.         syscolumns c,
  20469.         master.dbo.spt_provider_types d,
  20470.         systypes t
  20471.     where
  20472.         o.type = 'P'                            /* Just Procedures */
  20473.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20474.     and    o.id = c.id
  20475.     and    c.xtype = d.ss_dtype
  20476.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20477.     and    c.xusertype = t.xusertype
  20478.     and    (@parameter_name is null or @parameter_name = c.name)
  20479.     UNION ALL
  20480.     SELECT           /* return value row*/
  20481.         PROCEDURE_CATALOG     = db_name(),
  20482.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20483.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20484.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20485.         ORDINAL_POSITION     = convert(smallint,0),
  20486.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20487.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20488.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20489.         IS_NULLABLE        = convert(bit,0),
  20490.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20491.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20492.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20493.         NUMERIC_PRECISION    = convert(smallint,10),
  20494.         NUMERIC_SCALE        = convert(smallint,null),
  20495.         DESCRIPTION        = convert(nvarchar(1),null),
  20496.         TYPE_NAME        = convert(sysname,N'int'),
  20497.         LOCAL_TYPE_NAME        = convert(sysname,N'int')
  20498.     from
  20499.         sysobjects o,
  20500.         syscomments c
  20501.     where
  20502.         o.type = 'P'        /* Just Procedures */
  20503.     and    o.id = c.id 
  20504.     and    c.colid = 1
  20505.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20506.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20507.     order by 2, 3, 5
  20508. go
  20509.  
  20510. if (charindex('8.00', @@version) > 0)
  20511.     drop procedure sp_procedure_params_rowset
  20512. else
  20513. begin
  20514.     print ''
  20515.     print ''
  20516.     print 'Warning:'
  20517.     print 'you are installing the stored procedures '
  20518.     print 'on a pre 8.0 SQL Server.'
  20519.     print 'Ignore the following errors.'
  20520. end
  20521. go
  20522.  
  20523. /*    Procedure for 8.0 servers */
  20524. create procedure sp_procedure_params_rowset
  20525.     (
  20526.        @procedure_name        sysname,
  20527.     @group_number        int = 1,
  20528.     @procedure_schema     sysname = null,
  20529.     @parameter_name        sysname = null
  20530.     )
  20531. as
  20532.     select
  20533.         PROCEDURE_CATALOG     = db_name(),
  20534.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20535.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20536.         PARAMETER_NAME         = c.name,
  20537.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20538.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  20539.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20540.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20541.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  20542.         DATA_TYPE        = d.oledb_data_type,
  20543.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20544.                         case 
  20545.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20546.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20547.                         then coalesce(d.column_size,c.length)
  20548.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20549.                         then coalesce(d.column_size,c.length/2)
  20550.                         else null 
  20551.                         end),
  20552.         CHARACTER_OCTET_LENGTH    = convert(int,
  20553.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20554.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20555.                         then coalesce(d.column_size,c.length)
  20556.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20557.                         then coalesce(d.column_size*2,c.length)
  20558.                         else null 
  20559.                         end),
  20560.         NUMERIC_PRECISION    = convert(smallint,
  20561.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20562.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20563.                             then d.data_precision else null end),
  20564.         NUMERIC_SCALE        = convert(smallint, 
  20565.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20566.         DESCRIPTION        = convert(nvarchar(1),null),
  20567.         TYPE_NAME        = d.type_name,
  20568.         LOCAL_TYPE_NAME        = d.local_type_name
  20569.     
  20570.     from
  20571.         sysobjects o,
  20572.         syscolumns c,
  20573.         master.dbo.spt_provider_types d,
  20574.         systypes t
  20575.     where
  20576.         o.name = @procedure_name
  20577.     and     (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
  20578.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20579.     and    o.id = c.id
  20580.     and    ((c.number = @group_number and o.type = 'P') 
  20581.             or (c.number = 0 and o.type = 'FN')
  20582.             or (c.number = 1 and o.type in ('TF', 'IF')))
  20583.     and    c.xtype = d.ss_dtype
  20584.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20585.     and    c.xusertype = t.xusertype
  20586.     and    (@parameter_name is null or @parameter_name = c.name)
  20587.     UNION ALL
  20588.     SELECT           /* return value row*/
  20589.         PROCEDURE_CATALOG     = db_name(),
  20590.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20591.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20592.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20593.         ORDINAL_POSITION     = convert(smallint,0),
  20594.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20595.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20596.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20597.         IS_NULLABLE        = convert(bit,0),
  20598.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20599.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20600.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20601.         NUMERIC_PRECISION    = convert(smallint,10),
  20602.         NUMERIC_SCALE        = convert(smallint,null),
  20603.         DESCRIPTION        = convert(nvarchar(1),null),
  20604.         TYPE_NAME        = convert(sysname,N'int'),
  20605.         LOCAL_TYPE_NAME        = convert(sysname,N'int')
  20606.     from
  20607.         sysobjects o,
  20608.         syscomments c
  20609.     where
  20610.         o.name = @procedure_name
  20611.     and    o.id = c.id 
  20612.     and    c.number = @group_number
  20613.     and    c.colid = 1
  20614.     and    o.type = 'P'            /* Just Procedures */
  20615.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20616.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20617.     UNION ALL
  20618.     SELECT           /* UDF return value row*/
  20619.         PROCEDURE_CATALOG          = db_name(),
  20620.         PROCEDURE_SCHEMA          = user_name(o.uid),
  20621.         PROCEDURE_NAME              = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20622.         PARAMETER_NAME              = convert(sysname,'@RETURN_VALUE'),
  20623.         ORDINAL_POSITION          = convert(smallint, 0),
  20624.         PARAMETER_TYPE              = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20625.         PARAMETER_HASDEFAULT     = convert(tinyint, 0),
  20626.         PARAMETER_DEFAULT         = convert(nvarchar(255),null),
  20627.         IS_NULLABLE                 = convert(bit, c.isnullable),
  20628.         DATA_TYPE                 = d.oledb_data_type,
  20629.         CHARACTER_MAXIMUM_LENGTH = convert(int,
  20630.                         case 
  20631.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20632.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20633.                         then coalesce(d.column_size,c.length)
  20634.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20635.                         then coalesce(d.column_size,c.length/2)
  20636.                         else null 
  20637.                         end),
  20638.         CHARACTER_OCTET_LENGTH     = convert(int,
  20639.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20640.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20641.                         then coalesce(d.column_size,c.length)
  20642.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20643.                         then coalesce(d.column_size*2,c.length)
  20644.                         else null 
  20645.                         end),
  20646.         NUMERIC_PRECISION         = convert(smallint,
  20647.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20648.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20649.                             then d.data_precision else null end),
  20650.         NUMERIC_SCALE             = convert(smallint, 
  20651.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20652.         DESCRIPTION                 = convert(nvarchar(1),null),
  20653.         TYPE_NAME                 = d.type_name,
  20654.         LOCAL_TYPE_NAME             = d.local_type_name
  20655.     FROM
  20656.         sysobjects o,
  20657.         syscolumns c,
  20658.         master.dbo.spt_provider_types d,
  20659.         systypes t
  20660.     WHERE
  20661.         o.name = @procedure_name
  20662.     and    o.id = c.id 
  20663.     and    c.number = 0
  20664.     and    c.colid = 0
  20665.     and    o.type = 'FN'            /* UDF scalar functions */
  20666.     and    c.xtype = d.ss_dtype
  20667.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20668.     and    c.xusertype = t.xusertype
  20669.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20670.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20671.     UNION ALL
  20672.     SELECT           /* UDF table value row*/
  20673.         PROCEDURE_CATALOG     = db_name(),
  20674.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20675.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20676.         PARAMETER_NAME         = convert(sysname,'@TABLE_RETURN_VALUE'),
  20677.         ORDINAL_POSITION     = convert(smallint, 0),
  20678.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20679.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20680.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20681.         IS_NULLABLE        = convert(bit,0),
  20682.         DATA_TYPE        = convert(smallint, 0),                /*DBTYPE_EMPTY*/
  20683.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20684.                         case 
  20685.                         when d.oledb_data_type = 129         /*DBTYPE_STR*/ 
  20686.                             or d.oledb_data_type = 128    /*DBTYPE_BYTES*/
  20687.                         then coalesce(d.column_size,c.length)
  20688.                         when d.oledb_data_type = 130        /*DBTYPE_WSTR*/
  20689.                         then coalesce(d.column_size,c.length/2)
  20690.                         else null 
  20691.                         end),
  20692.         CHARACTER_OCTET_LENGTH    = convert(int,
  20693.                         case when d.oledb_data_type = 129    /*DBTYPE_STR*/ 
  20694.                             or d.oledb_data_type = 128    /*DBTYPE_BYTES*/
  20695.                         then coalesce(d.column_size,c.length)
  20696.                         when d.oledb_data_type = 130        /*DBTYPE_WSTR*/
  20697.                         then coalesce(d.column_size*2,c.length)
  20698.                         else null 
  20699.                         end),
  20700.         NUMERIC_PRECISION    = convert(smallint,
  20701.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20702.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20703.                             then d.data_precision else null end),
  20704.         NUMERIC_SCALE        = convert(smallint, 
  20705.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20706.         DESCRIPTION        = convert(nvarchar(50), N'Result table returned by table valued function'),
  20707.         TYPE_NAME        = N'table',
  20708.         LOCAL_TYPE_NAME        = N'table'
  20709.     
  20710.     from
  20711.         sysobjects o,
  20712.         syscolumns c,
  20713.         master.dbo.spt_provider_types d
  20714.     where
  20715.         o.name = @procedure_name
  20716.     and    o.id = c.id 
  20717.     and    c.number = 0
  20718.     and    c.colid = 1
  20719.     and    o.type in ('TF', 'IF')            /* UDF table functions */
  20720.     and    c.xtype = d.ss_dtype
  20721.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20722.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20723.     and    (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')
  20724.     order by 2, 3, 5
  20725. go
  20726. dump tran master with no_log
  20727. go
  20728. create procedure sp_procedure_params_rowset;2
  20729.     (
  20730.     @procedure_schema     sysname = null,
  20731.     @parameter_name        sysname = null
  20732.     )
  20733. as
  20734.     select
  20735.         PROCEDURE_CATALOG     = db_name(),
  20736.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20737.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20738.         PARAMETER_NAME         = c.name,
  20739.         ORDINAL_POSITION     = convert(smallint, c.colid),
  20740.         PARAMETER_TYPE         = convert(smallint, 1+c.isoutparam),
  20741.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20742.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20743.         IS_NULLABLE        = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
  20744.         DATA_TYPE        = d.oledb_data_type,
  20745.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20746.                         case 
  20747.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20748.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20749.                         then coalesce(d.column_size,c.length)
  20750.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20751.                         then coalesce(d.column_size,c.length/2)
  20752.                         else null 
  20753.                         end),
  20754.         CHARACTER_OCTET_LENGTH    = convert(int,
  20755.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20756.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20757.                         then coalesce(d.column_size,c.length)
  20758.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20759.                         then coalesce(d.column_size*2,c.length)
  20760.                         else null 
  20761.                         end),
  20762.         NUMERIC_PRECISION    = convert(smallint,
  20763.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20764.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20765.                             then d.data_precision else null end),
  20766.         NUMERIC_SCALE        = convert(smallint, 
  20767.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20768.         DESCRIPTION        = convert(nvarchar(1),null),
  20769.         TYPE_NAME        = d.type_name,
  20770.         LOCAL_TYPE_NAME        = d.local_type_name
  20771.     
  20772.     from
  20773.         sysobjects o,
  20774.         syscolumns c,
  20775.         master.dbo.spt_provider_types d,
  20776.         systypes t
  20777.     where
  20778.         (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
  20779.     and    (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20780.     and    o.id = c.id
  20781.     and    (o.type = 'P' or (c.number = 0 and o.type = 'FN') or (c.number = 1 and o.type in ('TF', 'IF')))
  20782.     and    c.xtype = d.ss_dtype
  20783.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20784.     and    c.xusertype = t.xusertype
  20785.     and    (@parameter_name is null or @parameter_name = c.name)
  20786.     UNION ALL
  20787.     SELECT           /* return value row*/
  20788.         PROCEDURE_CATALOG     = db_name(),
  20789.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20790.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20791.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20792.         ORDINAL_POSITION     = convert(smallint,0),
  20793.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20794.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20795.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20796.         IS_NULLABLE        = convert(bit,0),
  20797.         DATA_TYPE        = convert(smallint, 3 /*DBTYPE_I4*/),
  20798.         CHARACTER_MAXIMUM_LENGTH= convert(int,null),
  20799.         CHARACTER_OCTET_LENGTH    = convert(int,null),
  20800.         NUMERIC_PRECISION    = convert(smallint,10),
  20801.         NUMERIC_SCALE        = convert(smallint,null),
  20802.         DESCRIPTION        = convert(nvarchar(1),null),
  20803.         TYPE_NAME        = convert(sysname,N'int'),
  20804.         LOCAL_TYPE_NAME        = convert(sysname,N'int')
  20805.     from
  20806.         sysobjects o,
  20807.         syscomments c
  20808.     where
  20809.         o.type = 'P'            /* Just Procedures */
  20810.     and    o.id = c.id 
  20811.     and    c.colid = 1
  20812.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20813.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20814.     UNION ALL
  20815.     SELECT           /* UDF return value row*/
  20816.         PROCEDURE_CATALOG     = db_name(),
  20817.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20818.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20819.         PARAMETER_NAME         = convert(sysname,'@RETURN_VALUE'),
  20820.         ORDINAL_POSITION     = convert(smallint, 0),
  20821.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20822.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20823.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20824.         IS_NULLABLE        = convert(bit, c.isnullable),
  20825.         DATA_TYPE        = d.oledb_data_type,
  20826.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20827.                         case 
  20828.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20829.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20830.                         then coalesce(d.column_size,c.length)
  20831.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20832.                         then coalesce(d.column_size,c.length/2)
  20833.                         else null 
  20834.                         end),
  20835.         CHARACTER_OCTET_LENGTH    = convert(int,
  20836.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20837.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20838.                         then coalesce(d.column_size,c.length)
  20839.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20840.                         then coalesce(d.column_size*2,c.length)
  20841.                         else null 
  20842.                         end),
  20843.         NUMERIC_PRECISION    = convert(smallint,
  20844.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20845.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20846.                             then d.data_precision else null end),
  20847.         NUMERIC_SCALE        = convert(smallint, 
  20848.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20849.         DESCRIPTION        = convert(nvarchar(1),null),
  20850.         TYPE_NAME        = d.type_name,
  20851.         LOCAL_TYPE_NAME        = d.local_type_name
  20852.     
  20853.     from
  20854.         sysobjects o,
  20855.         syscolumns c,
  20856.         master.dbo.spt_provider_types d,
  20857.         systypes t
  20858.     where
  20859.         o.id = c.id 
  20860.     and    c.number = 0
  20861.     and    c.colid = 0
  20862.     and    o.type = 'FN'            /* UDF scalar functions */
  20863.     and    c.xtype = d.ss_dtype
  20864.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20865.     and    c.xusertype = t.xusertype
  20866.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20867.     and    (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
  20868.     UNION ALL
  20869.     SELECT           /* UDF table value row*/
  20870.         PROCEDURE_CATALOG     = db_name(),
  20871.         PROCEDURE_SCHEMA     = user_name(o.uid),
  20872.         PROCEDURE_NAME         = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
  20873.         PARAMETER_NAME         = convert(sysname,'@TABLE_RETURN_VALUE'),
  20874.         ORDINAL_POSITION     = convert(smallint, 0),
  20875.         PARAMETER_TYPE         = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
  20876.         PARAMETER_HASDEFAULT    = convert(tinyint, 0),
  20877.         PARAMETER_DEFAULT    = convert(nvarchar(255),null),
  20878.         IS_NULLABLE        = convert(bit,0),
  20879.         DATA_TYPE        = convert(smallint, 0),            /*DBTYPE_EMPTY*/
  20880.         CHARACTER_MAXIMUM_LENGTH= convert(int,
  20881.                         case 
  20882.                         when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20883.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20884.                         then coalesce(d.column_size,c.length)
  20885.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20886.                         then coalesce(d.column_size,c.length/2)
  20887.                         else null 
  20888.                         end),
  20889.         CHARACTER_OCTET_LENGTH    = convert(int,
  20890.                         case when d.oledb_data_type = 129 /*DBTYPE_STR*/ 
  20891.                             or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
  20892.                         then coalesce(d.column_size,c.length)
  20893.                         when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
  20894.                         then coalesce(d.column_size*2,c.length)
  20895.                         else null 
  20896.                         end),
  20897.         NUMERIC_PRECISION    = convert(smallint,
  20898.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
  20899.                             when (d.fixed_prec_scale =1  or d.oledb_data_type =5 or d.oledb_data_type =4)
  20900.                             then d.data_precision else null end),
  20901.         NUMERIC_SCALE        = convert(smallint, 
  20902.                         case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
  20903.         DESCRIPTION        = convert(nvarchar(1),null),
  20904.         TYPE_NAME        = N'table',
  20905.         LOCAL_TYPE_NAME        = N'table'
  20906.     
  20907.     from
  20908.         sysobjects o,
  20909.         syscolumns c,
  20910.         master.dbo.spt_provider_types d
  20911.     where
  20912.         o.id = c.id 
  20913.     and    c.number = 0
  20914.     and    c.colid = 1
  20915.     and    o.type in ('TF', 'IF')            /* UDF table functions */
  20916.     and    c.xtype = d.ss_dtype
  20917.     and    c.length = case when d.fixlen > 0 then d.fixlen else c.length end
  20918.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20919.     and    (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')
  20920.     order by 2, 3, 5
  20921. go
  20922.  
  20923. grant execute on sp_procedure_params_rowset to public
  20924. go
  20925.  
  20926. dump tran master with no_log
  20927. go
  20928. if (charindex('6.00', @@version) > 0)
  20929.     begin
  20930.     if (exists (select * from sysobjects
  20931.             where name = 'sp_procedure_params_rowset' and type = 'P '))
  20932.         begin
  20933.         drop procedure sp_procedure_params_rowset
  20934.         dump tran master with no_log
  20935.         end
  20936.     end
  20937. go
  20938.  
  20939.  
  20940. print ''
  20941. print 'creating sp_procedures_rowset'
  20942. go
  20943.  
  20944.  
  20945. /* pre 7.0 version */
  20946. create procedure sp_procedures_rowset
  20947.     (
  20948.     @procedure_name        varchar(255), 
  20949.     @group_number        int = 1,
  20950.     @procedure_schema    varchar(255) = null
  20951.     )        
  20952. as
  20953.     select
  20954.         PROCEDURE_CATALOG    = db_name(),
  20955.         PROCEDURE_SCHEMA    = user_name(o.uid),
  20956.         PROCEDURE_NAME        = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
  20957.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  20958.         PROCEDURE_DEFINITION    = convert(varchar(1),null),
  20959.         DESCRIPTION        = convert(varchar(1),null),
  20960.         DATE_CREATED        = o.crdate,
  20961.         DATE_MODIFIED        = convert(datetime,null)
  20962.     from     
  20963.         sysobjects o, 
  20964.         syscomments p,
  20965.         sysusers u
  20966.     where
  20967.             o.name = @procedure_name
  20968.         and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  20969.     and     o.type = 'P'        /* Object type of Procedure */
  20970.     and     p.colid = 1
  20971.     and     p.id = o.id
  20972.     and    p.number = @group_number
  20973.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  20974.     and     (    suser_id() = 1     /* User is the System Administrator */
  20975.         or     o.uid = user_id()    /* User created the object */
  20976.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  20977.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  20978.              from sysprotects p
  20979.              where p.id = o.id
  20980.                  /*  get rows for public,current user,user's group */
  20981.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  20982.                  /* check for SELECT,EXECUTE privilege */
  20983.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  20984.             ) = 1     /* final magic...compare Grants    */
  20985.         )
  20986.     order by 2, 3
  20987. go
  20988. dump tran master with no_log
  20989. go
  20990. create procedure sp_procedures_rowset;2
  20991.     (
  20992.     @procedure_schema    varchar(255) = null
  20993.     )        
  20994. as
  20995.     select
  20996.         PROCEDURE_CATALOG    = db_name(),
  20997.         PROCEDURE_SCHEMA    = user_name(o.uid),
  20998.         PROCEDURE_NAME        = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
  20999.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  21000.         PROCEDURE_DEFINITION    = convert(varchar(1),null),
  21001.         DESCRIPTION        = convert(varchar(1),null),
  21002.         DATE_CREATED        = o.crdate,
  21003.         DATE_MODIFIED        = convert(datetime,null)
  21004.     from     
  21005.         sysobjects o, 
  21006.         syscomments p,
  21007.         sysusers u
  21008.     where
  21009.             (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  21010.     and     o.type = 'P'        /* Object type of Procedure */
  21011.     and     p.colid = 1
  21012.     and     p.id = o.id
  21013.     and     u.uid = user_id()    /* constrain sysusers uid for use in subquery */
  21014.     and     (    suser_id() = 1     /* User is the System Administrator */
  21015.         or     o.uid = user_id()    /* User created the object */
  21016.             /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21017.         or     ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21018.              from sysprotects p
  21019.              where p.id = o.id
  21020.                  /*  get rows for public,current user,user's group */
  21021.                  and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21022.                  /* check for SELECT,EXECUTE privilege */
  21023.              and (action in (193,224)))&1    /* more magic...normalize GRANT */
  21024.             ) = 1     /* final magic...compare Grants    */
  21025.         )
  21026.     order by 2, 3
  21027. go
  21028. dump tran master with no_log
  21029. go
  21030.  
  21031. if (charindex('7.00', @@version) > 0 or
  21032.     charindex('8.00', @@version) > 0)
  21033.     drop procedure sp_procedures_rowset
  21034. else
  21035. begin
  21036.     print ''
  21037.     print ''
  21038.     print 'Warning:'
  21039.     print 'you are installing the stored procedures '
  21040.     print 'on a pre 7.0 SQL Server.'
  21041.     print 'Ignore the following errors.'
  21042. end
  21043. go
  21044.  
  21045. /* 7.0 version */
  21046. create procedure sp_procedures_rowset
  21047.     (
  21048.     @procedure_name        sysname, 
  21049.     @group_number        int = 1,
  21050.     @procedure_schema    sysname = null
  21051.     )        
  21052. as
  21053.     select
  21054.         PROCEDURE_CATALOG    = db_name(),
  21055.         PROCEDURE_SCHEMA    = user_name(o.uid),
  21056.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  21057.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  21058.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  21059.         DESCRIPTION        = convert(nvarchar(1),null),
  21060.         DATE_CREATED        = o.crdate,
  21061.         DATE_MODIFIED        = convert(datetime,null)
  21062.     from     
  21063.         sysobjects o, 
  21064.         syscomments p
  21065.     where
  21066.         permissions(o.id) <> 0
  21067.     and    o.name = @procedure_name
  21068.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  21069.     and     o.type = 'P'        /* Object type of Procedure */
  21070.     and     p.colid = 1
  21071.     and     p.id = o.id
  21072.     and    p.number = @group_number
  21073.     order by 2, 3
  21074. go
  21075. dump tran master with no_log
  21076. go
  21077. create procedure sp_procedures_rowset;2
  21078.     (
  21079.     @procedure_schema    sysname = null
  21080.     )        
  21081. as
  21082.     select
  21083.         PROCEDURE_CATALOG    = db_name(),
  21084.         PROCEDURE_SCHEMA    = user_name(o.uid),
  21085.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  21086.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  21087.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  21088.         DESCRIPTION        = convert(nvarchar(1),null),
  21089.         DATE_CREATED        = o.crdate,
  21090.         DATE_MODIFIED        = convert(datetime,null)
  21091.     from     sysobjects o, syscomments p
  21092.     where
  21093.         permissions(o.id) <> 0
  21094.     and        (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  21095.     and     o.type = 'P'        /* Object type of Procedure */
  21096.     and p.colid = 1
  21097.     and p.id = o.id
  21098.     order by 2, 3
  21099. go
  21100.  
  21101. if (charindex('8.00', @@version) > 0)
  21102.     drop procedure sp_procedures_rowset
  21103. else
  21104. begin
  21105.     print ''
  21106.     print ''
  21107.     print 'Warning:'
  21108.     print 'you are installing the stored procedures '
  21109.     print 'on a pre 8.0 SQL Server.'
  21110.     print 'Ignore the following errors.'
  21111. end
  21112. go
  21113.  
  21114. /* 8.0 version */
  21115. create procedure sp_procedures_rowset
  21116.     (
  21117.     @procedure_name        sysname, 
  21118.     @group_number        int = 1,
  21119.     @procedure_schema    sysname = null
  21120.     )        
  21121. as
  21122.     select
  21123.         PROCEDURE_CATALOG    = db_name(),
  21124.         PROCEDURE_SCHEMA    = user_name(o.uid),
  21125.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  21126.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  21127.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  21128.         DESCRIPTION        = convert(nvarchar(1),null),
  21129.         DATE_CREATED        = o.crdate,
  21130.         DATE_MODIFIED        = convert(datetime,null)
  21131.     from     
  21132.         sysobjects o, 
  21133.         syscomments p
  21134.     where
  21135.         permissions(o.id) <> 0
  21136.     and    o.name = @procedure_name
  21137.     and     (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  21138.     and     o.type in ('P', 'FN', 'TF', 'IF')    /* Object type of Procedure */
  21139.     and     p.colid = 1
  21140.     and     p.id = o.id
  21141.     and    p.number = @group_number
  21142.     order by 2, 3
  21143. go
  21144. dump tran master with no_log
  21145. go
  21146. create procedure sp_procedures_rowset;2
  21147.     (
  21148.     @procedure_schema    sysname = null
  21149.     )        
  21150. as
  21151.     select
  21152.         PROCEDURE_CATALOG    = db_name(),
  21153.         PROCEDURE_SCHEMA    = user_name(o.uid),
  21154.         PROCEDURE_NAME        = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
  21155.         PROCEDURE_TYPE        = convert(smallint, 3 /*DB_PT_FUNCTION*/),
  21156.         PROCEDURE_DEFINITION    = convert(nvarchar(1),null),
  21157.         DESCRIPTION        = convert(nvarchar(1),null),
  21158.         DATE_CREATED        = o.crdate,
  21159.         DATE_MODIFIED        = convert(datetime,null)
  21160.     from     sysobjects o, syscomments p
  21161.     where
  21162.         permissions(o.id) <> 0
  21163.     and        (@procedure_schema is null or @procedure_schema = user_name(o.uid))
  21164.     and     o.type in ('P', 'FN', 'TF', 'IF')    /* Object type of Procedure */
  21165.     and p.colid = 1
  21166.     and p.id = o.id
  21167.     order by 2, 3
  21168. go
  21169.  
  21170. grant execute on sp_procedures_rowset to public
  21171. go
  21172.  
  21173. dump tran master with no_log
  21174. go
  21175.  
  21176. if (charindex('6.00', @@version) > 0)
  21177.     begin
  21178.     if (exists (select * from sysobjects
  21179.             where name = 'sp_procedures_rowset' and type = 'P '))
  21180.         begin
  21181.         drop procedure sp_procedures_rowset
  21182.         dump tran master with no_log
  21183.         end
  21184.     end
  21185. go
  21186.  
  21187.  
  21188. print ''
  21189. print 'creating sp_schemata_rowset'
  21190. go
  21191.  
  21192. /*    6.0 and 6.5 and 7.0 version */
  21193. create procedure sp_schemata_rowset
  21194.     (
  21195.     @schema_name    varchar(90) = null, 
  21196.     @schema_owner    varchar(90) = null
  21197.     )        
  21198. as
  21199.     select    distinct
  21200.         CATALOG_NAME            = db_name(),
  21201.         SCHEMA_NAME            = user_name(o.uid),    
  21202.         SCHEMA_OWNER            = user_name(o.uid),    
  21203.         DEFAULT_CHARACTER_SET_CATALOG    = convert(sysname,'master'),
  21204.         DEFAULT_CHARACTER_SET_SCHEMA    = convert(sysname,'dbo'),
  21205.         DEFAULT_CHARACTER_SET_NAME    = convert(sysname,a_cha.name)
  21206.     from    
  21207.         sysobjects o,
  21208.         master.dbo.sysconfigures    cfg,
  21209.         master.dbo.syscharsets        a_cha, /* charset/1001, not sortorder */
  21210.         master.dbo.syscharsets        b_cha  /* sortorder/2001, not charset */
  21211.     where   
  21212.         (@schema_name is null or @schema_name = user_name(o.uid))
  21213.     and     (@schema_owner is null or @schema_owner = user_name(o.uid))
  21214.     and    a_cha.type = 1001 /* type is charset */
  21215.     and     b_cha.type = 2001 /* type is sortorder */
  21216.     and     a_cha.id = b_cha.csid
  21217.     and     b_cha.id = cfg.value
  21218.     order by 2
  21219. go
  21220. dump tran master with no_log
  21221. go
  21222.  
  21223. if (charindex('8.00', @@version) > 0)
  21224.     drop procedure sp_schemata_rowset
  21225. else
  21226. begin
  21227.     print ''
  21228.     print ''
  21229.     print 'Warning:'
  21230.     print 'you are installing the stored procedures '
  21231.     print 'on a pre 8.0 SQL Server.'
  21232.     print 'Ignore the following errors.'
  21233. end
  21234. go
  21235.  
  21236. /* 8.0 version */
  21237. create procedure sp_schemata_rowset
  21238.     (
  21239.     @schema_name    sysname = null, 
  21240.     @schema_owner    sysname = null
  21241.     )        
  21242. as
  21243.     select    distinct
  21244.         CATALOG_NAME            = db_name(),
  21245.         SCHEMA_NAME            = user_name(o.uid),    
  21246.         SCHEMA_OWNER            = user_name(o.uid),    
  21247.         DEFAULT_CHARACTER_SET_CATALOG    = convert(sysname,N'master'),
  21248.         DEFAULT_CHARACTER_SET_SCHEMA    = convert(sysname,N'dbo'),
  21249.         DEFAULT_CHARACTER_SET_NAME    = convert(sysname,a_cha.name)
  21250.     from    
  21251.         sysobjects o,
  21252.         master.dbo.syscharsets        a_cha /* charset/1001, not sortorder */
  21253.     where   
  21254.         (@schema_name is null or @schema_name = user_name(o.uid))
  21255.     and     (@schema_owner is null or @schema_owner = user_name(o.uid))
  21256.     and    a_cha.type = 1001 /* type is charset */
  21257.     and     a_cha.id = convert(tinyint, DatabasePropertyEx(db_name(), 'sqlcharset')) /* what is charset of a table? */
  21258.     order by 2
  21259. go
  21260.  
  21261. dump tran master with no_log
  21262. go
  21263.  
  21264. /* The following stored procedure is used for Sphinx and Hydra */
  21265. create procedure sp_schemata_rowset;3
  21266. as
  21267.     select
  21268.         CATALOG_NAME            = convert(sysname,' '),
  21269.         SCHEMA_NAME            = convert(sysname,' '),    
  21270.         SCHEMA_OWNER            = convert(sysname,' '),    
  21271.         DEFAULT_CHARACTER_SET_CATALOG    = convert(sysname,' '),
  21272.         DEFAULT_CHARACTER_SET_SCHEMA    = convert(sysname,' '),
  21273.         DEFAULT_CHARACTER_SET_NAME    = convert(sysname,' ')
  21274.     where    1=0
  21275. go
  21276. grant execute on sp_schemata_rowset to public
  21277. go
  21278.  
  21279. dump tran master with no_log
  21280. go
  21281. if (charindex('6.00', @@version) > 0)
  21282.     begin
  21283.     if (exists (select * from sysobjects
  21284.             where name = 'sp_schemata_rowset' and type = 'P '))
  21285.         begin
  21286.         drop procedure sp_schemata_rowset
  21287.         dump tran master with no_log
  21288.         end
  21289.     end
  21290. go
  21291.  
  21292.  
  21293. print ''
  21294. print 'creating sp_statistics_rowset'
  21295. go
  21296.  
  21297.  
  21298. /*    6.0 and 6.5 version */
  21299. create procedure sp_statistics_rowset
  21300.     (
  21301.     @table_name    varchar(255),
  21302.     @table_schema    varchar(255) = null     
  21303.     )
  21304. as
  21305.     select    db_name()                as TABLE_CATALOG,        
  21306.         user_name(o.uid)            as TABLE_SCHEMA,
  21307.         o.name                    as TABLE_NAME,
  21308.         x.rows                    as CARDINALITY
  21309.     from    sysobjects o, sysindexes x, sysusers u
  21310.     where    o.type in ('U')
  21311.     and     o.name = @table_name
  21312.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  21313.     and     x.id = o.id
  21314.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  21315.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21316.     and     (
  21317.         suser_id() = 1     /* User is the System Administrator */
  21318.         or o.uid = user_id()     /* User created the object */
  21319.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21320.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21321.             from sysprotects p
  21322.             where p.id = o.id
  21323.             /* get rows for public,current user,user's group */
  21324.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21325.             /* check for SELECT,EXECUTE privilege */
  21326.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21327.             ) = 1    /* final magic...compare Grants      */
  21328.            )
  21329.     order by 2, 3
  21330. go
  21331. dump tran master with no_log
  21332. go
  21333. create procedure sp_statistics_rowset;2
  21334.     (
  21335.     @table_schema    varchar(255) = null     
  21336.     )
  21337. as
  21338.     select    db_name()                as TABLE_CATALOG,        
  21339.         user_name(o.uid)            as TABLE_SCHEMA,
  21340.         o.name                    as TABLE_NAME,
  21341.         x.rows                    as CARDINALITY
  21342.     from    sysobjects o, sysindexes x, sysusers u
  21343.     where    o.type in ('U')
  21344.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  21345.     and     x.id = o.id
  21346.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21347.     and     (
  21348.         suser_id() = 1     /* User is the System Administrator */
  21349.         or o.uid = user_id()     /* User created the object */
  21350.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21351.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21352.             from sysprotects p
  21353.             where p.id = o.id
  21354.             /* get rows for public,current user,user's group */
  21355.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21356.             /* check for SELECT,EXECUTE privilege */
  21357.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21358.             ) = 1    /* final magic...compare Grants      */
  21359.            )        
  21360.     order by 2, 3
  21361. go
  21362. dump tran master with no_log
  21363. go
  21364.  
  21365. if (charindex('7.00', @@version) > 0 or
  21366.     charindex('8.00', @@version) > 0)
  21367.     drop procedure sp_statistics_rowset
  21368. else
  21369. begin
  21370.     print ''
  21371.     print ''
  21372.     print 'Warning:'
  21373.     print 'you are installing the stored procedures '
  21374.     print 'on a pre 8.0 SQL Server.'
  21375.     print 'Ignore the following errors.'
  21376. end
  21377. go
  21378.  
  21379. /*    8.0 version */
  21380. create procedure sp_statistics_rowset
  21381.     (
  21382.     @table_name    sysname,
  21383.     @table_schema    sysname = null     
  21384.     )
  21385. as
  21386.     select    db_name()                as TABLE_CATALOG,        
  21387.         user_name(o.uid)            as TABLE_SCHEMA,
  21388.         o.name                    as TABLE_NAME,
  21389.         x.rows                    as CARDINALITY
  21390.     from    sysobjects o, sysindexes x
  21391.     where    o.type in ('U')
  21392.     and     o.name = @table_name
  21393.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  21394.     and     x.id = o.id
  21395.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  21396.     and     permissions(o.id) <> 0
  21397.     order by 2, 3
  21398. go
  21399. dump tran master with no_log
  21400. go
  21401. create procedure sp_statistics_rowset;2
  21402.     (
  21403.     @table_schema    sysname = null     
  21404.     )
  21405. as
  21406.     select    db_name()                as TABLE_CATALOG,        
  21407.         user_name(o.uid)            as TABLE_SCHEMA,
  21408.         o.name                    as TABLE_NAME,
  21409.         x.rows                    as CARDINALITY
  21410.     from    sysobjects o, sysindexes x
  21411.     where    o.type in ('U')
  21412.     and     (@table_schema is null or @table_schema = user_name(o.uid))
  21413.     and     x.id = o.id
  21414.     and     x.indid in (0,1)    /*If there are no indexes then table stats are in a row with indid =0 */
  21415.     and     permissions(o.id) <> 0
  21416.     order by 2, 3
  21417. go
  21418.  
  21419. grant execute on sp_statistics_rowset to public
  21420. go
  21421.  
  21422. dump tran master with no_log
  21423. go
  21424. if (charindex('6.00', @@version) > 0)
  21425.     begin
  21426.     if (exists (select * from sysobjects
  21427.             where name = 'sp_statistics_rowset' and type = 'P '))
  21428.         begin
  21429.         drop procedure sp_statistics_rowset
  21430.         dump tran master with no_log
  21431.         end
  21432.     end
  21433. go
  21434.  
  21435.  
  21436. print ''
  21437. print 'creating sp_tables_rowset'
  21438. go
  21439.  
  21440.  
  21441. /*    Procedure for 6.50 and earlier servers */
  21442. create procedure sp_tables_rowset
  21443.     (
  21444.     @table_name    varchar(255), 
  21445.     @table_schema    varchar(255) = null,    
  21446.     @table_type    varchar(255) = null 
  21447.     )
  21448. as
  21449.     select    TABLE_CATALOG    = db_name(),
  21450.         TABLE_SCHEMA    = user_name(o.uid),
  21451.         TABLE_NAME    = o.name,
  21452.         TABLE_TYPE    = convert(varchar(30),
  21453.                     case o.type 
  21454.                     when 'U' then 'TABLE'
  21455.                     when 'V' then 'VIEW'
  21456.                     when 'S' then 'SYSTEM TABLE'
  21457.                     end),
  21458.         TABLE_GUID    = convert(binary(16), null),
  21459.         DESCRIPTION    = convert(varchar(1), null),
  21460.         TABLE_PROPID    = convert(int,null),
  21461.         DATE_CREATED    = o.crdate,
  21462.         DATE_MODIFIED    = convert(datetime,null)
  21463.     from    sysusers u, sysobjects o
  21464.     where    o.type in ('U','V','S')
  21465.     and     o.name = @table_name
  21466.     and     (    @table_schema is null
  21467.         or    @table_schema = user_name(o.uid)
  21468.         )
  21469.     and     (
  21470.             @table_type is null
  21471.         or    @table_type = case o.type 
  21472.                     when 'U' then 'TABLE'
  21473.                     when 'V' then 'VIEW'
  21474.                     when 'S' then 'SYSTEM TABLE'
  21475.                     end
  21476.         )
  21477.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21478.     and     (
  21479.         suser_id() = 1     /* User is the System Administrator */
  21480.         or o.uid = user_id()     /* User created the object */
  21481.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21482.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21483.             from sysprotects p
  21484.             /* join to correlate with all rows in sysobjects */
  21485.             where p.id = o.id
  21486.             /* get rows for public,current user,user's group */
  21487.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21488.             /* check for SELECT,EXECUTE privilege */
  21489.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21490.             ) = 1    /* final magic...compare Grants      */
  21491.         )        
  21492.     order by 4, 2, 3
  21493. go
  21494. dump tran master with no_log
  21495. go
  21496. create procedure sp_tables_rowset;2
  21497.     (
  21498.     @table_schema    varchar(255) = null,    
  21499.     @table_type    varchar(255) = null 
  21500.     )
  21501. as
  21502.     select    TABLE_CATALOG    = db_name(),
  21503.         TABLE_SCHEMA    = user_name(o.uid),
  21504.         TABLE_NAME    = o.name,
  21505.         TABLE_TYPE    = convert(varchar(30),
  21506.                     case o.type 
  21507.                     when 'U' then 'TABLE'
  21508.                     when 'V' then 'VIEW'
  21509.                     when 'S' then 'SYSTEM TABLE'
  21510.                     end),
  21511.         TABLE_GUID    = convert(binary(16), null),
  21512.         DESCRIPTION    = convert(varchar(1), null),
  21513.         TABLE_PROPID    = convert(int,null),
  21514.         DATE_CREATED    = o.crdate,
  21515.         DATE_MODIFIED    = convert(datetime,null)
  21516.     from    sysusers u, sysobjects o
  21517.     where    o.type in ('U','V','S')
  21518.     and     (    @table_schema is null
  21519.         or    @table_schema = user_name(o.uid)
  21520.         )
  21521.     and     (
  21522.             @table_type is null
  21523.         or    @table_type = case o.type 
  21524.                     when 'U' then 'TABLE'
  21525.                     when 'V' then 'VIEW'
  21526.                     when 'S' then 'SYSTEM TABLE'
  21527.                     end
  21528.         )
  21529.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21530.     and     (
  21531.         suser_id() = 1     /* User is the System Administrator */
  21532.         or o.uid = user_id()     /* User created the object */
  21533.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21534.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21535.             from sysprotects p
  21536.             /* join to correlate with all rows in sysobjects */
  21537.             where p.id = o.id
  21538.             /* get rows for public,current user,user's group */
  21539.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21540.             /* check for SELECT,EXECUTE privilege */
  21541.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21542.             ) = 1    /* final magic...compare Grants      */
  21543.         )        
  21544.     order by 4, 2, 3
  21545. go
  21546. dump tran master with no_log
  21547. go
  21548.  
  21549. if (charindex('7.00', @@version) > 0 or
  21550.     charindex('8.00', @@version) > 0)
  21551.     drop procedure sp_tables_rowset
  21552. else
  21553. begin
  21554.     print ''
  21555.     print ''
  21556.     print 'Warning:'
  21557.     print 'you are installing the stored procedures '
  21558.     print 'on a pre 8.0 SQL Server.'
  21559.     print 'Ignore the following errors.'
  21560. end
  21561. go
  21562.  
  21563. /*    Procedure for 8.0 server */
  21564. create procedure sp_tables_rowset
  21565.     (
  21566.     @table_name    sysname, 
  21567.     @table_schema    sysname = null,    
  21568.     @table_type    nvarchar(255) = null 
  21569.     )
  21570. as
  21571.     select    *
  21572.     from    (select    TABLE_CATALOG    = db_name(),
  21573.             TABLE_SCHEMA    = user_name(uid),
  21574.             TABLE_NAME    = name,
  21575.             TABLE_TYPE    = convert(nvarchar(30),
  21576.                         case type 
  21577.                         when 'U' then 
  21578.                             case when ObjectProperty(id, 'IsMSShipped') = 0
  21579.                             then N'TABLE' else N'SYSTEM TABLE' end
  21580.                         when 'S' then N'SYSTEM TABLE'
  21581.                         when 'V' then 
  21582.                             case when ObjectProperty(id, 'IsMSShipped') = 0
  21583.                             then N'VIEW' else N'SYSTEM VIEW' end
  21584.                         end),
  21585.             TABLE_GUID    = convert(uniqueidentifier, null),
  21586.             DESCRIPTION    = convert(nvarchar(1), null),
  21587.             TABLE_PROPID    = convert(int,null),
  21588.             DATE_CREATED    = crdate,
  21589.             DATE_MODIFIED    = convert(datetime,null)
  21590.         from    sysobjects
  21591.         where    name = @table_name
  21592.         and    type in ('U','V','S')
  21593.         and    permissions(id) <> 0
  21594.         ) as o
  21595.  
  21596.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  21597.     and     (@table_type is null or @table_type = TABLE_TYPE)    
  21598.     order by 4, 2, 3
  21599. go
  21600. dump tran master with no_log
  21601. go
  21602. create procedure sp_tables_rowset;2
  21603.     (
  21604.     @table_schema    sysname = null,    
  21605.     @table_type    nvarchar(255) = null 
  21606.     )
  21607. as
  21608.     select    *
  21609.     from    (select    TABLE_CATALOG    = db_name(),
  21610.             TABLE_SCHEMA    = user_name(uid),
  21611.             TABLE_NAME    = name,
  21612.             TABLE_TYPE    = convert(nvarchar(30),
  21613.                         case type 
  21614.                         when 'U' then 
  21615.                             case when ObjectProperty(id, 'IsMSShipped') = 0
  21616.                             then N'TABLE' else N'SYSTEM TABLE' end
  21617.                         when 'S' then N'SYSTEM TABLE'
  21618.                         when 'V' then 
  21619.                             case when ObjectProperty(id, 'IsMSShipped') = 0
  21620.                             then N'VIEW' else N'SYSTEM VIEW' end
  21621.                         end),
  21622.             TABLE_GUID    = convert(uniqueidentifier, null),
  21623.             DESCRIPTION    = convert(nvarchar(1), null),
  21624.             TABLE_PROPID    = convert(int,null),
  21625.             DATE_CREATED    = crdate,
  21626.             DATE_MODIFIED    = convert(datetime,null)
  21627.         from    sysobjects
  21628.         where    type in ('U','V','S')
  21629.         and    permissions(id) <> 0
  21630.         ) as o
  21631.  
  21632.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  21633.     and     (@table_type is null or @table_type = TABLE_TYPE)    
  21634.     order by 4, 2, 3
  21635. go
  21636. dump tran master with no_log
  21637. go
  21638. create procedure sp_tables_rowset;5
  21639.     (
  21640.     @table_server        sysname,
  21641.     @table_catalog        sysname = null,
  21642.     @table_name        sysname = null,
  21643.     @table_schema        sysname = null,
  21644.     @table_type        sysname = null
  21645.     )
  21646. as
  21647.     select
  21648.         TABLE_CATALOG,
  21649.         TABLE_SCHEMA,
  21650.         TABLE_NAME,
  21651.         TABLE_TYPE,
  21652.         TABLE_GUID,
  21653.         DESCRIPTION
  21654.     --    TABLE_PROPID,
  21655.     --    DATE_CREATED,
  21656.     --    DATE_MODIFIED
  21657.     from master.dbo.SYSREMOTE_TABLES <
  21658.                 @table_server,
  21659.                 @table_catalog,
  21660.                 @table_schema,
  21661.                 @table_name,
  21662.                 @table_type >
  21663.     order by 4,1,2,3
  21664. go
  21665.  
  21666. grant execute on sp_tables_rowset to public
  21667. go
  21668.  
  21669. dump tran master with no_log
  21670. go
  21671. if (charindex('6.00', @@version) > 0)
  21672.     begin
  21673.     if (exists (select * from sysobjects
  21674.             where name = 'sp_tables_rowset' and type = 'P '))
  21675.         begin
  21676.         drop procedure sp_tables_rowset
  21677.         dump tran master with no_log
  21678.         end
  21679.     end
  21680. go
  21681.  
  21682.  
  21683.  
  21684. print ''
  21685. print 'creating sp_tables_info_rowset'
  21686. go
  21687.  
  21688.  
  21689. /*    Procedure for 6.50 and earlier servers */
  21690. create procedure sp_tables_info_rowset
  21691.     (
  21692.     @table_name    varchar(255), 
  21693.     @table_schema    varchar(255) = null,    
  21694.     @table_type    varchar(255) = null 
  21695.     )
  21696. as
  21697.     select    TABLE_CATALOG        = db_name(),
  21698.         TABLE_SCHEMA        = user_name(o.uid),
  21699.         TABLE_NAME        = o.name,
  21700.         TABLE_TYPE        = convert(varchar(30),
  21701.                         case o.type 
  21702.                         when 'U' then 'TABLE'
  21703.                         when 'V' then 'VIEW'
  21704.                         when 'S' then 'SYSTEM TABLE'
  21705.                         end),
  21706.         TABLE_GUID        = convert(binary(16), null),
  21707.         BOOKMARKS        = convert(bit, 1),
  21708.         BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  21709.         BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  21710.         BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  21711.         BOOKMARK_INFORMATION    = convert(int, 0),
  21712.         TABLE_VERSION        = convert(int, o.schema_ver),
  21713.         CARDINALITY        = x.rows,
  21714.         DESCRIPTION        = convert(varchar(1), null),
  21715.         TABLE_PROPID        = convert(int, null)
  21716.  
  21717.     from    sysusers u, 
  21718.         sysobjects o,
  21719.         sysindexes x
  21720.  
  21721.     where    o.type in ('U','V','S')
  21722.     and     o.name = @table_name
  21723.     and     (    @table_schema is null
  21724.         or    @table_schema = user_name(o.uid)
  21725.         )
  21726.     and     (
  21727.             @table_type is null
  21728.         or    @table_type = case o.type 
  21729.                     when 'U' then 'TABLE'
  21730.                     when 'V' then 'VIEW'
  21731.                     when 'S' then 'SYSTEM TABLE'
  21732.                     end
  21733.         )
  21734.     and    o.id *= x.id
  21735.     and    x.indid in (0,1)
  21736.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21737.     and     (
  21738.         suser_id() = 1     /* User is the System Administrator */
  21739.         or o.uid = user_id()     /* User created the object */
  21740.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21741.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21742.             from sysprotects p
  21743.             /* join to correlate with all rows in sysobjects */
  21744.             where p.id = o.id
  21745.             /* get rows for public,current user,user's group */
  21746.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21747.             /* check for SELECT,EXECUTE privilege */
  21748.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21749.             ) = 1    /* final magic...compare Grants      */
  21750.         )        
  21751.     order by 4, 2, 3
  21752. go
  21753. dump tran master with no_log
  21754. go
  21755. create procedure sp_tables_info_rowset;2
  21756.     (
  21757.     @table_schema    varchar(255) = null,    
  21758.     @table_type    varchar(255) = null 
  21759.     )
  21760. as
  21761.     select    TABLE_CATALOG        = db_name(),
  21762.         TABLE_SCHEMA        = user_name(o.uid),
  21763.         TABLE_NAME        = o.name,
  21764.         TABLE_TYPE        = convert(varchar(30),
  21765.                         case o.type 
  21766.                         when 'U' then 'TABLE'
  21767.                         when 'V' then 'VIEW'
  21768.                         when 'S' then 'SYSTEM TABLE'
  21769.                         end),
  21770.         TABLE_GUID        = convert(binary(16), null),
  21771.         BOOKMARKS        = convert(bit, 1),
  21772.         BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  21773.         BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  21774.         BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  21775.         BOOKMARK_INFORMATION    = convert(int, 0),
  21776.         TABLE_VERSION        = convert(int, o.schema_ver),
  21777.         CARDINALITY        = x.rows,
  21778.         DESCRIPTION        = convert(varchar(1), null),
  21779.         TABLE_PROPID        = convert(int, null)
  21780.  
  21781.     from    sysusers u, 
  21782.         sysobjects o,
  21783.         sysindexes x
  21784.  
  21785.     where    o.type in ('U','V','S')
  21786.     and     (    @table_schema is null
  21787.         or    @table_schema = user_name(o.uid)
  21788.         )
  21789.     and     (
  21790.             @table_type is null
  21791.         or    @table_type = case o.type 
  21792.                     when 'U' then 'TABLE'
  21793.                     when 'V' then 'VIEW'
  21794.                     when 'S' then 'SYSTEM TABLE'
  21795.                     end
  21796.         )
  21797.     and    o.id *= x.id
  21798.     and    x.indid in (0,1)
  21799.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  21800.     and     (
  21801.         suser_id() = 1     /* User is the System Administrator */
  21802.         or o.uid = user_id()     /* User created the object */
  21803.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  21804.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  21805.             from sysprotects p
  21806.             /* join to correlate with all rows in sysobjects */
  21807.             where p.id = o.id
  21808.             /* get rows for public,current user,user's group */
  21809.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  21810.             /* check for SELECT,EXECUTE privilege */
  21811.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  21812.             ) = 1    /* final magic...compare Grants      */
  21813.         )        
  21814.     order by 4, 2, 3
  21815. go
  21816. dump tran master with no_log
  21817. go
  21818.  
  21819. if (charindex('7.00', @@version) > 0 or
  21820.     charindex('8.00', @@version) > 0)
  21821.     drop procedure sp_tables_info_rowset
  21822. else
  21823. begin
  21824.     print ''
  21825.     print ''
  21826.     print 'Warning:'
  21827.     print 'you are installing the stored procedures '
  21828.     print 'on a pre 7.0 SQL Server.'
  21829.     print 'Ignore the following errors.'
  21830. end
  21831. go
  21832.  
  21833. /*    Procedure for 7.0 server */
  21834. create procedure sp_tables_info_rowset
  21835.     (
  21836.     @table_name    sysname, 
  21837.     @table_schema    sysname = null,    
  21838.     @table_type    nvarchar(255) = null 
  21839.     )
  21840. as
  21841.     select    *
  21842.     from    (select    TABLE_CATALOG        = db_name(),
  21843.             TABLE_SCHEMA        = user_name(o.uid),
  21844.             TABLE_NAME        = o.name,
  21845.             TABLE_TYPE        = convert(nvarchar(30),
  21846.                             case o.type 
  21847.                             when 'U' then 
  21848.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21849.                                 then N'TABLE' else N'SYSTEM TABLE' end
  21850.                             when 'S' then N'SYSTEM TABLE'
  21851.                             when 'V' then 
  21852.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21853.                                 then N'VIEW' else N'SYSTEM VIEW' end
  21854.                             end),
  21855.             TABLE_GUID        = convert(uniqueidentifier, null),
  21856.             BOOKMARKS        = convert(bit, 1),
  21857.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  21858.             BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  21859.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  21860.             BOOKMARK_INFORMATION    = convert(int, 0),
  21861.             TABLE_VERSION        = convert(int, o.schema_ver),
  21862.             CARDINALITY        = x.rows,
  21863.             DESCRIPTION        = convert(nvarchar(1), null),
  21864.             TABLE_PROPID        = convert(int, null) 
  21865.     
  21866.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  21867.         where    o.name = @table_name
  21868.         and     o.type in ('U','V','S')
  21869.         and    permissions(o.id) <> 0) as t
  21870.  
  21871.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  21872.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  21873.     order by 4, 2, 3
  21874. go
  21875. dump tran master with no_log
  21876. go
  21877. create procedure sp_tables_info_rowset;2
  21878.     (
  21879.     @table_schema    sysname = null,    
  21880.     @table_type    nvarchar(255) = null 
  21881.     )
  21882. as
  21883.     select    *
  21884.     from    (select    TABLE_CATALOG        = db_name(),
  21885.             TABLE_SCHEMA        = user_name(o.uid),
  21886.             TABLE_NAME        = o.name,
  21887.             TABLE_TYPE        = convert(nvarchar(30),
  21888.                             case o.type 
  21889.                             when 'U' then 
  21890.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21891.                                 then N'TABLE' else N'SYSTEM TABLE' end
  21892.                             when 'S' then N'SYSTEM TABLE'
  21893.                             when 'V' then 
  21894.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21895.                                 then N'VIEW' else N'SYSTEM VIEW' end
  21896.                             end),
  21897.             TABLE_GUID        = convert(uniqueidentifier, null),
  21898.             BOOKMARKS        = convert(bit, 1),
  21899.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  21900.             BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  21901.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  21902.             BOOKMARK_INFORMATION    = convert(int, 0),
  21903.             TABLE_VERSION        = convert(int, o.schema_ver),
  21904.             CARDINALITY        = x.rows,
  21905.             DESCRIPTION        = convert(nvarchar(1), null),
  21906.             TABLE_PROPID        = convert(int, null) 
  21907.     
  21908.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  21909.         where     o.type in ('U','V','S')
  21910.         and    permissions(o.id) <> 0) as t
  21911.  
  21912.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  21913.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  21914.     order by 4, 2, 3
  21915. go
  21916.  
  21917. dump tran master with no_log
  21918. go
  21919.  
  21920. if (charindex('8.00', @@version) > 0)
  21921.     drop procedure sp_tables_info_rowset
  21922. else
  21923. begin
  21924.     print ''
  21925.     print ''
  21926.     print 'Warning:'
  21927.     print 'you are installing the stored procedures '
  21928.     print 'on a pre 8.0 SQL Server.'
  21929.     print 'Ignore the following errors.'
  21930. end
  21931. go
  21932.  
  21933. /*    Procedure for 8.0 server */
  21934. create procedure sp_tables_info_rowset
  21935.     (
  21936.     @table_name    sysname, 
  21937.     @table_schema    sysname = null,    
  21938.     @table_type    nvarchar(255) = null 
  21939.     )
  21940. as
  21941.     select    *
  21942.     from    (select    TABLE_CATALOG        = db_name(),
  21943.             TABLE_SCHEMA        = user_name(o.uid),
  21944.             TABLE_NAME        = o.name,
  21945.             TABLE_TYPE        = convert(nvarchar(30),
  21946.                             case o.type 
  21947.                             when 'U' then 
  21948.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21949.                                 then N'TABLE' else N'SYSTEM TABLE' end
  21950.                             when 'S' then N'SYSTEM TABLE'
  21951.                             when 'V' then 
  21952.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21953.                                 then N'VIEW' else N'SYSTEM VIEW' end
  21954.                             end),
  21955.             TABLE_GUID        = convert(uniqueidentifier, null),
  21956.             BOOKMARKS        = convert(bit, 1),
  21957.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  21958.             BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  21959.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  21960.             BOOKMARK_INFORMATION    = convert(int, 0),
  21961.             TABLE_VERSION        = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
  21962.             CARDINALITY        = x.rows,
  21963.             DESCRIPTION        = convert(nvarchar(1), null),
  21964.             TABLE_PROPID        = convert(int, null) 
  21965.     
  21966.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  21967.         where    o.name = @table_name
  21968.         and     o.type in ('U','V','S')
  21969.         and    permissions(o.id) <> 0) as t
  21970.  
  21971.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  21972.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  21973.     order by 4, 2, 3
  21974. go
  21975. dump tran master with no_log
  21976. go
  21977. create procedure sp_tables_info_rowset;2
  21978.     (
  21979.     @table_schema    sysname = null,    
  21980.     @table_type    nvarchar(255) = null 
  21981.     )
  21982. as
  21983.     select    *
  21984.     from    (select    TABLE_CATALOG        = db_name(),
  21985.             TABLE_SCHEMA        = user_name(o.uid),
  21986.             TABLE_NAME        = o.name,
  21987.             TABLE_TYPE        = convert(nvarchar(30),
  21988.                             case o.type 
  21989.                             when 'U' then 
  21990.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21991.                                 then N'TABLE' else N'SYSTEM TABLE' end
  21992.                             when 'S' then N'SYSTEM TABLE'
  21993.                             when 'V' then 
  21994.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  21995.                                 then N'VIEW' else N'SYSTEM VIEW' end
  21996.                             end),
  21997.             TABLE_GUID        = convert(uniqueidentifier, null),
  21998.             BOOKMARKS        = convert(bit, 1),
  21999.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22000.             BOOKMARK_DATATYPE    = convert(smallint, 19 /*DBTYPE_UI4 */),
  22001.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
  22002.             BOOKMARK_INFORMATION    = convert(int, 0),
  22003.             TABLE_VERSION        = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
  22004.             CARDINALITY        = x.rows,
  22005.             DESCRIPTION        = convert(nvarchar(1), null),
  22006.             TABLE_PROPID        = convert(int, null) 
  22007.     
  22008.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  22009.         where     o.type in ('U','V','S')
  22010.         and    permissions(o.id) <> 0) as t
  22011.  
  22012.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  22013.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  22014.     order by 4, 2, 3
  22015. go
  22016.  
  22017. grant execute on sp_tables_info_rowset to public
  22018. go
  22019.  
  22020. dump tran master with no_log
  22021. go
  22022.  
  22023. if (charindex('6.00', @@version) > 0)
  22024.     begin
  22025.     if (exists (select * from sysobjects
  22026.         where name = 'sp_tables_info_rowset' and type = 'P '))
  22027.         begin
  22028.         drop procedure sp_tables_info_rowset
  22029.         dump tran master with no_log
  22030.         end
  22031.     end
  22032. go
  22033.  
  22034. print ''
  22035. print 'creating sp_tables_info_rowset_64'
  22036. go
  22037.  
  22038.  
  22039. /*    Procedure for 6.50 and earlier servers */
  22040. create procedure sp_tables_info_rowset_64
  22041.     (
  22042.     @table_name    varchar(255), 
  22043.     @table_schema    varchar(255) = null,    
  22044.     @table_type    varchar(255) = null 
  22045.     )
  22046. as
  22047.     select    TABLE_CATALOG        = db_name(),
  22048.         TABLE_SCHEMA        = user_name(o.uid),
  22049.         TABLE_NAME        = o.name,
  22050.         TABLE_TYPE        = convert(varchar(30),
  22051.                         case o.type 
  22052.                         when 'U' then 'TABLE'
  22053.                         when 'V' then 'VIEW'
  22054.                         when 'S' then 'SYSTEM TABLE'
  22055.                         end),
  22056.         TABLE_GUID        = convert(binary(16), null),
  22057.         BOOKMARKS        = convert(bit, 1),
  22058.         BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22059.         BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22060.         BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22061.         BOOKMARK_INFORMATION    = convert(int, 0),
  22062.         TABLE_VERSION        = convert(int, o.schema_ver),
  22063.         CARDINALITY        = x.rows,
  22064.         DESCRIPTION        = convert(varchar(1), null),
  22065.         TABLE_PROPID        = convert(int, null)
  22066.  
  22067.     from    sysusers u, 
  22068.         sysobjects o,
  22069.         sysindexes x
  22070.  
  22071.     where    o.type in ('U','V','S')
  22072.     and     o.name = @table_name
  22073.     and     (    @table_schema is null
  22074.         or    @table_schema = user_name(o.uid)
  22075.         )
  22076.     and     (
  22077.             @table_type is null
  22078.         or    @table_type = case o.type 
  22079.                     when 'U' then 'TABLE'
  22080.                     when 'V' then 'VIEW'
  22081.                     when 'S' then 'SYSTEM TABLE'
  22082.                     end
  22083.         )
  22084.     and    o.id *= x.id
  22085.     and    x.indid in (0,1)
  22086.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  22087.     and     (
  22088.         suser_id() = 1     /* User is the System Administrator */
  22089.         or o.uid = user_id()     /* User created the object */
  22090.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  22091.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  22092.             from sysprotects p
  22093.             /* join to correlate with all rows in sysobjects */
  22094.             where p.id = o.id
  22095.             /* get rows for public,current user,user's group */
  22096.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  22097.             /* check for SELECT,EXECUTE privilege */
  22098.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  22099.             ) = 1    /* final magic...compare Grants      */
  22100.         )        
  22101.     order by 4, 2, 3
  22102. go
  22103. dump tran master with no_log
  22104. go
  22105. create procedure sp_tables_info_rowset_64;2
  22106.     (
  22107.     @table_schema    varchar(255) = null,    
  22108.     @table_type    varchar(255) = null 
  22109.     )
  22110. as
  22111.     select    TABLE_CATALOG        = db_name(),
  22112.         TABLE_SCHEMA        = user_name(o.uid),
  22113.         TABLE_NAME        = o.name,
  22114.         TABLE_TYPE        = convert(varchar(30),
  22115.                         case o.type 
  22116.                         when 'U' then 'TABLE'
  22117.                         when 'V' then 'VIEW'
  22118.                         when 'S' then 'SYSTEM TABLE'
  22119.                         end),
  22120.         TABLE_GUID        = convert(binary(16), null),
  22121.         BOOKMARKS        = convert(bit, 1),
  22122.         BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22123.         BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22124.         BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22125.         BOOKMARK_INFORMATION    = convert(int, 0),
  22126.         TABLE_VERSION        = convert(int, o.schema_ver),
  22127.         CARDINALITY        = x.rows,
  22128.         DESCRIPTION        = convert(varchar(1), null),
  22129.         TABLE_PROPID        = convert(int, null)
  22130.  
  22131.     from    sysusers u, 
  22132.         sysobjects o,
  22133.         sysindexes x
  22134.  
  22135.     where    o.type in ('U','V','S')
  22136.     and     (    @table_schema is null
  22137.         or    @table_schema = user_name(o.uid)
  22138.         )
  22139.     and     (
  22140.             @table_type is null
  22141.         or    @table_type = case o.type 
  22142.                     when 'U' then 'TABLE'
  22143.                     when 'V' then 'VIEW'
  22144.                     when 'S' then 'SYSTEM TABLE'
  22145.                     end
  22146.         )
  22147.     and    o.id *= x.id
  22148.     and    x.indid in (0,1)
  22149.     and     u.uid = user_id() /* constrain sysusers uid for use in subquery */
  22150.     and     (
  22151.         suser_id() = 1     /* User is the System Administrator */
  22152.         or o.uid = user_id()     /* User created the object */
  22153.         /* here's the magic... select the highest precedence of permissions in the order (user,group,public)  */
  22154.         or (    (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
  22155.             from sysprotects p
  22156.             /* join to correlate with all rows in sysobjects */
  22157.             where p.id = o.id
  22158.             /* get rows for public,current user,user's group */
  22159.             and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
  22160.             /* check for SELECT,EXECUTE privilege */
  22161.             and (action in (193,224)))&1     /* more magic...normalize GRANT */
  22162.             ) = 1    /* final magic...compare Grants      */
  22163.         )        
  22164.     order by 4, 2, 3
  22165. go
  22166. dump tran master with no_log
  22167. go
  22168.  
  22169. if (charindex('7.00', @@version) > 0 or
  22170.     charindex('8.00', @@version) > 0)
  22171.     drop procedure sp_tables_info_rowset_64
  22172. else
  22173. begin
  22174.     print ''
  22175.     print ''
  22176.     print 'Warning:'
  22177.     print 'you are installing the stored procedures '
  22178.     print 'on a pre 7.0 SQL Server.'
  22179.     print 'Ignore the following errors.'
  22180. end
  22181. go
  22182.  
  22183. /*    Procedure for 7.0 server */
  22184. create procedure sp_tables_info_rowset_64
  22185.     (
  22186.     @table_name    sysname, 
  22187.     @table_schema    sysname = null,    
  22188.     @table_type    nvarchar(255) = null 
  22189.     )
  22190. as
  22191.     select    *
  22192.     from    (select    TABLE_CATALOG        = db_name(),
  22193.             TABLE_SCHEMA        = user_name(o.uid),
  22194.             TABLE_NAME        = o.name,
  22195.             TABLE_TYPE        = convert(nvarchar(30),
  22196.                             case o.type 
  22197.                             when 'U' then 
  22198.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22199.                                 then N'TABLE' else N'SYSTEM TABLE' end
  22200.                             when 'S' then N'SYSTEM TABLE'
  22201.                             when 'V' then 
  22202.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22203.                                 then N'VIEW' else N'SYSTEM VIEW' end
  22204.                             end),
  22205.             TABLE_GUID        = convert(uniqueidentifier, null),
  22206.             BOOKMARKS        = convert(bit, 1),
  22207.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22208.             BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22209.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22210.             BOOKMARK_INFORMATION    = convert(int, 0),
  22211.             TABLE_VERSION        = convert(int, o.schema_ver),
  22212.             CARDINALITY        = x.rows,
  22213.             DESCRIPTION        = convert(nvarchar(1), null),
  22214.             TABLE_PROPID        = convert(int, null) 
  22215.     
  22216.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  22217.         where    o.name = @table_name
  22218.         and     o.type in ('U','V','S')
  22219.         and    permissions(o.id) <> 0) as t
  22220.  
  22221.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  22222.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  22223.     order by 4, 2, 3
  22224. go
  22225. dump tran master with no_log
  22226. go
  22227. create procedure sp_tables_info_rowset_64;2
  22228.     (
  22229.     @table_schema    sysname = null,    
  22230.     @table_type    nvarchar(255) = null 
  22231.     )
  22232. as
  22233.     select    *
  22234.     from    (select    TABLE_CATALOG        = db_name(),
  22235.             TABLE_SCHEMA        = user_name(o.uid),
  22236.             TABLE_NAME        = o.name,
  22237.             TABLE_TYPE        = convert(nvarchar(30),
  22238.                             case o.type 
  22239.                             when 'U' then 
  22240.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22241.                                 then N'TABLE' else N'SYSTEM TABLE' end
  22242.                             when 'S' then N'SYSTEM TABLE'
  22243.                             when 'V' then 
  22244.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22245.                                 then N'VIEW' else N'SYSTEM VIEW' end
  22246.                             end),
  22247.             TABLE_GUID        = convert(uniqueidentifier, null),
  22248.             BOOKMARKS        = convert(bit, 1),
  22249.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22250.             BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22251.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22252.             BOOKMARK_INFORMATION    = convert(int, 0),
  22253.             TABLE_VERSION        = convert(int, o.schema_ver),
  22254.             CARDINALITY        = x.rows,
  22255.             DESCRIPTION        = convert(nvarchar(1), null),
  22256.             TABLE_PROPID        = convert(int, null) 
  22257.     
  22258.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  22259.         where     o.type in ('U','V','S')
  22260.         and    permissions(o.id) <> 0) as t
  22261.  
  22262.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  22263.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  22264.     order by 4, 2, 3
  22265. go
  22266.  
  22267. dump tran master with no_log
  22268. go
  22269.  
  22270. if (charindex('8.00', @@version) > 0)
  22271.     drop procedure sp_tables_info_rowset_64
  22272. else
  22273. begin
  22274.     print ''
  22275.     print ''
  22276.     print 'Warning:'
  22277.     print 'you are installing the stored procedures '
  22278.     print 'on a pre 8.0 SQL Server.'
  22279.     print 'Ignore the following errors.'
  22280. end
  22281. go
  22282.  
  22283. /*    Procedure for 8.0 server */
  22284. create procedure sp_tables_info_rowset_64
  22285.     (
  22286.     @table_name    sysname, 
  22287.     @table_schema    sysname = null,    
  22288.     @table_type    nvarchar(255) = null 
  22289.     )
  22290. as
  22291.     select    *
  22292.     from    (select    TABLE_CATALOG        = db_name(),
  22293.             TABLE_SCHEMA        = user_name(o.uid),
  22294.             TABLE_NAME        = o.name,
  22295.             TABLE_TYPE        = convert(nvarchar(30),
  22296.                             case o.type 
  22297.                             when 'U' then 
  22298.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22299.                                 then N'TABLE' else N'SYSTEM TABLE' end
  22300.                             when 'S' then N'SYSTEM TABLE'
  22301.                             when 'V' then 
  22302.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22303.                                 then N'VIEW' else N'SYSTEM VIEW' end
  22304.                             end),
  22305.             TABLE_GUID        = convert(uniqueidentifier, null),
  22306.             BOOKMARKS        = convert(bit, 1),
  22307.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22308.             BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22309.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22310.             BOOKMARK_INFORMATION    = convert(int, 0),
  22311.             TABLE_VERSION        = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
  22312.             CARDINALITY        = x.rows,
  22313.             DESCRIPTION        = convert(nvarchar(1), null),
  22314.             TABLE_PROPID        = convert(int, null) 
  22315.     
  22316.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  22317.         where    o.name = @table_name
  22318.         and     o.type in ('U','V','S')
  22319.         and    permissions(o.id) <> 0) as t
  22320.  
  22321.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  22322.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  22323.     order by 4, 2, 3
  22324. go
  22325. dump tran master with no_log
  22326. go
  22327. create procedure sp_tables_info_rowset_64;2
  22328.     (
  22329.     @table_schema    sysname = null,    
  22330.     @table_type    nvarchar(255) = null 
  22331.     )
  22332. as
  22333.     select    *
  22334.     from    (select    TABLE_CATALOG        = db_name(),
  22335.             TABLE_SCHEMA        = user_name(o.uid),
  22336.             TABLE_NAME        = o.name,
  22337.             TABLE_TYPE        = convert(nvarchar(30),
  22338.                             case o.type 
  22339.                             when 'U' then 
  22340.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22341.                                 then N'TABLE' else N'SYSTEM TABLE' end
  22342.                             when 'S' then N'SYSTEM TABLE'
  22343.                             when 'V' then 
  22344.                                 case when ObjectProperty(o.id, 'IsMSShipped') = 0
  22345.                                 then N'VIEW' else N'SYSTEM VIEW' end
  22346.                             end),
  22347.             TABLE_GUID        = convert(uniqueidentifier, null),
  22348.             BOOKMARKS        = convert(bit, 1),
  22349.             BOOKMARK_TYPE        = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
  22350.             BOOKMARK_DATATYPE    = convert(smallint, 21 /*DBTYPE_UI8 */),
  22351.             BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
  22352.             BOOKMARK_INFORMATION    = convert(int, 0),
  22353.             TABLE_VERSION        = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
  22354.             CARDINALITY        = x.rows,
  22355.             DESCRIPTION        = convert(nvarchar(1), null),
  22356.             TABLE_PROPID        = convert(int, null) 
  22357.     
  22358.         from    sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
  22359.         where     o.type in ('U','V','S')
  22360.         and    permissions(o.id) <> 0) as t
  22361.  
  22362.     where     (@table_schema is null or @table_schema = TABLE_SCHEMA)
  22363.     and     (@table_type is null or    @table_type = TABLE_TYPE)
  22364.     order by 4, 2, 3
  22365. go
  22366.  
  22367. grant execute on sp_tables_info_rowset_64 to public
  22368. go
  22369.  
  22370. dump tran master with no_log
  22371. go
  22372.  
  22373. if (charindex('6.00', @@version) > 0)
  22374.     begin
  22375.     if (exists (select * from sysobjects
  22376.         where name = 'sp_tables_info_rowset_64' and type = 'P '))
  22377.         begin
  22378.         drop procedure sp_tables_info_rowset_64
  22379.         dump tran master with no_log
  22380.         end
  22381.     end
  22382. go
  22383.  
  22384. print ''
  22385. print 'creating sp_table_constraints_rowset'
  22386. go
  22387.  
  22388.  
  22389. /*    Procedure for 6.50 and earlier servers */
  22390. create procedure sp_table_constraints_rowset
  22391.     (
  22392.     @table_name            varchar(255), 
  22393.     @table_schema        varchar(255) = null,
  22394.     @table_catalog        varchar(255) = null,
  22395.     @constraint_name    varchar(255) = null,
  22396.     @constraint_schema    varchar(255) = null,
  22397.     @constraint_catalog    varchar(255) = null,
  22398.     @constraint_type    varchar(255) = null 
  22399.     )
  22400. as
  22401.     select
  22402.         CONSTRAINT_CATALOG    = db_name(),
  22403.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  22404.         CONSTRAINT_NAME        = c_obj.name,
  22405.         TABLE_CATALOG        = db_name(),
  22406.         TABLE_SCHEMA        = user_name(t_obj.uid),
  22407.         TABLE_NAME            = t_obj.name,
  22408.         CONSTRAINT_TYPE        = case (c.status & 0xf)
  22409.                                 when 1 then 'PRIMARY KEY'
  22410.                                 when 2 then    'UNIQUE'
  22411.                                 when 3 then    'FOREIGN KEY'
  22412.                                 when 4 then    'CHECK'
  22413.                                  end, 
  22414.         IS_DEFERRABLE        = convert(tinyint, 0),
  22415.         INITIALLY_DEFERRED    = convert(tinyint, 0),
  22416.         DESCRIPTION            = convert(varchar(1), null)
  22417.  
  22418.     from 
  22419.         sysobjects c_obj, sysobjects t_obj, sysconstraints c
  22420.     where
  22421.             t_obj.name    = @table_name
  22422.         and t_obj.type in ('U','S')
  22423.         and (@table_catalog is null or @table_catalog = db_name())
  22424.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  22425.         and c.id = t_obj.id
  22426.         and (c.status & 0xf) between 1 and 4
  22427.         and c_obj.id    = c.constid
  22428.         and    c_obj.uid    = user_id()
  22429.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  22430.         and (@constraint_catalog is null or @constraint_catalog = db_name())
  22431.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  22432.         and (@constraint_type is null
  22433.             or (c.status & 0xf)
  22434.                 = case @constraint_type
  22435.                     when 'PRIMARY KEY' then 1
  22436.                     when 'UNIQUE' then 2
  22437.                     when 'FOREIGN KEY' then 3
  22438.                     when 'CHECK' then 4
  22439.                     end)
  22440. order by 2,3,5,6,7 
  22441. go
  22442. dump tran master with no_log
  22443. go
  22444. create procedure sp_table_constraints_rowset;2
  22445.     (
  22446.     @table_schema        varchar(255) = null,
  22447.     @table_catalog        varchar(255) = null,
  22448.     @constraint_name    varchar(255) = null,
  22449.     @constraint_schema    varchar(255) = null,
  22450.     @constraint_catalog    varchar(255) = null,
  22451.     @constraint_type    varchar(255) = null 
  22452.     )
  22453. as
  22454.     select
  22455.         CONSTRAINT_CATALOG    = db_name(),
  22456.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  22457.         CONSTRAINT_NAME        = c_obj.name,
  22458.         TABLE_CATALOG        = db_name(),
  22459.         TABLE_SCHEMA        = user_name(t_obj.uid),
  22460.         TABLE_NAME            = t_obj.name,
  22461.         CONSTRAINT_TYPE        = case (c.status & 0xf)
  22462.                                 when 1 then 'PRIMARY KEY'
  22463.                                 when 2 then    'UNIQUE'
  22464.                                 when 3 then    'FOREIGN KEY'
  22465.                                 when 4 then    'CHECK'
  22466.                                  end, 
  22467.         IS_DEFERRABLE        = convert(tinyint, 0),
  22468.         INITIALLY_DEFERRED    = convert(tinyint, 0),
  22469.         DESCRIPTION            = convert(varchar(1), null)
  22470.  
  22471.     from 
  22472.         sysobjects c_obj, sysobjects t_obj, sysconstraints c
  22473.     where
  22474.             t_obj.type in ('U','S')
  22475.         and (@table_catalog is null or @table_catalog = db_name())
  22476.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  22477.         and c.id = t_obj.id
  22478.         and (c.status & 0xf) between 1 and 4
  22479.         and c_obj.id    = c.constid
  22480.         and    c_obj.uid    = user_id()
  22481.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  22482.         and (@constraint_catalog is null or @constraint_catalog = db_name())
  22483.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  22484.         and (@constraint_type is null
  22485.             or (c.status & 0xf)
  22486.                 = case @constraint_type
  22487.                     when 'PRIMARY KEY' then 1
  22488.                     when 'UNIQUE' then 2
  22489.                     when 'FOREIGN KEY' then 3
  22490.                     when 'CHECK' then 4
  22491.                     end)
  22492. order by 2,3,5,6,7 
  22493. go
  22494. dump tran master with no_log
  22495. go
  22496.  
  22497.  
  22498. if (charindex('7.00', @@version) > 0 or
  22499.     charindex('8.00', @@version) > 0)
  22500.     drop procedure sp_table_constraints_rowset
  22501. else
  22502. begin
  22503.     print ''
  22504.     print ''
  22505.     print 'Warning:'
  22506.     print 'you are installing the stored procedures '
  22507.     print 'on a pre 8.0 SQL Server.'
  22508.     print 'Ignore the following errors.'
  22509. end
  22510. go
  22511.  
  22512. /*    Procedure for 8.0 server */
  22513. create procedure sp_table_constraints_rowset
  22514.     (
  22515.     @table_name            sysname, 
  22516.     @table_schema        sysname = null,
  22517.     @table_catalog        sysname = null,
  22518.     @constraint_name    sysname = null,
  22519.     @constraint_schema    sysname = null,
  22520.     @constraint_catalog    sysname = null,
  22521.     @constraint_type    nvarchar(255) = null 
  22522.     )
  22523. as
  22524.     select
  22525.         CONSTRAINT_CATALOG    = db_name(),
  22526.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  22527.         CONSTRAINT_NAME        = c_obj.name,
  22528.         TABLE_CATALOG        = db_name(),
  22529.         TABLE_SCHEMA        = user_name(t_obj.uid),
  22530.         TABLE_NAME            = t_obj.name,
  22531.         CONSTRAINT_TYPE        = case (c.status & 0xf)
  22532.                                 when 1 then N'PRIMARY KEY'
  22533.                                 when 2 then    N'UNIQUE'
  22534.                                 when 3 then    N'FOREIGN KEY'
  22535.                                 when 4 then    N'CHECK'
  22536.                                  end, 
  22537.         IS_DEFERRABLE        = convert(bit, 0),
  22538.         INITIALLY_DEFERRED    = convert(bit, 0),
  22539.         DESCRIPTION            = convert(nvarchar(1), null)
  22540.  
  22541.     from 
  22542.         sysobjects c_obj, sysobjects t_obj, sysconstraints c
  22543.     where
  22544.             t_obj.name    = @table_name
  22545.         and t_obj.type in ('U','S')
  22546.         and (@table_catalog is null or @table_catalog = db_name())
  22547.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  22548.         and c.id = t_obj.id
  22549.         and (c.status & 0xf) between 1 and 4
  22550.         and c_obj.id    = c.constid
  22551.         and    c_obj.uid    = user_id()
  22552.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  22553.         and (@constraint_catalog is null or @constraint_catalog = db_name())
  22554.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  22555.         and (@constraint_type is null
  22556.             or (c.status & 0xf)
  22557.                 = case @constraint_type
  22558.                     when N'PRIMARY KEY' then 1
  22559.                     when N'UNIQUE' then 2
  22560.                     when N'FOREIGN KEY' then 3
  22561.                     when N'CHECK' then 4
  22562.                     end)
  22563. order by 2,3,5,6,7 
  22564. go
  22565. dump tran master with no_log
  22566. go
  22567. create procedure sp_table_constraints_rowset;2
  22568.     (
  22569.     @table_schema        sysname = null,
  22570.     @table_catalog        sysname = null,
  22571.     @constraint_name    sysname = null,
  22572.     @constraint_schema    sysname = null,
  22573.     @constraint_catalog    sysname = null,
  22574.     @constraint_type    nvarchar(255) = null 
  22575.     )
  22576. as
  22577.     select
  22578.         CONSTRAINT_CATALOG    = db_name(),
  22579.         CONSTRAINT_SCHEMA    = user_name(c_obj.uid),
  22580.         CONSTRAINT_NAME        = c_obj.name,
  22581.         TABLE_CATALOG        = db_name(),
  22582.         TABLE_SCHEMA        = user_name(t_obj.uid),
  22583.         TABLE_NAME            = t_obj.name,
  22584.         CONSTRAINT_TYPE        = case (c.status & 0xf)
  22585.                                 when 1 then N'PRIMARY KEY'
  22586.                                 when 2 then    N'UNIQUE'
  22587.                                 when 3 then    N'FOREIGN KEY'
  22588.                                 when 4 then    N'CHECK'
  22589.                                  end, 
  22590.         IS_DEFERRABLE        = convert(bit, 0),
  22591.         INITIALLY_DEFERRED    = convert(bit, 0),
  22592.         DESCRIPTION            = convert(nvarchar(1), null)
  22593.  
  22594.     from 
  22595.         sysobjects c_obj, sysobjects t_obj, sysconstraints c
  22596.     where
  22597.             t_obj.type in ('U','S')
  22598.         and (@table_catalog is null or @table_catalog = db_name())
  22599.         and    (@table_schema is null or @table_schema = user_name(t_obj.uid))
  22600.         and c.id = t_obj.id
  22601.         and (c.status & 0xf) between 1 and 4
  22602.         and c_obj.id    = c.constid
  22603.         and    c_obj.uid    = user_id()
  22604.         and (@constraint_name is null or c_obj.name    = @constraint_name)
  22605.         and (@constraint_catalog is null or @constraint_catalog = db_name())
  22606.         and    (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
  22607.         and (@constraint_type is null
  22608.             or (c.status & 0xf)
  22609.                 = case @constraint_type
  22610.                     when N'PRIMARY KEY' then 1
  22611.                     when N'UNIQUE' then 2
  22612.                     when N'FOREIGN KEY' then 3
  22613.                     when N'CHECK' then 4
  22614.                     end)
  22615. order by 2,3,5,6,7 
  22616. go
  22617. dump tran master with no_log
  22618.  
  22619.  
  22620. grant execute on sp_table_constraints_rowset to public
  22621. go
  22622.  
  22623. dump tran master with no_log
  22624. go
  22625. if (charindex('6.00', @@version) > 0)
  22626.     begin
  22627.     if (exists (select * from sysobjects
  22628.             where name = 'sp_table_constraints_rowset' and type = 'P '))
  22629.         begin
  22630.         drop procedure sp_table_constraints_rowset
  22631.         dump tran master with no_log
  22632.         end
  22633.     end
  22634. go
  22635.  
  22636. print ''
  22637. print 'creating sp_table_privileges_rowset'
  22638. go
  22639.  
  22640. /*    Procedure for 6.0 and 6.5 server */
  22641. CREATE PROCEDURE sp_table_privileges_rowset
  22642.     (
  22643.     @table_name    varchar(255) = null,
  22644.     @table_schema    varchar(255) = null,
  22645.     @grantor    varchar(255) = null,
  22646.     @grantee    varchar(255) = null
  22647.     )
  22648. as
  22649. IF @table_name is not null
  22650.     BEGIN
  22651.     select
  22652.         GRANTOR        = user_name(p.grantor),
  22653.         GRANTEE        = user_name(u.uid),
  22654.         TABLE_CATALOG    = db_name(),
  22655.         TABLE_SCHEMA    = user_name(o.uid),
  22656.         TABLE_NAME    = o.name,
  22657.         PRIVILEGE_TYPE    = convert(varchar(30),
  22658.                     case p.action
  22659.                     when 193 then 'SELECT'
  22660.                     when 195 then 'INSERT'
  22661.                     when 196 then 'DELETE'
  22662.                     when 197 then 'UPDATE'
  22663.                     else 'REFERENCES'
  22664.                     end),
  22665.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  22666.     from 
  22667.         sysprotects p, sysobjects o, sysusers u
  22668.     where
  22669.         o.name = @table_name
  22670.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22671.     and    (@grantee is null or @grantee = user_name(u.uid))
  22672.     and     o.type in ('U','V','S')
  22673.     and    p.id = o.id
  22674.     and     (@grantor is null or @grantor = user_name(p.grantor))
  22675.             /* expand groups */
  22676.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  22677.     and     p.protecttype <> 206    /* only grant rows */
  22678.     and     p.action in (26,193,195,196,197)
  22679.     and     o.uid <> u.uid            /* no rows for owner */
  22680.     and     not exists (            /* exclude revoke'd privileges */
  22681.             select     *
  22682.             from     sysprotects p1
  22683.             where    p1.protecttype = 206
  22684.             and     p1.action = p.action
  22685.             and     p1.id = p.id
  22686.             and     p1.uid = u.uid)
  22687.     union
  22688.     select    /*    Add rows for table owner */
  22689.         GRANTOR        = user_name(u.uid),
  22690.         GRANTEE        = user_name(o.uid),
  22691.         TABLE_CATALOG    = db_name(),
  22692.         TABLE_SCHEMA    = user_name(o.uid),
  22693.         TABLE_NAME    = o.name,
  22694.         PRIVILEGE_TYPE    = convert(varchar(30),
  22695.                     case v.number
  22696.                     when 193 then 'SELECT'
  22697.                     when 195 then 'INSERT'
  22698.                     when 196 then 'DELETE'
  22699.                     when 197 then 'UPDATE'
  22700.                     else 'REFERENCES'
  22701.                     end),
  22702.         IS_GRANTABLE    = convert(bit,1)    
  22703.     from 
  22704.         sysobjects o, master.dbo.spt_values v, sysusers u
  22705.     where
  22706.         o.name = @table_name
  22707.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22708.     and    (@grantee is null or @grantee = user_name(o.uid))
  22709.     and     o.type in ('U','V','S')
  22710.     and     u.uid = 1        /* grantor is dbo of database */
  22711.     and    (@grantor is null or @grantor = user_name(u.uid))
  22712.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  22713.     and     v.number in (26,193,195,196,197)
  22714.     and     not exists (    /* exclude revoke'd privileges */
  22715.             select     *
  22716.             from     sysprotects p1
  22717.             where    p1.protecttype = 206
  22718.             and     p1.action = v.number
  22719.             and     p1.id = o.id
  22720.             and     p1.uid = o.uid)
  22721.     order by 4,5,6,1,2
  22722.     END
  22723. ELSE
  22724.     BEGIN
  22725.     select
  22726.         GRANTOR        = user_name(p.grantor),
  22727.         GRANTEE        = user_name(u.uid),
  22728.         TABLE_CATALOG    = db_name(),
  22729.         TABLE_SCHEMA    = user_name(o.uid),
  22730.         TABLE_NAME    = o.name,
  22731.         PRIVILEGE_TYPE    = convert(varchar(30),
  22732.                     case p.action
  22733.                     when 193 then 'SELECT'
  22734.                     when 195 then 'INSERT'
  22735.                     when 196 then 'DELETE'
  22736.                     when 197 then 'UPDATE'
  22737.                     else 'REFERENCES'
  22738.                     end),
  22739.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  22740.     from 
  22741.         sysprotects p, sysobjects o, sysusers u
  22742.     where
  22743.         o.type in ('U','V','S')
  22744.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22745.     and    (@grantee is null or @grantee = user_name(u.uid))
  22746.     and    p.id = o.id
  22747.     and     (@grantor is null or @grantor = user_name(p.grantor))
  22748.             /* expand groups */
  22749.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  22750.     and     p.protecttype <> 206    /* only grant rows */
  22751.     and     p.action in (26,193,195,196,197)
  22752.     and     o.uid <> u.uid            /* no rows for owner */
  22753.     and     not exists (            /* exclude revoke'd privileges */
  22754.             select     *
  22755.             from     sysprotects p1
  22756.             where    p1.protecttype = 206
  22757.             and     p1.action = p.action
  22758.             and     p1.id = p.id
  22759.             and     p1.uid = u.uid)
  22760.     union
  22761.     select    /*    Add rows for table owner */
  22762.         GRANTOR        = user_name(u.uid),
  22763.         GRANTEE        = user_name(o.uid),
  22764.         TABLE_CATALOG    = db_name(),
  22765.         TABLE_SCHEMA    = user_name(o.uid),
  22766.         TABLE_NAME    = o.name,
  22767.         PRIVILEGE_TYPE    = convert(varchar(30),
  22768.                     case v.number
  22769.                     when 193 then 'SELECT'
  22770.                     when 195 then 'INSERT'
  22771.                     when 196 then 'DELETE'
  22772.                     when 197 then 'UPDATE'
  22773.                     else 'REFERENCES'
  22774.                     end),
  22775.         IS_GRANTABLE    = convert(bit,1)    
  22776.     from 
  22777.         sysobjects o, master.dbo.spt_values v, sysusers u
  22778.     where
  22779.         o.type in ('U','V','S')
  22780.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22781.     and    (@grantee is null or @grantee = user_name(o.uid))
  22782.     and     u.uid = 1        /* grantor is dbo of database */
  22783.     and    (@grantor is null or @grantor = user_name(u.uid))
  22784.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  22785.     and     v.number in (26,193,195,196,197)
  22786.     and     not exists (    /* exclude revoke'd privileges */
  22787.             select     *
  22788.             from     sysprotects p1
  22789.             where    p1.protecttype = 206
  22790.             and     p1.action = v.number
  22791.             and     p1.id = o.id
  22792.             and     p1.uid = o.uid)
  22793.     order by 4,5,6,1,2
  22794.     END
  22795. go
  22796. dump tran master with no_log
  22797. go
  22798. CREATE PROCEDURE sp_table_privileges_rowset;2
  22799.     (
  22800.        @handle        int output,
  22801.        @scrollopt    int output,
  22802.     @ccopt        int output,
  22803.     @rows        int output,
  22804.     @table_name     varchar(255) = null,
  22805.     @table_schema    varchar(255) = null,
  22806.     @grantor    varchar(255) = null,
  22807.     @grantee    varchar(255) = null
  22808.     )
  22809. as
  22810. declare @ret int
  22811. SET NOCOUNT ON
  22812. create table #sptprivsrowset1
  22813.     (
  22814.     GRANTOR        sysname not null,
  22815.     GRANTEE        sysname not null,
  22816.     TABLE_CATALOG    sysname not null,
  22817.     TABLE_SCHEMA    sysname not null,
  22818.     TABLE_NAME    sysname not null,
  22819.     PRIVILEGE_TYPE    sysname not null,
  22820.     IS_GRANTABLE    bit not null
  22821.     )
  22822.     
  22823. IF @table_name is not null
  22824.     BEGIN
  22825.     insert into #sptprivsrowset1
  22826.     select
  22827.         GRANTOR        = user_name(p.grantor),
  22828.         GRANTEE        = user_name(u.uid),
  22829.         TABLE_CATALOG    = db_name(),
  22830.         TABLE_SCHEMA    = user_name(o.uid),
  22831.         TABLE_NAME    = o.name,
  22832.         PRIVILEGE_TYPE    = convert(varchar(30),
  22833.                     case p.action
  22834.                     when 193 then 'SELECT'
  22835.                     when 195 then 'INSERT'
  22836.                     when 196 then 'DELETE'
  22837.                     when 197 then 'UPDATE'
  22838.                     else 'REFERENCES'
  22839.                     end),
  22840.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  22841.     from 
  22842.         sysprotects p, sysobjects o, sysusers u
  22843.     where
  22844.         o.name = @table_name
  22845.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22846.     and    (@grantee is null or @grantee = user_name(u.uid))
  22847.     and     o.type in ('U','V','S')
  22848.     and    p.id = o.id
  22849.     and     (@grantor is null or @grantor = user_name(p.grantor))
  22850.             /* expand groups */
  22851.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  22852.     and     p.protecttype <> 206    /* only grant rows */
  22853.     and     p.action in (26,193,195,196,197)
  22854.     and     o.uid <> u.uid            /* no rows for owner */
  22855.     and     not exists (            /* exclude revoke'd privileges */
  22856.             select     *
  22857.             from     sysprotects p1
  22858.             where    p1.protecttype = 206
  22859.             and     p1.action = p.action
  22860.             and     p1.id = p.id
  22861.             and     p1.uid = u.uid)
  22862.     union
  22863.     select    /*    Add rows for table owner */
  22864.         GRANTOR        = user_name(u.uid),
  22865.         GRANTEE        = user_name(o.uid),
  22866.         TABLE_CATALOG    = db_name(),
  22867.         TABLE_SCHEMA    = user_name(o.uid),
  22868.         TABLE_NAME    = o.name,
  22869.         PRIVILEGE_TYPE    = convert(varchar(30),
  22870.                     case v.number
  22871.                     when 193 then 'SELECT'
  22872.                     when 195 then 'INSERT'
  22873.                     when 196 then 'DELETE'
  22874.                     when 197 then 'UPDATE'
  22875.                     else 'REFERENCES'
  22876.                     end),
  22877.         IS_GRANTABLE    = convert(bit,1)    
  22878.     from 
  22879.         sysobjects o, master.dbo.spt_values v, sysusers u
  22880.     where
  22881.         o.name = @table_name
  22882.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22883.     and    (@grantee is null or @grantee = user_name(o.uid))
  22884.     and     o.type in ('U','V','S')
  22885.     and     u.uid = 1        /* grantor is dbo of database */
  22886.     and    (@grantor is null or @grantor = user_name(u.uid))
  22887.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  22888.     and     v.number in (26,193,195,196,197)
  22889.     and     not exists (    /* exclude revoke'd privileges */
  22890.             select     *
  22891.             from     sysprotects p1
  22892.             where    p1.protecttype = 206
  22893.             and     p1.action = v.number
  22894.             and     p1.id = o.id
  22895.             and     p1.uid = o.uid)
  22896.     order by 4,5,6,1,2
  22897.     END
  22898. ELSE
  22899.     BEGIN
  22900.     insert into #sptprivsrowset1
  22901.     select
  22902.         GRANTOR        = user_name(p.grantor),
  22903.         GRANTEE        = user_name(u.uid),
  22904.         TABLE_CATALOG    = db_name(),
  22905.         TABLE_SCHEMA    = user_name(o.uid),
  22906.         TABLE_NAME    = o.name,
  22907.         PRIVILEGE_TYPE    = convert(varchar(30),
  22908.                     case p.action
  22909.                     when 193 then 'SELECT'
  22910.                     when 195 then 'INSERT'
  22911.                     when 196 then 'DELETE'
  22912.                     when 197 then 'UPDATE'
  22913.                     else 'REFERENCES'
  22914.                     end),
  22915.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  22916.     from 
  22917.         sysprotects p, sysobjects o, sysusers u
  22918.     where
  22919.         o.type in ('U','V','S')
  22920.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22921.     and    (@grantee is null or @grantee = user_name(u.uid))
  22922.     and    p.id = o.id
  22923.     and     (@grantor is null or @grantor = user_name(p.grantor))
  22924.             /* expand groups */
  22925.     and     ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
  22926.     and     p.protecttype <> 206    /* only grant rows */
  22927.     and     p.action in (26,193,195,196,197)
  22928.     and     o.uid <> u.uid            /* no rows for owner */
  22929.     and     not exists (            /* exclude revoke'd privileges */
  22930.             select     *
  22931.             from     sysprotects p1
  22932.             where    p1.protecttype = 206
  22933.             and     p1.action = p.action
  22934.             and     p1.id = p.id
  22935.             and     p1.uid = u.uid)
  22936.     union
  22937.     select    /*    Add rows for table owner */
  22938.         GRANTOR        = user_name(u.uid),
  22939.         GRANTEE        = user_name(o.uid),
  22940.         TABLE_CATALOG    = db_name(),
  22941.         TABLE_SCHEMA    = user_name(o.uid),
  22942.         TABLE_NAME    = o.name,
  22943.         PRIVILEGE_TYPE    = convert(varchar(30),
  22944.                     case v.number
  22945.                     when 193 then 'SELECT'
  22946.                     when 195 then 'INSERT'
  22947.                     when 196 then 'DELETE'
  22948.                     when 197 then 'UPDATE'
  22949.                     else 'REFERENCES'
  22950.                     end),
  22951.         IS_GRANTABLE    = convert(bit,1)    
  22952.     from 
  22953.         sysobjects o, master.dbo.spt_values v, sysusers u
  22954.     where
  22955.         o.type in ('U','V','S')
  22956.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  22957.     and    (@grantee is null or @grantee = user_name(o.uid))
  22958.     and     u.uid = 1        /* grantor is dbo of database */
  22959.     and    (@grantor is null or @grantor = user_name(u.uid))
  22960.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  22961.     and     v.number in (26,193,195,196,197)
  22962.     and     not exists (    /* exclude revoke'd privileges */
  22963.             select     *
  22964.             from     sysprotects p1
  22965.             where    p1.protecttype = 206
  22966.             and     p1.action = v.number
  22967.             and     p1.id = o.id
  22968.             and     p1.uid = o.uid)
  22969.     order by 4,5,6,1,2
  22970.     END
  22971.  
  22972. exec @ret = sp_cursoropen @handle output, 'select * from #sptprivsrowset1',
  22973.     @scrollopt output, @ccopt output, @rows output
  22974.  
  22975. drop table #sptprivsrowset1
  22976. return isnull(@ret,0)
  22977. go
  22978. dump tran master with no_log
  22979. go
  22980. CREATE PROCEDURE sp_table_privileges_rowset;3
  22981. as
  22982.     select
  22983.         GRANTOR        = convert(sysname, ' '),
  22984.         GRANTEE        = convert(sysname, ' '),
  22985.         TABLE_CATALOG    = convert(sysname, ' '),
  22986.         TABLE_SCHEMA    = convert(sysname, ' '),
  22987.         TABLE_NAME    = convert(sysname, ' '),
  22988.         PRIVILEGE_TYPE    = convert(varchar(30), ' '),
  22989.         IS_GRANTABLE    = convert(bit, 0)
  22990.     where    1=0
  22991. go
  22992.  
  22993. if (charindex('7.00', @@version) = 0 and
  22994.     charindex('8.00', @@version) = 0)
  22995. begin
  22996.     print ''
  22997.     print ''
  22998.     print 'Warning:'
  22999.     print 'you are installing the stored procedures '
  23000.     print 'on a pre 8.0 SQL Server.'
  23001.     print 'Ignore the following errors.'
  23002. end
  23003. else
  23004.     drop proc sp_table_privileges_rowset
  23005. go
  23006.  
  23007.  
  23008. /*    Procedure for 8.0 server */
  23009. CREATE PROCEDURE sp_table_privileges_rowset
  23010.     (
  23011.     @table_name         sysname,
  23012.     @table_schema        sysname = null,
  23013.     @grantor        sysname = null,
  23014.     @grantee        sysname = null
  23015.     )
  23016. as
  23017.     select
  23018.         GRANTOR        = user_name(p.grantor),
  23019.         GRANTEE        = user_name(u.uid),
  23020.         TABLE_CATALOG    = db_name(),
  23021.         TABLE_SCHEMA    = user_name(o.uid),
  23022.         TABLE_NAME    = o.name,
  23023.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  23024.                     case p.action
  23025.                     when 193 then N'SELECT'
  23026.                     when 195 then N'INSERT'
  23027.                     when 196 then N'DELETE'
  23028.                     when 197 then N'UPDATE'
  23029.                     else N'REFERENCES'
  23030.                     end),
  23031.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  23032.     from 
  23033.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  23034.     where
  23035.         o.name = @table_name
  23036.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  23037.     and    (@grantee is null or @grantee = user_name(u.uid))
  23038.     and     o.type in ('U','V','S')
  23039.     and    p.id = o.id
  23040.     and     (@grantor is null or @grantor = user_name(p.grantor))
  23041.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  23042.     and     (u.uid > 0 and u.uid < 16384)
  23043.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  23044.     and     p.protecttype <> 206    /* only grant rows */
  23045.     and     p.action in (26,193,195,196,197)
  23046.     and     o.uid <> u.uid            /* no rows for owner */
  23047.     and     not exists (            /* exclude revoke'd privileges */
  23048.             select     *
  23049.             from     sysprotects p1
  23050.             where    p1.protecttype = 206
  23051.             and     p1.action = p.action
  23052.             and     p1.id = p.id
  23053.             and     p1.uid = u.uid)
  23054.     union
  23055.     select    /*    Add rows for table owner */
  23056.         GRANTOR        = user_name(u.uid),
  23057.         GRANTEE        = user_name(o.uid),
  23058.         TABLE_CATALOG    = db_name(),
  23059.         TABLE_SCHEMA    = user_name(o.uid),
  23060.         TABLE_NAME    = o.name,
  23061.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  23062.                     case v.number
  23063.                     when 193 then N'SELECT'
  23064.                     when 195 then N'INSERT'
  23065.                     when 196 then N'DELETE'
  23066.                     when 197 then N'UPDATE'
  23067.                     else N'REFERENCES'
  23068.                     end),
  23069.         IS_GRANTABLE    = convert(bit,1)    
  23070.     from 
  23071.         sysobjects o, master.dbo.spt_values v, sysusers u
  23072.     where
  23073.         o.name = @table_name
  23074.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  23075.     and    (@grantee is null or @grantee = user_name(o.uid))
  23076.     and     o.type in ('U','V','S')
  23077.     and     u.uid = 1        /* grantor is dbo of database */
  23078.     and    (@grantor is null or @grantor = user_name(u.uid))
  23079.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  23080.     and     v.number in (26,193,195,196,197)
  23081.     and     not exists (    /* exclude revoke'd privileges */
  23082.             select     *
  23083.             from     sysprotects p1
  23084.             where    p1.protecttype = 206
  23085.             and     p1.action = v.number
  23086.             and     p1.id = o.id
  23087.             and     p1.uid = o.uid)
  23088.     order by 4,5,6,1,2
  23089. go
  23090. dump tran master with no_log
  23091. go
  23092. CREATE PROCEDURE sp_table_privileges_rowset;2
  23093.     (
  23094.     @table_schema        sysname = null,
  23095.     @grantor        sysname = null,
  23096.     @grantee        sysname = null
  23097.     )
  23098. as
  23099.     select
  23100.         GRANTOR        = user_name(p.grantor),
  23101.         GRANTEE        = user_name(u.uid),
  23102.         TABLE_CATALOG    = db_name(),
  23103.         TABLE_SCHEMA    = user_name(o.uid),
  23104.         TABLE_NAME    = o.name,
  23105.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  23106.                     case p.action
  23107.                     when 193 then N'SELECT'
  23108.                     when 195 then N'INSERT'
  23109.                     when 196 then N'DELETE'
  23110.                     when 197 then N'UPDATE'
  23111.                     else N'REFERENCES'
  23112.                     end),
  23113.         IS_GRANTABLE    = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
  23114.     from 
  23115.         sysprotects p, sysobjects o, sysusers u, sysmembers m
  23116.     where
  23117.         o.type in ('U','V','S')
  23118.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  23119.     and    (@grantee is null or @grantee = user_name(u.uid))
  23120.     and    p.id = o.id
  23121.     and     (@grantor is null or @grantor = user_name(p.grantor))
  23122.         /* expand groups - AKUNDONE: only 1 level of grp unrolling. */
  23123.     and     (u.uid > 0 and u.uid < 16384)
  23124.     and     ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
  23125.     and     p.protecttype <> 206    /* only grant rows */
  23126.     and     p.action in (26,193,195,196,197)
  23127.     and     o.uid <> u.uid            /* no rows for owner */
  23128.     and     not exists (            /* exclude revoke'd privileges */
  23129.             select     *
  23130.             from     sysprotects p1
  23131.             where    p1.protecttype = 206
  23132.             and     p1.action = p.action
  23133.             and     p1.id = p.id
  23134.             and     p1.uid = u.uid)
  23135.     union
  23136.     select    /*    Add rows for table owner */
  23137.         GRANTOR        = user_name(u.uid),
  23138.         GRANTEE        = user_name(o.uid),
  23139.         TABLE_CATALOG    = db_name(),
  23140.         TABLE_SCHEMA    = user_name(o.uid),
  23141.         TABLE_NAME    = o.name,
  23142.         PRIVILEGE_TYPE    = convert(nvarchar(30),
  23143.                     case v.number
  23144.                     when 193 then N'SELECT'
  23145.                     when 195 then N'INSERT'
  23146.                     when 196 then N'DELETE'
  23147.                     when 197 then N'UPDATE'
  23148.                     else N'REFERENCES'
  23149.                     end),
  23150.         IS_GRANTABLE    = convert(bit,1)    
  23151.     from 
  23152.         sysobjects o, master.dbo.spt_values v, sysusers u
  23153.     where
  23154.         o.type in ('U','V','S')
  23155.     and    (@table_schema is null or @table_schema = user_name(o.uid))
  23156.     and    (@grantee is null or @grantee = user_name(o.uid))
  23157.     and     u.uid = 1        /* grantor is dbo of database */
  23158.     and    (@grantor is null or @grantor = user_name(u.uid))
  23159.     and     v.type = 'P'    /* cross product to get all exposed privileges */
  23160.     and     v.number in (26,193,195,196,197)
  23161.     and     not exists (    /* exclude revoke'd privileges */
  23162.             select     *
  23163.             from     sysprotects p1
  23164.             where    p1.protecttype = 206
  23165.             and     p1.action = v.number
  23166.             and     p1.id = o.id
  23167.             and     p1.uid = o.uid)
  23168.     order by 4,5,6,1,2
  23169. go
  23170. dump tran master with no_log
  23171. go
  23172. create procedure sp_table_privileges_rowset;5
  23173.     (
  23174.     @table_server        sysname,
  23175.     @table_catalog        sysname = null,
  23176.     @table_name        sysname = null,
  23177.     @table_schema        sysname = null,
  23178.     @grantor        sysname = null,
  23179.     @grantee        sysname = null
  23180.     )
  23181. as
  23182.     select
  23183.         GRANTOR,        
  23184.         GRANTEE,        
  23185.         TABLE_CATALOG,    
  23186.         TABLE_SCHEMA,    
  23187.         TABLE_NAME,    
  23188.         PRIVILEGE_TYPE,    
  23189.         IS_GRANTABLE    
  23190.     from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
  23191.                 @table_server,
  23192.                 @table_catalog,
  23193.                 @table_schema,
  23194.                 @table_name,
  23195.                 @grantor,
  23196.                 @grantee >
  23197.     order by 3,4,5,6,1,2
  23198. go
  23199.  
  23200. grant execute on sp_table_privileges_rowset to public
  23201. go
  23202. dump tran master with no_log
  23203. go
  23204. if (charindex('6.00', @@version) > 0)
  23205.     begin
  23206.     if (exists (select * from sysobjects
  23207.         where name = 'sp_table_privileges_rowset' and type = 'P '))
  23208.         begin
  23209.         drop proc sp_table_privileges_rowset
  23210.         dump tran master with no_log
  23211.         end
  23212.     end
  23213. go
  23214.  
  23215.  
  23216. print ''
  23217. print 'creating sp_linkedservers_rowset'
  23218. go
  23219. if (charindex('7.00', @@version) = 0 and
  23220.     charindex('8.00', @@version) = 0)
  23221. begin
  23222.     print ''
  23223.     print ''
  23224.     print 'Warning:'
  23225.     print 'you are installing the stored procedures '
  23226.     print 'on a pre 8.0 SQL Server.'
  23227.     print 'Ignore the following errors.'
  23228. end
  23229. go
  23230. /*    Procedure for 8.0 server */
  23231. create proc sp_linkedservers_rowset
  23232.     (
  23233.     @srvname     sysname
  23234.     )
  23235. as
  23236.     select
  23237.         SVR_NAME         = srvname,
  23238.         SVR_PRODUCT        = srvproduct,
  23239.         SVR_PROVIDERNAME    = providername,
  23240.         SVR_DATASOURCE        = datasource,
  23241.         SVR_PROVIDERSTRING    = providerstring,
  23242.         SVR_LOCATION        = location,
  23243.         SVR_CATALOG        = catalog
  23244.     from master.dbo.sysservers
  23245.     where srvname = @srvname and (srvstatus & 128) = 128
  23246.     order by 1
  23247. go
  23248. dump tran master with no_log
  23249. go
  23250. create proc sp_linkedservers_rowset;2
  23251. as
  23252.     select
  23253.         SVR_NAME         = srvname,
  23254.         SVR_PRODUCT        = srvproduct,
  23255.         SVR_PROVIDERNAME    = providername,
  23256.         SVR_DATASOURCE        = datasource,
  23257.         SVR_PROVIDERSTRING    = providerstring,
  23258.         SVR_LOCATION        = location,
  23259.         SVR_CATALOG        = catalog
  23260.     from master.dbo.sysservers
  23261.     where (srvstatus & 128) = 128
  23262.     order by 1
  23263. go
  23264.  
  23265. grant execute on sp_linkedservers_rowset to public
  23266. go
  23267.  
  23268. dump tran master with no_log
  23269. go
  23270.  
  23271. print ''
  23272. print 'creating sp_table_statistics_rowset'
  23273. go
  23274. if (charindex('8.00', @@version) = 0)
  23275. begin
  23276.     print ''
  23277.     print ''
  23278.     print 'Warning:'
  23279.     print 'you are installing the stored procedures '
  23280.     print 'on a pre 8.00 SQL Server.'
  23281.     print 'Ignore the following errors.'
  23282. end
  23283. go
  23284. /*    Procedure for 8.00 server */
  23285. create proc sp_table_statistics_rowset
  23286. as
  23287.     select
  23288.         TABLE_CATALOG = convert(sysname, null),
  23289.         TABLE_SCHEMA = convert(sysname, null),
  23290.         TABLE_NAME = convert(sysname, null),
  23291.         STATISTICS_CATALOG = convert(sysname, null),
  23292.         STATISTICS_SCHEMA = convert(sysname, null),
  23293.         STATISTICS_NAME = convert(sysname, null),
  23294.         STATISTICS_TYPE = convert(smallint,0),
  23295.         COLUMN_NAME = convert(sysname, null),
  23296.         COLUMN_GUID = convert(uniqueidentifier, null),
  23297.         COLUMN_PROPID = convert(int, null),
  23298.         ORDINAL_POSITION = convert(int, null),
  23299.         SAMPLE_PCT = convert(smallint, null),
  23300.         LAST_UPDATE_TIME = convert(datetime, null),
  23301.         NO_OF_RANGES = convert(int, null),
  23302.         COLUMN_CARDINALITY = convert(bigint, null),
  23303.         TUPLE_CARDINALITY = convert(bigint, null),
  23304.         TABLE_CARDINALITY = convert(bigint, null),
  23305.         AVG_COLUMN_LENGTH = convert(int, null)
  23306.     where 1=0
  23307. go
  23308. dump tran master with no_log
  23309. go
  23310.  
  23311. create proc sp_table_statistics_rowset;2
  23312.                 (@table_catalog        sysname = null,
  23313.                 @table_schema        sysname = null,
  23314.                 @table_name        sysname = null,
  23315.                 @stat_catalog        sysname = null,
  23316.                 @stat_schema        sysname = null,
  23317.                 @stat_name        sysname = null)
  23318. as 
  23319. begin
  23320.     
  23321.     set nocount on
  23322.  
  23323.     -- check in parameters
  23324.     if ((@table_catalog is not null) and (db_name() <> @table_catalog)
  23325.         or (@stat_catalog is not null) and (db_name() <> @stat_catalog))
  23326.         begin    /* If qualifier doesn't match current database */
  23327.             raiserror 20001 '~~Rush_5~~'
  23328.             return
  23329.         end
  23330.  
  23331.     --- create temp table
  23332.     create table #spstattab(
  23333.         tblcatalog    sysname collate database_default not null,
  23334.         tblschema    sysname collate database_default not null,
  23335.         tblname        sysname collate database_default not null,
  23336.         statname    sysname collate database_default not null
  23337.         )
  23338.  
  23339.     insert into #spstattab
  23340.     select 
  23341.         db_name(),
  23342.         user_name(o.uid),
  23343.         o.name,
  23344.         x.name
  23345.     from sysobjects o, sysindexes x
  23346.     where o.type in ('U')
  23347.         and (@table_name is null or o.name = @table_name)
  23348.         and (@table_schema is null or @table_schema = user_name(o.uid))
  23349.         and (@stat_name is null or @stat_name = x.name)
  23350.         and (@stat_schema is null or @stat_schema = user_name(o.uid))
  23351.         and x.id = o.id
  23352.         and permissions(o.id) <> 0
  23353.         and x.statblob is not null
  23354.     order by 1,2,3,4
  23355.  
  23356.     -- fast forward CURSOR OVER THE temp TABLE
  23357.     declare ff_csr  cursor fast_forward for
  23358.     select tblcatalog, tblschema, tblname, statname from #spstattab
  23359.  
  23360.     declare @tblcatalog    sysname,
  23361.         @tblschema    sysname,
  23362.         @tblname    sysname,
  23363.         @statname    sysname,
  23364.         @qtbl        nvarchar(4000),
  23365.         @rowsetcount    int
  23366.  
  23367.     set @rowsetcount = 0
  23368.  
  23369.     open ff_csr
  23370.     fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname
  23371.     while @@fetch_status >= 0
  23372.     begin
  23373.         set @rowsetcount = @rowsetcount + 1
  23374.         set @qtbl = @tblcatalog + '.' + @tblschema + '.' + @tblname
  23375.         dbcc show_statistics(@qtbl, @statname) with stat_header join density_vector
  23376.         fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname
  23377.     end
  23378.     close ff_csr
  23379.     deallocate ff_csr
  23380.     
  23381.     --- drop temp table
  23382.     drop table #spstattab
  23383.  
  23384.     if @rowsetcount = 0
  23385.     begin
  23386.         select    
  23387.             TABLE_CATALOG = convert(sysname, null),
  23388.             TABLE_SCHEMA = convert(sysname, null),
  23389.             TABLE_NAME = convert(sysname, null),
  23390.             STATISTICS_CATALOG = convert(sysname, null),
  23391.             STATISTICS_SCHEMA = convert(sysname, null),
  23392.             STATISTICS_NAME = convert(sysname, null),
  23393.             STATISTICS_TYPE = convert(smallint,0),
  23394.             COLUMN_NAME = convert(sysname, null),
  23395.             COLUMN_GUID = convert(uniqueidentifier, null),
  23396.             COLUMN_PROPID = convert(int, null),
  23397.             ORDINAL_POSITION = convert(int, null),
  23398.             SAMPLE_PCT = convert(smallint, null),
  23399.             LAST_UPDATE_TIME = convert(datetime, null),
  23400.             NO_OF_RANGES = convert(int, null),
  23401.             COLUMN_CARDINALITY = convert(bigint, null),
  23402.             TUPLE_CARDINALITY = convert(bigint, null),
  23403.             TABLE_CARDINALITY = convert(bigint, null),
  23404.             AVG_COLUMN_LENGTH = convert(int, null)
  23405.         where 1=0
  23406.     end
  23407.  
  23408.     set nocount off
  23409. end
  23410. go
  23411.  
  23412. grant execute on sp_table_statistics_rowset to public
  23413. go
  23414.  
  23415. dump tran master with no_log
  23416. go
  23417.  
  23418. print ''
  23419. print 'creating sp_oledb_column_constraints'
  23420. go
  23421.  
  23422. /* Procedure for 6.5 server */
  23423. create procedure sp_oledb_column_constraints
  23424.     (@tblname varchar(225)        -- the table to check for constraints
  23425.     ,@colname varchar(225)        -- the column to check for constraints
  23426.     ,@dropcnst smallint)
  23427. as
  23428. begin
  23429.     -- PRELIM
  23430.     set nocount on
  23431.  
  23432.     declare    @tblid        int           -- the object id of the table
  23433.         ,@cnstname        varchar(225)   -- name of const. currently under consideration
  23434.         ,@cnstid        int
  23435.         ,@cnstatus        int
  23436.         ,@dbname        varchar(30)
  23437.  
  23438.     -- Create temp table
  23439.     create table #spcnsttab
  23440.     (cnst_name        varchar(225)        NOT NULL)
  23441.  
  23442.     -- Check to see that the object names are local to the current database.
  23443.     if @tblname like '%.%.%'
  23444.           and  substring(@tblname, 1, charindex('.', @tblname) - 1) <> db_name()
  23445.        begin
  23446.            raiserror(15250,-1,-1)
  23447.            return (1)
  23448.        end
  23449.     -- Check to see if the table exists and initialize @objid.
  23450.     select @tblid = object_id(@tblname)
  23451.     if @tblid is NULL
  23452.     begin
  23453.         select @dbname=db_name()
  23454.         raiserror(15009,-1,-1,@tblname,@dbname)
  23455.         return (1)
  23456.     end
  23457.  
  23458.     -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
  23459.     declare cnst_csr insensitive cursor for
  23460.         select c.constid, c.status, o.name 
  23461.         from sysconstraints c, sysobjects o 
  23462.         where c.id = @tblid and o.id = c.constid
  23463.             and ((c.status & 0xf)=1 and (@dropcnst & 16)<> 0
  23464.             or (c.status & 0xf)=2 and (@dropcnst & 32)<> 0 
  23465.             or (c.status & 0xf)=5 and (@dropcnst & 2)<> 0)    
  23466.         -- ONLY 6.5 sysconstraints objects
  23467.         for read only
  23468.  
  23469.     -- Now check out each constraint, figure out its type and keys and
  23470.     -- save the info in a temporary table that we'll print out at the end.
  23471.     open cnst_csr
  23472.     fetch cnst_csr into @cnstid, @cnstatus, @cnstname
  23473.     while @@fetch_status >= 0
  23474.     begin
  23475.         if ((@cnstatus & 0xf) in (1, 2)) ---- primary key, unique
  23476.             begin
  23477.                 -- get indid
  23478.                 declare @indid smallint
  23479.                 select    @indid = indid
  23480.                 from    sysindexes
  23481.                 where    name = object_name(@cnstid) and id = @tblid
  23482.  
  23483.                 if (@colname = index_col(@tblname, @indid, 1)) 
  23484.                     and (index_col(@tblname, @indid, 2) is null)
  23485.                     begin
  23486.                         -- ADD TO TABLE
  23487.                         insert into #spcnsttab
  23488.                         values (@cnstname)
  23489.                     end
  23490.             end
  23491.         else
  23492.         if (@cnstatus & 0xf) = 5
  23493.             begin
  23494.                 if (select col_name(id, colid) from sysconstraints where colid > 0 and constid=@cnstid) = @colname
  23495.                     begin
  23496.                         insert into #spcnsttab
  23497.                         values (@cnstname)
  23498.                     end
  23499.             end
  23500.  
  23501.         fetch cnst_csr into @cnstid ,@cnstatus ,@cnstname
  23502.     end        --of major loop
  23503.     close cnst_csr
  23504.     deallocate cnst_csr
  23505.  
  23506.     -- Now print out the contents of the temporary index table.
  23507.     select 'constraint_name' = cnst_name
  23508.     from #spcnsttab 
  23509.     
  23510.     drop table #spcnsttab
  23511.  
  23512.     set nocount off
  23513.     return (0)
  23514. end    
  23515. go
  23516. dump tran master with no_log
  23517. go
  23518.  
  23519. if (charindex('7.00', @@version) = 0 and
  23520.     charindex('8.00', @@version) = 0)
  23521. begin
  23522.     print ''
  23523.     print ''
  23524.     print 'Warning:'
  23525.     print 'you are installing the stored procedures '
  23526.     print 'on a pre 7.0 SQL Server.'
  23527.     print 'Ignore the following errors.'
  23528. end
  23529. else
  23530.     drop proc sp_oledb_column_constraints
  23531. go
  23532.  
  23533. /* Procedure for 7.0 server */
  23534. create procedure sp_oledb_column_constraints
  23535.     (@tblname nvarchar(776)        -- the table to check for constraints
  23536.     ,@colname nvarchar(776)        -- the column to check for constraints
  23537.     ,@dropcnst smallint)
  23538. as
  23539. begin
  23540.     -- PRELIM
  23541.     set nocount on
  23542.  
  23543.     declare    @tblid        int           -- the object id of the table
  23544.         ,@cnstname        sysname       -- name of const. currently under consideration
  23545.         ,@cnstid        int
  23546.         ,@cnsttype        character(2)
  23547.         ,@dbname        sysname
  23548.  
  23549.     -- Create temp table
  23550.     create table #spcnsttab
  23551.     (cnst_name        sysname        NOT NULL)
  23552.  
  23553.     -- Check to see that the object names are local to the current database.
  23554.     select @dbname = parsename(@tblname,3) 
  23555.     if @dbname is not null and @dbname <> db_name()
  23556.     begin
  23557.         raiserror(15250,-1,-1)
  23558.         return (1)
  23559.     end
  23560.  
  23561.     -- Check to see if the table exists and initialize @objid.
  23562.     select @tblid = object_id(@tblname)
  23563.     if @tblid is NULL
  23564.     begin
  23565.         select @dbname=db_name()
  23566.         raiserror(15009,-1,-1,@tblname,@dbname)
  23567.         return (1)
  23568.     end
  23569.  
  23570.     -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
  23571.     declare cnst_csr cursor fast_forward for
  23572.         select id, xtype, name 
  23573.         from sysobjects 
  23574.         where parent_obj = @tblid
  23575.             and ((xtype = 'PK' and (@dropcnst & 16)<> 0) 
  23576.             or (xtype = 'UQ' and (@dropcnst & 32)<> 0)
  23577.             or (xtype = 'D ' and (@dropcnst & 2)<> 0))    
  23578.         -- ONLY 6.5 sysconstraints objects
  23579.         for read only
  23580.  
  23581.     -- Now check out each constraint, figure out its type and keys and
  23582.     -- save the info in a temporary table that we'll print out at the end.
  23583.     open cnst_csr
  23584.     fetch cnst_csr into @cnstid, @cnsttype, @cnstname
  23585.     while @@fetch_status >= 0
  23586.     begin
  23587.         if @cnsttype in ('PK','UQ')
  23588.             begin
  23589.                 -- get indid
  23590.                 declare @indid smallint
  23591.                 select    @indid = indid
  23592.                 from    sysindexes
  23593.                 where    name = object_name(@cnstid) and id = @tblid
  23594.  
  23595.                 if (@colname = index_col(@tblname, @indid, 1)) 
  23596.                     and (index_col(@tblname, @indid, 2) is null)
  23597.                     begin
  23598.                         -- ADD TO TABLE
  23599.                         insert into #spcnsttab
  23600.                         values (@cnstname)
  23601.                     end
  23602.             end
  23603.         else
  23604.         if (@cnsttype = 'D ')
  23605.             begin
  23606.                 if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname
  23607.                     begin
  23608.                         insert into #spcnsttab
  23609.                         values (@cnstname)
  23610.                     end
  23611.             end
  23612.  
  23613.         fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname
  23614.     end        --of major loop
  23615.     close cnst_csr
  23616.     deallocate cnst_csr
  23617.  
  23618.     -- Now print out the contents of the temporary index table.
  23619.     select 'constraint_name' = cnst_name
  23620.     from #spcnsttab 
  23621.  
  23622.     drop table #spcnsttab
  23623.     
  23624.     set nocount off
  23625.     return (0)
  23626. end
  23627. go
  23628.  
  23629. if (charindex('8.00', @@version) = 0)
  23630. begin
  23631.     print ''
  23632.     print ''
  23633.     print 'Warning:'
  23634.     print 'you are installing the stored procedures '
  23635.     print 'on a pre 8.0 SQL Server.'
  23636.     print 'Ignore the following errors.'
  23637. end
  23638. else
  23639.     drop proc sp_oledb_column_constraints
  23640. go
  23641.  
  23642. /* Procedure for 8.0 server */
  23643. create procedure sp_oledb_column_constraints
  23644.     (@tblname nvarchar(776)        -- the table to check for constraints
  23645.     ,@colname nvarchar(776)        -- the column to check for constraints
  23646.     ,@dropcnst smallint)
  23647. as
  23648. begin
  23649.     -- PRELIM
  23650.     set nocount on
  23651.  
  23652.     declare    @tblid        int           -- the object id of the table
  23653.         ,@cnstname        sysname       -- name of const. currently under consideration
  23654.         ,@cnstid        int
  23655.         ,@cnsttype        character(2)
  23656.         ,@dbname        sysname
  23657.  
  23658.     -- Create temp table
  23659.     create table #spcnsttab
  23660.     (cnst_name        sysname        collate database_default NOT NULL)
  23661.  
  23662.     -- Check to see that the object names are local to the current database.
  23663.     select @dbname = parsename(@tblname,3) 
  23664.     if @dbname is not null and @dbname <> db_name()
  23665.     begin
  23666.         raiserror(15250,-1,-1)
  23667.         return (1)
  23668.     end
  23669.  
  23670.     -- Check to see if the table exists and initialize @objid.
  23671.     select @tblid = object_id(@tblname)
  23672.     if @tblid is NULL
  23673.     begin
  23674.         select @dbname=db_name()
  23675.         raiserror(15009,-1,-1,@tblname,@dbname)
  23676.         return (1)
  23677.     end
  23678.  
  23679.     -- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
  23680.     declare cnst_csr cursor fast_forward for
  23681.         select id, xtype, name 
  23682.         from sysobjects 
  23683.         where parent_obj = @tblid
  23684.             and ((xtype = 'PK' and (@dropcnst & 16)<> 0) 
  23685.             or (xtype = 'UQ' and (@dropcnst & 32)<> 0)
  23686.             or (xtype = 'D ' and (@dropcnst & 2)<> 0))    
  23687.         -- ONLY 6.5 sysconstraints objects
  23688.         for read only
  23689.  
  23690.     -- Now check out each constraint, figure out its type and keys and
  23691.     -- save the info in a temporary table that we'll print out at the end.
  23692.     open cnst_csr
  23693.     fetch cnst_csr into @cnstid, @cnsttype, @cnstname
  23694.     while @@fetch_status >= 0
  23695.     begin
  23696.         if @cnsttype in ('PK','UQ')
  23697.             begin
  23698.                 -- get indid
  23699.                 declare @indid smallint
  23700.                 select    @indid = indid
  23701.                 from    sysindexes
  23702.                 where    name = object_name(@cnstid) and id = @tblid
  23703.  
  23704.                 if (@colname = index_col(@tblname, @indid, 1)) 
  23705.                     and (index_col(@tblname, @indid, 2) is null)
  23706.                     begin
  23707.                         -- ADD TO TABLE
  23708.                         insert into #spcnsttab
  23709.                         values (@cnstname)
  23710.                     end
  23711.             end
  23712.         else
  23713.         if (@cnsttype = 'D ')
  23714.             begin
  23715.                 if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname
  23716.                     begin
  23717.                         insert into #spcnsttab
  23718.                         values (@cnstname)
  23719.                     end
  23720.             end
  23721.  
  23722.         fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname
  23723.     end        --of major loop
  23724.     close cnst_csr
  23725.     deallocate cnst_csr
  23726.  
  23727.     -- Now print out the contents of the temporary index table.
  23728.     select 'constraint_name' = cnst_name
  23729.     from #spcnsttab 
  23730.  
  23731.     drop table #spcnsttab
  23732.     
  23733.     set nocount off
  23734.     return (0)
  23735. end
  23736. go
  23737.  
  23738. grant execute on sp_oledb_column_constraints to public
  23739. go
  23740.  
  23741. dump tran master with no_log
  23742. go
  23743.  
  23744. print ''
  23745. print 'creating sp_oledb_indexinfo'
  23746. go
  23747.  
  23748. /* Procedure for 6.5 server */
  23749. create procedure sp_oledb_indexinfo
  23750.         @objname varchar(225)        -- the table to check for indexes
  23751.         ,@indname varchar(225)
  23752. as
  23753. begin
  23754.     -- PRELIM
  23755.     set nocount on
  23756.  
  23757.     declare @objid int,            -- the object id of the table
  23758.         @indid smallint,    -- the index id of an index
  23759.         @status int,
  23760.         @dbname    varchar(30),
  23761.         @OrigFillFactor tinyint,
  23762.         @i int, 
  23763.         @thiskey varchar(32),
  23764.         @tptr     varbinary(16) -- pointer for building text strings.
  23765.     ---- Check to see that the object names are local to the current database.
  23766.     if @objname like '%.%.%'
  23767.           and  substring(@objname, 1, charindex('.', @objname) - 1) <> db_name()
  23768.        begin
  23769.            raiserror(15250,-1,-1)
  23770.            return (1)
  23771.        end
  23772.     ---- Check to see if the table exists and initialize @objid.
  23773.     select @objid = object_id(@objname)
  23774.     ---- Table does not exist so return.
  23775.     if @objid is NULL
  23776.        begin
  23777.            select @dbname=db_name()
  23778.            raiserror(15009,-1,-1,@objname,@dbname)
  23779.            return (1)
  23780.        end
  23781.  
  23782.     select @indid = indid, @status = status, @OrigFillFactor = OrigFillFactor
  23783.     from sysindexes
  23784.     where id = @objid and name = @indname 
  23785.  
  23786.     -- IF NO INDEX, QUIT
  23787.     if @indid is NULL
  23788.     begin
  23789.         raiserror(15472,-1,-1) --'Object does not have any indexes.'
  23790.         return (1)
  23791.     end
  23792.     -- create temp table
  23793.     create table #spindtab
  23794.     (
  23795.         status                int,
  23796.         OrigFillFactor            tinyint,
  23797.         index_keys            text    NOT NULL,
  23798.     )
  23799.     -- Now check out each index, figure out its type and keys and
  23800.     -- First we'll figure out what the keys are.
  23801.     select @i = 1
  23802.     while (@i <= 16)
  23803.         begin
  23804.             select @thiskey = index_col(@objname, @indid, @i)
  23805.              if @thiskey is NULL
  23806.                     goto keysdone
  23807.              if @i=1
  23808.                 begin
  23809.                     insert into #spindtab
  23810.                     values (@status, @OrigFillFactor, @thiskey)
  23811.  
  23812.             select @tptr = textptr(index_keys) from #spindtab
  23813.                 end
  23814.              else
  23815.                 begin
  23816.                     select @thiskey = ', ' + @thiskey
  23817.  
  23818.             if @tptr is not null
  23819.                        updatetext #spindtab.index_keys @tptr null null @thiskey
  23820.                 end
  23821.  
  23822.         select @i = @i + 1
  23823.          end --loop 16
  23824.          ---- When we get here we now have all the keys.
  23825.  
  23826. keysdone:
  23827.     select * from #spindtab
  23828.     
  23829.     drop table #spindtab
  23830.     set nocount off
  23831.     return (0)
  23832. end
  23833. go
  23834. dump tran master with no_log
  23835. go
  23836.  
  23837. if (charindex('7.00', @@version) = 0 and
  23838.     charindex('8.00', @@version) = 0)
  23839. begin
  23840.     print ''
  23841.     print ''
  23842.     print 'Warning:'
  23843.     print 'you are installing the stored procedures '
  23844.     print 'on a pre 8.0 SQL Server.'
  23845.     print 'Ignore the following errors.'
  23846. end
  23847. else
  23848.     drop proc sp_oledb_indexinfo
  23849. go
  23850.  
  23851. /* Procedure for 8.0 server */
  23852. create proc sp_oledb_indexinfo
  23853.         @objname nvarchar(776)        -- the table to check for indexes
  23854.         ,@indname nvarchar(776)
  23855. as
  23856. begin
  23857.     -- PRELIM
  23858.     set nocount on
  23859.  
  23860.     declare @objid int,            -- the object id of the table
  23861.         @indid smallint,    -- the index id of an index
  23862.         @status int,
  23863.         @keys nvarchar(2078),-- string build index key list, length = (16*max_id_length)+(15*2)
  23864.         @dbname    sysname,
  23865.         @OrigFillFactor tinyint
  23866.  
  23867.     -- Check to see that the object names are local to the current database.
  23868.     select @dbname = parsename(@objname,3) 
  23869.  
  23870.     if @dbname is not null and @dbname <> db_name()
  23871.     begin
  23872.             raiserror(15250,-1,-1)
  23873.             return (1)
  23874.     end
  23875.  
  23876.     -- Check to see the the table exists and initialize @objid.
  23877.     select @objid = object_id(@objname)
  23878.     if @objid is NULL
  23879.     begin
  23880.         select @dbname=db_name()
  23881.         raiserror(15009,-1,-1,@objname,@dbname)
  23882.         return (1)
  23883.     end
  23884.  
  23885.     select @indid = indid, @status = status, @OrigFillFactor = OrigFillFactor
  23886.     from sysindexes
  23887.     where id = @objid and name = @indname 
  23888.  
  23889.     -- IF NO INDEX, QUIT
  23890.     if @indid is NULL
  23891.     begin
  23892.         raiserror(15472,-1,-1) --'Object does not have any indexes.'
  23893.         return (1)
  23894.     end
  23895.  
  23896.     -- First we'll figure out what the keys are.
  23897.     declare @i int, @thiskey sysname
  23898.     select @keys = index_col(@objname, @indid, 1),
  23899.         @i = 2, @thiskey = index_col(@objname, @indid, 2)
  23900.     while (@thiskey is not null )
  23901.     begin
  23902.         select @keys = @keys + ', ' + @thiskey, @i = @i + 1
  23903.         select @thiskey = index_col(@objname, @indid, @i)
  23904.     end
  23905.     -- DISPLAY THE RESULTS
  23906.     select 'Status'=@status, 'OrigFillFactor' =@OrigFillFactor, 'Index keys'=@keys
  23907.     set nocount off
  23908.     return (0) 
  23909. end
  23910. go
  23911.  
  23912. grant execute on sp_oledb_indexinfo to public
  23913. go
  23914.  
  23915. dump tran master with no_log
  23916. go
  23917.  
  23918. print ''
  23919. print 'creating sp_oledb_ro_usrname'
  23920. go
  23921.  
  23922. create procedure sp_oledb_ro_usrname
  23923. as
  23924. begin
  23925.     select substring('NY',status/1024&1+1,1),user_name() 
  23926.     from master..sysdatabases 
  23927.     where name=DB_NAME()
  23928. end
  23929. go
  23930.  
  23931. grant execute on sp_oledb_ro_usrname to public
  23932. go
  23933.  
  23934. dump tran master with no_log
  23935. go
  23936.  
  23937. if (charindex('6.00', @@version) > 0 or
  23938.     charindex('6.50', @@version) > 0 or
  23939.     charindex('7.00', @@version) > 0)
  23940.     begin
  23941.     if (exists (select * from sysobjects
  23942.         where name = 'sp_oledb_ro_usrname' and type = 'P '))
  23943.         begin
  23944.             drop proc sp_oledb_ro_usrname
  23945.             dump tran master with no_log
  23946.         end
  23947.     end
  23948. go
  23949.  
  23950. print ''
  23951. print 'creating sp_oledb_deflang'
  23952. go
  23953.  
  23954. if (charindex('8.00', @@version) = 0)
  23955. begin
  23956.     print ''
  23957.     print ''
  23958.     print 'Warning:'
  23959.     print 'you are installing the stored procedures '
  23960.     print 'on a pre 8.0 SQL Server.'
  23961.     print 'Ignore the following errors.'
  23962. end
  23963. go
  23964.  
  23965. create procedure sp_oledb_deflang
  23966. as
  23967.     begin
  23968.         select ISNULL(language,'us_english') 
  23969.         from master..syslogins 
  23970.         where sid=SUSER_SID()
  23971.     end
  23972. go
  23973.  
  23974. grant execute on sp_oledb_deflang to public
  23975. go
  23976.  
  23977. dump tran master with no_log
  23978. go
  23979.  
  23980. if (charindex('6.00', @@version) > 0 or
  23981.     charindex('6.50', @@version) > 0 or
  23982.     charindex('7.00', @@version) > 0)
  23983.     begin
  23984.     if (exists (select * from sysobjects
  23985.         where name = 'sp_oledb_deflang' and type = 'P '))
  23986.         begin
  23987.             drop proc sp_oledb_deflang
  23988.             dump tran master with no_log
  23989.         end
  23990.     end
  23991. go
  23992.  
  23993. print ''
  23994. print 'creating sp_oledb_defdb'
  23995. go
  23996.  
  23997. if (charindex('8.00', @@version) = 0)
  23998. begin
  23999.     print ''
  24000.     print ''
  24001.     print 'Warning:'
  24002.     print 'you are installing the stored procedures '
  24003.     print 'on a pre 8.0 SQL Server.'
  24004.     print 'Ignore the following errors.'
  24005. end
  24006. go
  24007.  
  24008. create procedure sp_oledb_defdb
  24009. as
  24010.     begin
  24011.         select dbname from master..syslogins where sid=SUSER_SID()
  24012.     end
  24013. go
  24014.  
  24015. grant execute on sp_oledb_defdb to public
  24016. go
  24017.  
  24018. dump tran master with no_log
  24019. go
  24020.  
  24021. if (charindex('6.00', @@version) > 0 or
  24022.     charindex('6.50', @@version) > 0 or
  24023.     charindex('7.00', @@version) > 0)
  24024.     begin
  24025.     if (exists (select * from sysobjects
  24026.         where name = 'sp_oledb_defdb' and type = 'P '))
  24027.         begin
  24028.             drop proc sp_oledb_defdb
  24029.             dump tran master with no_log
  24030.         end
  24031.     end
  24032. go
  24033.  
  24034. print ''
  24035. print 'creating sp_oledb_database'
  24036. go
  24037.  
  24038. create procedure sp_oledb_database
  24039. as
  24040.     begin
  24041.         select name from master..sysdatabases
  24042.     end
  24043. go
  24044.  
  24045. grant execute on sp_oledb_database to public
  24046. go
  24047.  
  24048. dump tran master with no_log
  24049. go
  24050.  
  24051. if (charindex('6.00', @@version) > 0 or
  24052.     charindex('6.50', @@version) > 0 or
  24053.     charindex('7.00', @@version) > 0)
  24054.     begin
  24055.     if (exists (select * from sysobjects
  24056.         where name = 'sp_oledb_database' and type = 'P '))
  24057.         begin
  24058.             drop proc sp_oledb_database
  24059.             dump tran master with no_log
  24060.         end
  24061.     end
  24062. go
  24063.  
  24064. print ''
  24065. print 'creating sp_oledb_language'
  24066. go
  24067.  
  24068. create procedure sp_oledb_language
  24069. as
  24070. begin
  24071.     select 'English','us_english' 
  24072.     union 
  24073.     select alias,name from master..syslanguages
  24074. end
  24075. go
  24076.  
  24077. grant execute on sp_oledb_language to public
  24078. go
  24079.  
  24080. dump tran master with no_log
  24081. go
  24082. if (charindex('6.00', @@version) > 0 or
  24083.     charindex('6.50', @@version) > 0 or
  24084.     charindex('7.00', @@version) > 0)
  24085.     begin
  24086.     if (exists (select * from sysobjects
  24087.         where name = 'sp_oledb_language' and type = 'P '))
  24088.         begin
  24089.             drop proc sp_oledb_language
  24090.             dump tran master with no_log
  24091.         end
  24092.     end
  24093. go
  24094.  
  24095. /*---------------------------- END OLEDB CATALOG PROCS ------------------------*/
  24096.  
  24097.  
  24098. /*---------------------------- BEGIN BCP CATALOG PROCS ------------------------*/
  24099.  
  24100. print 'creating sp_tablecollations'
  24101. go
  24102.  
  24103. /* Used by BCP to gather all the collation names for a table */
  24104. if (charindex('8.00', @@version) = 0)
  24105. begin
  24106.     print ''
  24107.     print ''
  24108.     print 'Warning:'
  24109.     print 'you are installing the stored procedures '
  24110.     print 'on a pre 8.0 SQL Server.'
  24111.     print 'Ignore the following errors.'
  24112. end
  24113. go
  24114.  
  24115. /* Procedure for 8.0 server */
  24116. create procedure sp_tablecollations (@object nvarchar(4000))
  24117. as
  24118. begin
  24119.     select c.colid,
  24120.            c.name, 
  24121.            tds_collation = c.tdscollation,
  24122.            collation_name = BCPCollationName(c.tdscollation, c.xtype)
  24123.     from syscolumns c inner join sysobjects t on c.id = t.id
  24124.     where t.id = object_id(@object, 'local')
  24125.     order by c.colid
  24126. end
  24127. go
  24128.  
  24129. grant execute on sp_tablecollations to public
  24130. go
  24131.  
  24132. print 'creating sp_bcp_dbcmptlevel'
  24133. go
  24134.  
  24135. /* Used by BCP to get current db compatibility level */
  24136. if (charindex('8.00', @@version) = 0)
  24137. begin
  24138.     print ''
  24139.     print ''
  24140.     print 'Warning:'
  24141.     print 'you are installing the stored procedures '
  24142.     print 'on a pre 8.0 SQL Server.'
  24143.     print 'Ignore the following errors.'
  24144. end
  24145. go
  24146.  
  24147. /* Procedure for 8.0 server */
  24148. create procedure sp_bcp_dbcmptlevel (@dbname sysname)
  24149. as
  24150. begin
  24151.     select cmptlevel
  24152.     from master.dbo.sysdatabases
  24153.     where name = @dbname
  24154. end
  24155. go
  24156.  
  24157. grant execute on sp_bcp_dbcmptlevel to public
  24158. go
  24159.  
  24160. /*---------------------------- END BCP CATALOG PROCS ------------------------*/
  24161.  
  24162. dump tran master with no_log
  24163. go
  24164.  
  24165.  
  24166.  
  24167.  
  24168. if (exists (select * from sysobjects
  24169.         where name = 'sp_configure' and type = 'P '))
  24170.     begin
  24171.         exec sp_configure 'allow updates',0
  24172.         reconfigure with override
  24173.     end
  24174. go
  24175.  
  24176. exec sp_MS_upd_sysobj_category 2 /* set category | 2 based on crdate. */
  24177.  
  24178. go
  24179.  
  24180. if exists (select * from sysobjects where name = 'sp_check_objects'
  24181.             and type = 'P ')
  24182.     begin
  24183.         /* Only supported on 6.0 servers */
  24184.         print ''
  24185.         print 'Checking objects created by instcat.sql.'
  24186.  
  24187.         exec sp_check_objects 'catalog'
  24188.     end
  24189. go
  24190.  
  24191. print ''
  24192. print 'instcat.sql completed successfully.'
  24193. go
  24194.  
  24195. set quoted_identifier off
  24196. go
  24197.  
  24198. dump tran master with no_log
  24199. go
  24200. checkpoint
  24201. go
  24202. /**/
  24203.