Skip to content

Instantly share code, notes, and snippets.

@poychang
Created July 19, 2016 03:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save poychang/c6752e06d7d79bffba121cc7a07fae87 to your computer and use it in GitHub Desktop.
Save poychang/c6752e06d7d79bffba121cc7a07fae87 to your computer and use it in GitHub Desktop.
解決從 64 位元 SQL Server 用戶端對連結 32 位元 SQL Server 伺服器執行分散式查詢時,可能會收到錯誤訊息
This file has been truncated, but you can view the full file.
/*
** INSTCAT.SQL
** Installs catalog stored procedures on the Microsoft SQL Server.
** Copyright Microsoft, Inc. 1994 - 2000
** All Rights Reserved.
**
** Owners:
**
** <owner current="true" primary="true">iliak</owner>
*/
/*
INTERNAL NOTE:
When this file is updated, you MUST change the last row inserted into
spt_server_info to be version number of this file. the convention is
j.nn.bbb, where j is the major version number ('7' now), nn is the minor
version number ('10' now), and bbb is the build number.
insert into spt_server_info
values (500, 'SYS_SPROC_VERSION', '8.00.bbb')
*/
/****************************************************************************/
/* This portion sets up the ability to perform all the functions in this */
/* script */
/****************************************************************************/
go
use master
go
dump tran master with no_log
go
set quoted_identifier on
go
if (exists (select * from sysobjects
where name = 'sp_configure' and type = 'P '))
begin
execute sp_configure 'update',1
end
reconfigure with override
go
exec sp_MS_upd_sysobj_category 1 /*Capture datetime for use below.*/
go
/*
** If old versions of tables exist, drop them.
*/
if (exists (select * from sysobjects
where name = 'MSdatatype_info' and type = 'U '))
drop table MSdatatype_info
go
if (exists (select * from sysobjects
where name = 'MSdatatype_info_ext' and type = 'U '))
drop table MSdatatype_info_ext
go
if (exists (select * from sysobjects
where name = 'MStable_types' and type = 'U '))
drop table MStable_types
go
if (exists (select * from sysobjects
where name = 'MSserver_info' and type = 'U '))
drop table MSserver_info
go
if (exists (select * from sysobjects
where name = 'spt_table_types' and type = 'U '))
drop table spt_table_types
go
/*
** If tables or procs already exist, drop them.
*/
if (exists (select * from sysobjects
where name = 'spt_datatype_info' and type = 'U '))
drop table spt_datatype_info
go
if (exists (select * from sysobjects
where name = 'spt_datatype_info_ext' and type = 'U '))
drop table spt_datatype_info_ext
go
if (exists (select * from sysobjects
where name = 'sp_add_server_sortinfo' and type = 'P '))
drop proc sp_add_server_sortinfo
go
if (exists (select * from sysobjects
where name = 'sp_add_server_sortinfo75' and type = 'P '))
drop proc sp_add_server_sortinfo75
go
if (exists (select * from sysobjects
where name = 'spt_server_info' and type = 'U '))
drop table spt_server_info
go
if (exists (select * from sysobjects
where name = 'sp_tables' and type = 'P '))
drop proc sp_tables
go
if (exists (select * from sysobjects
where name = 'sp_statistics' and type = 'P '))
drop proc sp_statistics
go
if (exists (select * from sysobjects
where name = 'sp_columns' and type = 'P '))
drop proc sp_columns
go
if (exists (select * from sysobjects
where name = 'sp_fkeys' and type = 'P '))
drop proc sp_fkeys
go
if (exists (select * from sysobjects
where name = 'sp_pkeys' and type = 'P '))
drop proc sp_pkeys
dump tran master with no_log
go
go
if (exists (select * from sysobjects
where name = 'sp_stored_procedures' and type = 'P '))
drop proc sp_stored_procedures
go
if (exists (select * from sysobjects
where name = 'sp_sproc_columns' and type = 'P '))
drop proc sp_sproc_columns
go
if (exists (select * from sysobjects
where name = 'sp_table_privileges' and type = 'P '))
drop proc sp_table_privileges
go
if (exists (select * from sysobjects
where name = 'sp_column_privileges' and type = 'P '))
drop proc sp_column_privileges
go
dump tran master with no_log
go
if (exists (select * from sysobjects
where name = 'sp_server_info' and type = 'P '))
drop proc sp_server_info
go
if (exists (select * from sysobjects
where name = 'sp_datatype_info' and type = 'P '))
drop proc sp_datatype_info
go
if (exists (select * from sysobjects
where name = 'sp_special_columns' and type = 'P '))
drop proc sp_special_columns
go
if (exists (select * from sysobjects
where name = 'sp_databases' and type = 'P '))
drop proc sp_databases
go
dump tran master with no_log
go
if (exists (select * from sysobjects
where name = 'sp_ddopen' and type = 'P '))
drop proc sp_ddopen
go
if (exists (select * from sysobjects
where name = 'sp_tableswc' and type = 'P '))
drop proc sp_tableswc
go
if (exists (select * from sysobjects
where name = 'sp_tablecollations' and type = 'P'))
drop proc sp_tablecollations
go
if (exists (select * from sysobjects
where name = 'sp_bcp_dbcmptlevel' and type = 'P'))
drop proc sp_bcp_dbcmptlevel
go
dump tran master with no_log
go
if (exists (select * from sysobjects
where name = 'spt_provider_types' and type = 'U '))
begin
drop table spt_provider_types
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_catalogs_rowset' and type = 'P '))
begin
drop procedure sp_catalogs_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_column_privileges_rowset' and type = 'P '))
begin
drop procedure sp_column_privileges_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_columns_rowset' and type = 'P '))
begin
drop procedure sp_columns_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_check_constraints_rowset' and type = 'P '))
begin
drop procedure sp_check_constraints_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_check_constbytable_rowset' and type = 'P '))
begin
drop procedure sp_check_constbytable_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_foreign_keys_rowset' and type = 'P '))
begin
drop procedure sp_foreign_keys_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_indexes_rowset' and type = 'P '))
begin
drop procedure sp_indexes_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_primary_keys_rowset' and type = 'P '))
begin
drop procedure sp_primary_keys_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_procedure_params_rowset' and type = 'P '))
begin
drop procedure sp_procedure_params_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_procedures_rowset' and type = 'P '))
begin
drop procedure sp_procedures_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_provider_types_rowset' and type = 'P '))
begin
drop procedure sp_provider_types_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_schemata_rowset' and type = 'P '))
begin
drop procedure sp_schemata_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_statistics_rowset' and type = 'P '))
begin
drop procedure sp_statistics_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_tables_rowset' and type = 'P '))
begin
drop procedure sp_tables_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_tables_info_rowset' and type = 'P '))
begin
drop procedure sp_tables_info_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_tables_info_rowset_64' and type = 'P '))
begin
drop procedure sp_tables_info_rowset_64
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_table_constraints_rowset' and type = 'P '))
begin
drop proc sp_table_constraints_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_table_privileges_rowset' and type = 'P '))
begin
drop proc sp_table_privileges_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_linkedservers_rowset' and type = 'P '))
begin
drop proc sp_linkedservers_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_table_statistics_rowset' and type = 'P '))
begin
drop proc sp_table_statistics_rowset
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_column_constraints' and type = 'P '))
begin
drop proc sp_oledb_column_constraints
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_indexinfo' and type = 'P '))
begin
drop proc sp_oledb_indexinfo
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_ro_usrname' and type = 'P '))
begin
drop proc sp_oledb_ro_usrname
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_deflang' and type = 'P '))
begin
drop proc sp_oledb_deflang
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_defdb' and type = 'P '))
begin
drop proc sp_oledb_defdb
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_database' and type = 'P '))
begin
drop proc sp_oledb_database
dump tran master with no_log
end
go
if (exists (select * from sysobjects
where name = 'sp_oledb_language' and type = 'P '))
begin
drop proc sp_oledb_language
dump tran master with no_log
end
go
print 'creating table spt_datatype_info_ext'
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Pre 6.0 server */
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
create table spt_datatype_info_ext (
user_type smallint not null,
CREATE_PARAMS varchar(32) null,
AUTO_INCREMENT smallint null,
typename varchar(32))
end
go
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* 6.0 or later server */
create table spt_datatype_info_ext (
user_type smallint not null,
CREATE_PARAMS varchar(32) null,
AUTO_INCREMENT smallint null,
typename sysname) /* from systypes, to avoid xusertype hard-code */
end
go
grant select on spt_datatype_info_ext to public
go
insert into spt_datatype_info_ext
/* CHAR user_type, create_params, auto_increment */
values (1, 'length' ,0, 'char')
insert into spt_datatype_info_ext
/* VARCHAR user_type, create_params, auto_increment */
values (2, 'max length' ,0, 'varchar')
insert into spt_datatype_info_ext
/* BINARY user_type, create_params, auto_increment */
values (3, 'length' ,0, 'binary')
insert into spt_datatype_info_ext
/* VARBINARY user_type, create_params, auto_increment */
values (4, 'max length' ,0, 'varbinary')
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Add 6.0 data types */
insert into spt_datatype_info_ext
/* DECIMAL user_type, create_params, auto_increment */
values (26, 'precision,scale' ,0, 'decimal')
insert into spt_datatype_info_ext
/* NUMERIC user_type, create_params, auto_increment */
values (25, 'precision,scale' ,0, 'numeric')
insert into spt_datatype_info_ext
/* DECIMAL IDENTITY user_type, create_params, auto_increment */
values (26, 'precision' ,1, 'decimal')
insert into spt_datatype_info_ext
/* NUMERIC IDENTITY user_type, create_params, auto_increment */
values (25, 'precision' ,1, 'numeric')
end
else /* Pre 6.0 server, add SYSNAME create param */
begin
insert into spt_datatype_info_ext
/* SYSNAME user_type, create_param, auto_increments */
values (18, 'max length' ,0, 'sysname')
end
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Update usertypes for 8.0 server */
begin tran
insert into spt_datatype_info_ext
/* NCHAR user_type, create_params, auto_increment */
values (0, 'length' ,0, 'nchar')
insert into spt_datatype_info_ext
/* NVARCHAR user_type, create_params, auto_increment */
values (0, 'max length' ,0, 'nvarchar')
/* SET user_type TO SPHINX VALUES */
update spt_datatype_info_ext set user_type = xusertype
from spt_datatype_info_ext e, systypes t where t.name = e.typename
commit tran
end
go
create unique clustered index datatypeinfoextclust on spt_datatype_info_ext(user_type,AUTO_INCREMENT)
go
print 'creating table spt_datatype_info'
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Pre 6.0 server */
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
create table spt_datatype_info (
ss_dtype tinyint not null,
fixlen int null, /* datatype len for variable, else null */
ODBCVer tinyint null, /* version if needed, else null */
TYPE_NAME varchar(32) not null,
DATA_TYPE smallint not null,
data_precision int null,
numeric_scale smallint null, /* min scale if 6.0 */
RADIX smallint null,
length int null,
LITERAL_PREFIX varchar(32) null,
LITERAL_SUFFIX varchar(32) null,
CREATE_PARAMS varchar(32) null,
NULLABLE smallint not null,
CASE_SENSITIVE smallint not null,
SEARCHABLE smallint not null,
UNSIGNED_ATTRIBUTE smallint null,
MONEY smallint not null,
AUTO_INCREMENT smallint null,
LOCAL_TYPE_NAME varchar(32) null,
charbin tinyint null, /* 0 for char/binary types, NULL for all others */
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null)
end
go
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* 6.0 or later server */
create table spt_datatype_info (
ss_dtype tinyint not null,
fixlen int null, /* datatype len for variable, else null */
ODBCVer tinyint null, /* version if needed, else null */
TYPE_NAME sysname not null,
DATA_TYPE smallint not null,
data_precision int null,
numeric_scale smallint null, /* min scale if 6.0 */
RADIX smallint null,
length int null,
LITERAL_PREFIX varchar(32) null,
LITERAL_SUFFIX varchar(32) null,
CREATE_PARAMS varchar(32) null,
NULLABLE smallint not null,
CASE_SENSITIVE smallint not null,
SEARCHABLE smallint not null,
UNSIGNED_ATTRIBUTE smallint null,
MONEY smallint not null,
AUTO_INCREMENT smallint null,
LOCAL_TYPE_NAME sysname null,
charbin tinyint null, /* 0 for char/binary types, NULL for all others */
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null)
end
go
grant select on spt_datatype_info to public
go
/* Get case sensitivity */
if 'A' = 'A' /* create dummy begin block */
begin
declare @case smallint
begin tran
select @case = 0
select @case = 1 where 'a' <> 'A'
/* Local Binary */
insert into spt_datatype_info values
(45,null,null,'binary',-2,null,null,null,null,'0x',null,'length',1,0,2,null,0,null,'binary',0,-2,null)
/* Local Bit */
insert into spt_datatype_info values
(50,null,null,'bit',-7,1,0,null,1,null,null,null,0,0,2,null,0,null,'bit',null,-7,null)
/* Local Char */
insert into spt_datatype_info values
(47,null,null,'char',1,null,null,null,null,'''','''','length',1,@case,3,null,0,null,'char',0,1,null)
/* Local Datetime */
insert into spt_datatype_info values
(61,8,2,'datetime',11,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
insert into spt_datatype_info values
(61,8,3,'datetime',93,23,3,NULL,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
/* Local Smalldatetime */
insert into spt_datatype_info values
(58,4,2,'smalldatetime',11,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
insert into spt_datatype_info values
(58,4,3,'smalldatetime',93,16,0,NULL,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
/* Local Float */
insert into spt_datatype_info values
(62,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
insert into spt_datatype_info values
(62,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
/* Local Real */
insert into spt_datatype_info values
(59,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
insert into spt_datatype_info values
(59,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
/* Local Smallmoney */
insert into spt_datatype_info values
(122,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
/* Local Money */
insert into spt_datatype_info values
(60,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
/* Local Int */
insert into spt_datatype_info values
(56,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
commit tran
end
go
if 'A' = 'A' /* create dummy begin block */
begin
declare @case smallint
begin tran
select @case = 0
select @case = 1 where 'a' <> 'A'
/* Local Smallint */
insert into spt_datatype_info values
(52,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
insert into spt_datatype_info values
(52,2,1,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
/* Local Tinyint */
insert into spt_datatype_info values
(48,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
/* Local Text */
insert into spt_datatype_info values
(35,null,null,'text',-1,2147483647,null,null,2147483647,'''','''',null,1,@case,1,null,0,null,'text',0,-1,null)
/* Local Varbinary */
insert into spt_datatype_info values
(37,null,null,'varbinary',-3,null,null,null,null,'0x',null,'max length',1,0,2,null,0,null,'varbinary',0,-3,null)
/* Local Varchar */
insert into spt_datatype_info values
(39,null,null,'varchar',12,null,null,null,null,'''','''','max length',1,@case,3,null,0,null,'varchar',0,12,null)
/* Local Image */
insert into spt_datatype_info values
(34,null,null,'image',-4,2147483647,null,null,2147483647,'0x',null,null,1,0,0,null,0,null,'image',0,-4,null)
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Add 6.0 data types */
/* Local Decimal */
insert into spt_datatype_info values /* sql server type is 'decimaln' */
(55,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
/* Local Numeric */
insert into spt_datatype_info values /* sql server type is 'numericn' */
(63,null,null,'numeric',2 ,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
/* Identity attribute data types */
/* Identity Int */
insert into spt_datatype_info values
(56,null,null,'int identity',4,10,0,10,null,null,null,null,0,0,2,0,0,1,'int identity',null,4,null)
/* Identity Smallint */
insert into spt_datatype_info values
(52,null,null,'smallint identity',5,5,0,10,null,null,null,null,0,0,2,0,0,1,'smallint identity',null,5,null)
/* Identity Tinyint */
insert into spt_datatype_info values
(48,null,null,'tinyint identity',-6,3,0,10,null,null,null,null,0,0,2,1,0,1,'tinyint identity',null,-6,null)
/* Identity Numeric */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
(55,null,null,'decimal() identity',3,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'decimal() identity',null,3,null)
/* Identity Numeric */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
(63,null,null,'numeric() identity',2,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'numeric() identity',null,2,null)
end
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Add nullable type for non-8.0 server */
/* Local Datetimn */
insert into spt_datatype_info values
(111,4,2,'smalldatetime',11,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
insert into spt_datatype_info values
(111,4,3,'smalldatetime',93,16,0,10,16,'''','''',null,1,0,3,null,0,null,'smalldatetime',null,9,3)
insert into spt_datatype_info values /* sql server type is 'datetimn' */
(111,8,2,'datetime',11,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
insert into spt_datatype_info values
(111,8,3,'datetime',93,23,3,10,16,'''','''',null,1,0,3,null,0,null,'datetime',null,9,3)
/* Local Floatn */
insert into spt_datatype_info values /* sql server type is 'floatn' */
(109,4,2,'real',7, 7,null,10,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
insert into spt_datatype_info values
(109,4,3,'real',7,24,null, 2,4,null,null,null,1,0,2,0,0,0,'real',null,7,null)
insert into spt_datatype_info values /* sql server type is 'floatn' */
(109,8,2,'float',6,15,null,10,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
insert into spt_datatype_info values
(109,8,3,'float',6,53,null, 2,8,null,null,null,1,0,2,0,0,0,'float',null,6,null)
/* Local Moneyn */
insert into spt_datatype_info values /* sql server type is 'moneyn' */
(110,4,null,'smallmoney',3,10,4,10,12,'$',null,null,1,0,2,0,1,0,'smallmoney',null,3,null)
insert into spt_datatype_info values /* sql server type is 'moneyn' */
(110,8,null,'money',3,19,4,10,21,'$',null,null,1,0,2,0,1,0,'money',null,3,null)
/* Local Intn */
insert into spt_datatype_info values /* sql server type is 'intn' */
(38,4,null,'int',4,10,0,10,4,null,null,null,1,0,2,0,0,0,'int',null,4,null)
insert into spt_datatype_info values /* sql server type is 'intn' */
(38,2,null,'smallint',5,5,0,10,2,null,null,null,1,0,2,0,0,0,'smallint',null,5,null)
insert into spt_datatype_info values
(38,1,null,'tinyint',-6,3,0,10,1,null,null,null,1,0,2,1,0,0,'tinyint',null,-6,null)
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Add 6.0 data types */
/* Local Decimaln */
insert into spt_datatype_info values /* sql server type is 'decimaln' */
(106,null,null,'decimal',3,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'decimal',null,3,null)
insert into spt_datatype_info values /* sql server type is 'decmaln' */
(106,null,null,'decimal() identity',3,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'decimal() identity',null,3,null)
/* Local Numericn */
insert into spt_datatype_info values /* sql server type is 'numericn' */
(108,null,null,'numeric',2,38,0,10,null,null,null,'precision,scale',1,0,2,0,0,0,'numeric',null,2,null)
insert into spt_datatype_info values /* sql server type is 'decmaln' */
(108,null,null,'numeric() identity',2,38,0,10,null,null,null,'precision,scale',0,0,2,0,0,1,'numeric() identity',null,2,null)
end
end
commit tran
end
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin
declare @ncase smallint
select @ncase = 0
select @ncase = 1 where N'a' <> N'A'
/* Local Timestamp */
insert into spt_datatype_info values
(0,null,null,'timestamp',-2,8,null,null,null,'0x',null,null,1,0,2,null,0,null,'timestamp',0,-2,null)
/* Local GUID */
insert into spt_datatype_info values
(0,null,null,'uniqueidentifier',-11,36,null,null,null,'''','''',null,1,0,2,null,0,null,'uniqueidentifier',NULL,-11,null)
/* Local NChar */
insert into spt_datatype_info values
(0,null,null,'nchar',-8,null,null,null,null,'N''','''','length',1,@ncase,3,null,0,null,'nchar',0,-8,null)
/* Local NVarchar */
insert into spt_datatype_info values
(0,null,null,'nvarchar',-9,null,null,null,null,'N''','''','max length',1,@ncase,3,null,0,null,'nvarchar',0,-9,null)
/* Local NText */
insert into spt_datatype_info values
(0,null,null,'ntext',-10,2147483646,null,null,2147483646,'N''','''',null,1,@ncase,1,null,0,null,'ntext',0,-10,null)
if (charindex('8.00', @@version) > 0)
begin
-- /* Local BIGINT */
insert into spt_datatype_info values
(127,8,null,'bigint',-5,19,0,10,null,null,null,null,1,0,2,0,0,0,'bigint',null,-5,null)
-- /* Identity BIGINT */
insert into spt_datatype_info values
(127,8,null,'bigint identity',-5,19,0,10,null,null,null,null,0,0,2,0,0,1,'bigint identity',null,-5,null)
-- /* sql_variant */
insert into spt_datatype_info values
(
98, --ss_dtype
null, --fixlen
null, --ODBCVer
'sql_variant', --TYPE_NAME
-150, --SQL DATA TYPE
8000, --data_precision
0, --numeric_scale
10, --RADIX
8000, --length
null, --PREFIX
null, --SUFFIX
null, --Create Params
1, --Nullable
0, --Case sensitive
2, --Searchable
null, --UNSIGNED_ATTRIBUTE
0, --MONEY
null, --AUTO_INCREMENT
'sql_variant', --LOCAL TYPE NAME
0, --CHARBIN
-150, --SQL_DATA_TYPE
null --SQL_DATETIME_SUB
)
end
update spt_datatype_info set NULLABLE = 1
where TYPE_NAME = 'bit'
update spt_datatype_info set ss_dtype =
isnull((select distinct xtype
from systypes
where TYPE_NAME = name OR TYPE_NAME = name+' identity' OR TYPE_NAME = name+'() identity'),
0)
end
go
create unique clustered index datatypeinfoclust on spt_datatype_info(ss_dtype,fixlen,ODBCVer,AUTO_INCREMENT)
go
dump tran master with no_log
go
print 'creating table spt_server_info'
go
create table spt_server_info (
attribute_id int NOT NULL,
attribute_name varchar(60) NOT NULL,
attribute_value varchar(255) NOT NULL)
go
create unique clustered index serverinfoclust on spt_server_info(attribute_id)
go
if (charindex('7.00', @@version) = 0 and charindex('8.00', @@version) = 0)
begin
drop procedure sp_add_server_sortinfo /* not used by other servers */
drop procedure sp_add_server_sortinfo75 /* not used by older servers */
dump tran master with no_log
end
go
insert into spt_server_info
values (1,'DBMS_NAME','Microsoft SQL Server')
insert into spt_server_info
values (2,'DBMS_VER',@@version)
insert into spt_server_info
values (10,'OWNER_TERM','owner')
insert into spt_server_info
values (11,'TABLE_TERM','table')
insert into spt_server_info
values (12,'MAX_OWNER_NAME_LENGTH','30')
insert into spt_server_info
values (13,'TABLE_LENGTH','30')
insert into spt_server_info
values (14,'MAX_QUAL_LENGTH','30')
insert into spt_server_info
values (15,'COLUMN_LENGTH','30')
if 'A' = 'a' /* If not case sensitive server */
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','MIXED')
end
else
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','SENSITIVE')
end
insert into spt_server_info
values (17,'TX_ISOLATION','2')
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0)
begin /* Add 6.0 collation sequence */
insert into spt_server_info
select 18,'COLLATION_SEQ',
'charset='+t2.name+' sort_order='+t1.name
+' charset_num='+rtrim(convert(char(4),t1.csid))+
' sort_order_num='+rtrim(convert(char(4),t1.id))
from syscharsets t1, syscharsets t2, sysconfigures t3
where t1.csid=t2.id and t1.id=t3.value and t3.config=1123
end
else
begin /* Add 4.2x collation sequence */
insert into spt_server_info
select 18,'COLLATION_SEQ',
'charset='+t2.name+' sort_order='+t1.name
+' charset_num='+rtrim(convert(char(4),t1.csid))+
' sort_order_num='+rtrim(convert(char(4),t1.id))
from syscharsets t1, syscharsets t2, sysconfigures t3
where t1.csid=t2.id and t1.id=t3.value and t3.config=123
end
insert into spt_server_info
values (19,'SAVEPOINT_SUPPORT','Y')
insert into spt_server_info
values (20,'MULTI_RESULT_SETS','Y')
insert into spt_server_info
values (22,'ACCESSIBLE_TABLES','Y')
go
insert into spt_server_info
values (100,'USERID_LENGTH','30')
insert into spt_server_info
values (101,'QUALIFIER_TERM','database')
insert into spt_server_info
values (102,'NAMED_TRANSACTIONS','Y')
insert into spt_server_info
values (103,'SPROC_AS_LANGUAGE','Y')
insert into spt_server_info
values (104,'ACCESSIBLE_SPROC','Y')
insert into spt_server_info
values (105,'MAX_INDEX_COLS','16')
insert into spt_server_info
values (106,'RENAME_TABLE','Y')
insert into spt_server_info
values (107,'RENAME_COLUMN','Y')
if (charindex('8.00', @@version) > 0)
begin
/* Columns may be dropped on 8.0 or later */
insert into spt_server_info
values (108,'DROP_COLUMN','Y')
end
else
begin
insert into spt_server_info
values (108,'DROP_COLUMN','N')
end
if (charindex('8.00', @@version) > 0)
begin
/* Columns size may be changed on 8.0 or later */
insert into spt_server_info
values (109,'INCREASE_COLUMN_LENGTH','Y')
end
else
begin
insert into spt_server_info
values (109,'INCREASE_COLUMN_LENGTH','N')
end
if (charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
insert into spt_server_info
values (110,'DDL_IN_TRANSACTION','N')
end
else
begin
insert into spt_server_info
values (110,'DDL_IN_TRANSACTION','Y')
end
if (charindex('8.00', @@version) > 0)
begin
/* Descending indexes allowed on 8.0 or later */
insert into spt_server_info
values (111,'DESCENDING_INDEXES','Y')
end
else
begin
insert into spt_server_info
values (111,'DESCENDING_INDEXES','N')
end
insert into spt_server_info
values (112,'SP_RENAME','Y')
insert into spt_server_info
values (113,'REMOTE_SPROC','Y')
insert into spt_server_info
values (500,'SYS_SPROC_VERSION','8.00.2039')
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Update values for 8.0 server */
update spt_server_info set attribute_value = '128'
where attribute_id in (12,13,14,15,100)
end
go
grant select on spt_server_info to public
go
print 'creating sp_column_privileges'
go
/* Procedure for pre 6.50 server */
CREATE PROCEDURE sp_column_privileges (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@column_name varchar(96) = null) /* 3*32 */
as
set nocount on
declare @table_id int
DECLARE @full_table_name varchar(65) /* 2*32 + 1 */
declare @low smallint /* range of userids to check */
declare @high smallint
declare @owner_uid smallint
select @low = 0, @high = 32767
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
select @table_id = object_id(@full_table_name)
if (@@trancount <> 0)
begin /* If inside a transaction */
raiserror 20003 '~~Rush_6~~'
return
end
/*
** We need to create a table which will contain a row for every row to
** be returned to the client.
*/
create table #column_priv1(
COLUMN_NAME varchar(32) NOT NULL,
grantor smallint NOT NULL,
grantee smallint NOT NULL,
select_privilege bit,
select_grantable bit,
insert_privilege bit,
insert_grantable bit,
update_privilege bit,
update_grantable bit,
references_privilege bit,
references_grantable bit,
uid smallint NOT NULL,
gid smallint NOT NULL)
/*
** insert a row for the table owner (who has all permissions)
*/
select @owner_uid = (
select uid
from sysobjects
where id = @table_id)
if (charindex('6.00', @@version) > 0)
begin
insert into #column_priv1
select
c.name,
u.uid,
@owner_uid,
0,
1,
0,
1,
0,
1,
0,
1,
@owner_uid,
0
from syscolumns c, sysusers u
where id = @table_id
and c.number = 0
and u.uid = 1 /* grantor is dbo of database */
end
else
begin
insert into #column_priv1
select
c.name,
u.uid,
@owner_uid,
0,
1,
0,
1,
0,
1,
0,
0,
@owner_uid,
0
from syscolumns c, sysusers u
where id = @table_id
and c.number = 0
and u.uid = 1 /* grantor is dbo of database */
end
/*
** now stick in a row for every column for every user in the database
** we will need to weed out those who have no permissions later
** (and yes this is a cartesion product: the uid field in sysprotects
** can also have a group id, in which case we need to extend those
** privileges to all group members).
*/
insert into #column_priv1
select distinct
c.name,
o.uid,
u.uid,
0,
0,
0,
0,
0,
0,
0,
0,
u.uid,
u.gid
from sysusers u, syscolumns c, sysobjects o
where o.id = @table_id
and c.id = o.id
and c.number = 0
and u.gid <> u.uid
and u.uid <> @owner_uid
/*
** we need to create another temporary table to contain all the various
** protection information for the table in question
*/
create table #protects (
uid smallint NOT NULL,
grantor smallint NOT NULL,
action tinyint NOT NULL,
protecttype tinyint NOT NULL,
name varchar(32) NOT NULL)
insert into #protects
select
p.uid,
p.uid,
p.action,
p.protecttype,
isnull(col_name(id, c.number), '~All')
from
sysprotects p,
master.dbo.spt_values c,
master.dbo.spt_values a,
master.dbo.spt_values b
where
convert(tinyint, substring(isnull(p.columns, 0x1), c.low, 1))
& c.high <> 0
and c.number <= (
select count(*)
from syscolumns
where id = @table_id)
and c.type = 'P'
and a.type = 'T'
and a.number = p.action
and p.action in (193,195,197,26)
and b.type = 'T'
and b.number = p.protecttype
and p.id = @table_id
and p.uid between @low and @high
update #column_priv1
set select_privilege = 1
from #protects p
where
p.protecttype = 205
and p.action = 193
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 193
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set insert_privilege = 1
from #protects p
where
p.protecttype = 205
and p.action = 195
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 195
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set update_privilege = 1
from #protects p
where
p.protecttype = 205
and p.action = 197
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where protecttype = 206
and action = 197
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set references_privilege = 1
from #protects p
where
p.protecttype = 205
and p.action = 26
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where protecttype = 206
and action = 26
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set select_grantable = 1
from #protects p
where
p.protecttype = 204
and p.action = 193
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 193
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set insert_grantable = 1
from #protects p
where
p.protecttype = 204
and p.action = 195
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 195
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set update_grantable = 1
from #protects p
where
p.protecttype = 204
and p.action = 197
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 197
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set references_grantable = 1
from #protects p
where
p.protecttype = 204
and p.action = 26
and (p.name = #column_priv1.COLUMN_NAME
or name = '~All')
and (p.uid = 0
or p.uid = #column_priv1.gid
or p.uid = #column_priv1.uid)
and not exists (
select * from #protects
where
protecttype = 206
and action = 26
and (name = #column_priv1.COLUMN_NAME
or name = '~All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
create table #column_priv2(
COLUMN_NAME varchar(32) NOT NULL,
grantor smallint NULL,
grantee smallint NOT NULL,
PRIVILEGE varchar(32) NOT NULL,
IS_GRANTABLE varchar(3) NULL)
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'SELECT',
'NO'
from #column_priv1
where select_privilege = 1 and select_grantable = 0
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'INSERT',
'NO'
from #column_priv1
where insert_privilege = 1 and insert_grantable = 0
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'UPDATE',
'NO'
from #column_priv1
where update_privilege = 1 and update_grantable = 0
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'REFERENCES',
'NO'
from #column_priv1
where references_privilege = 1 and references_grantable = 0
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'SELECT',
'YES'
from #column_priv1
where select_grantable = 1
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'INSERT',
'YES'
from #column_priv1
where insert_grantable = 1
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'UPDATE',
'YES'
from #column_priv1
where update_grantable = 1
insert into #column_priv2
select
COLUMN_NAME,
grantor,
grantee,
'REFERENCES',
'YES'
from #column_priv1
where references_grantable = 1
select
convert(varchar(32),db_name()) TABLE_QUALIFIER,
convert(varchar(32),user_name(@owner_uid)) TABLE_OWNER,
@table_name TABLE_NAME,
COLUMN_NAME,
convert(varchar(32),user_name(grantor)) GRANTOR,
convert(varchar(32),user_name(grantee)) GRANTEE,
PRIVILEGE,
IS_GRANTABLE
from #column_priv2
where COLUMN_NAME like @column_name
order by 4, 7
go
if (charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.50 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_column_privileges
go
/* Procedure for 6.50 server */
CREATE PROCEDURE sp_column_privileges (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@column_name varchar(96) = null) /* 3*32 */
as
declare @table_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
select @table_id = object_id(@table_name)
end
else
begin /* Qualified table name */
select @table_id = object_id(@table_owner + '.' + @table_name)
end
select
convert(varchar(32),db_name()) TABLE_QUALIFIER,
convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
@table_name TABLE_NAME,
convert(varchar(32),c.name) COLUMN_NAME,
convert(varchar(32),user_name(p.grantor)) GRANTOR,
convert(varchar(32),user_name(u.uid)) GRANTEE,
convert (varchar(32),case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert (varchar(3),case when p.protecttype = 205 then 'NO'
else 'YES'
end) IS_GRANTABLE
from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
where
c.id = @table_id
and c.name like @column_name
and c.id = p.id
and c.id = o.id
and case substring(p.columns, 1, 1) & 1
when NULL then 255 /* all columns have permission */
when 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
end
& v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns
where id = @table_id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or
(p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case substring(p1.columns, 1, 1) & 1
when NULL then 255 /* all columns have permission */
when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
end
& v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
convert(varchar(32),db_name()) TABLE_QUALIFIER,
convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
@table_name TABLE_NAME,
convert(varchar(32),col_name(@table_id, c.colid)) COLUMN_NAME,
convert(varchar(32),user_name(u.uid)) grantor,
convert(varchar(32),user_name(o.uid)) grantee,
convert (varchar(32),case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),'YES') IS_GRANTABLE
from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
c.id = @table_id
and c.name like @column_name
and c.id = o.id
and u.uid = 1 /* grantor is dbo of database */
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 7
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_column_privileges
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_column_privileges (
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null,
@column_name nvarchar(384) = null) /* 3*128 */
as
declare @table_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
select @table_id = object_id(quotename(@table_name))
end
else
begin /* Qualified table name */
if @table_owner = N''
begin /* If empty owner name */
select @table_id = 0
end
else
begin
select @table_id = object_id(quotename(@table_owner) +
'.' + quotename(@table_name))
end
end
select
convert(sysname,db_name()) TABLE_QUALIFIER,
convert(sysname,user_name(o.uid)) TABLE_OWNER,
@table_name TABLE_NAME,
convert(sysname,c.name) COLUMN_NAME,
convert(sysname,user_name(p.grantor)) GRANTOR,
convert(sysname,user_name(u.uid)) GRANTEE,
convert (varchar(32),case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert (varchar(3),case when p.protecttype = 205 then 'NO'
else 'YES'
end) IS_GRANTABLE
from sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
where
c.id = @table_id
and c.name like @column_name
and c.id = p.id
and c.id = o.id
and case substring(p.columns, 1, 1) & 1
when NULL then 255 /* all columns have permission */
when 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, isnull(substring(p.columns, v.low, 1),0)))
end
& v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns
where id = @table_id) /* ranges from 1 to # of columns in table */
and v.type = N'P'
and v.number = c.colid
/* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or
(p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case substring(p1.columns, 1, 1) & 1
when NULL then 255 /* all columns have permission */
when 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,isnull(substring(p.columns, v.low, 1),0)))
end
& v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
convert(sysname,db_name()) TABLE_QUALIFIER,
convert(sysname,user_name(o.uid)) TABLE_OWNER,
@table_name TABLE_NAME,
convert(sysname,col_name(@table_id, c.colid)) COLUMN_NAME,
convert(sysname,user_name(u.uid)) grantor,
convert(sysname,user_name(o.uid)) grantee,
convert (varchar(32),case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),'YES') IS_GRANTABLE
from sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
c.id = @table_id
and c.name like @column_name
and c.id = o.id
and u.uid = 1 /* grantor is 'dbo' of database */
and v.type = N'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 7
go
grant execute on sp_column_privileges to public
go
dump tran master with no_log
go
print 'creating sp_columns'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_columns (
@table_name varchar(96),
@table_owner varchar(96) = null,
@table_qualifier varchar(32) = null,
@column_name varchar(96) = null,
@ODBCVer int = 2)
AS
DECLARE @full_table_name varchar(193)
DECLARE @table_id int
if @ODBCVer <> 3
select @ODBCVer = 2
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((charindex('%',@full_table_name) = 0) and
(charindex('_',@full_table_name) = 0) and
@table_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT
TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
TABLE_NAME = convert(varchar(32),o.name),
COLUMN_NAME = convert(varchar(32),c.name),
d.DATA_TYPE,
TYPE_NAME = t.name,
"PRECISION" = isnull(d.data_precision, convert(int,c.length)),
LENGTH = isnull(d.length, convert(int,c.length)),
SCALE = d.numeric_scale,
d.RADIX,
NULLABLE = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
syscomments m,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @table_id
AND c.id = o.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND o.type <> 'P'
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.cdefault *= m.id
AND m.colid = 1
ORDER BY 17
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT
TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
TABLE_NAME = convert(varchar(32),o.name),
COLUMN_NAME = convert(varchar(32),c.name),
d.DATA_TYPE,
TYPE_NAME = t.name,
"PRECISION" = isnull(d.data_precision, convert(int,c.length)),
LENGTH = isnull(d.length, convert(int,c.length)),
SCALE = d.numeric_scale,
d.RADIX,
NULLABLE = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
syscomments m,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND o.type <> 'P'
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.cdefault *= m.id
AND m.colid = 1
ORDER BY 2, 3, 17
end
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_columns
go
/* Procedure for 6.0 and 6.50 server */
CREATE PROCEDURE sp_columns (
@table_name varchar(96),
@table_owner varchar(96) = null,
@table_qualifier varchar(32) = null,
@column_name varchar(96) = null,
@ODBCVer int = 2)
AS
DECLARE @full_table_name varchar(193)
DECLARE @table_id int
if @ODBCVer <> 3
select @ODBCVer = 2
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
begin
/* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin
/* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin
/* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((charindex('%',@full_table_name) = 0) and
(charindex('[',@full_table_name) = 0) and
(charindex('_',@full_table_name) = 0) and
@table_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT
TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
TABLE_NAME = convert(varchar(32),o.name),
COLUMN_NAME = convert(varchar(32),c.name),
DATA_TYPE = d.DATA_TYPE,
TYPE_NAME = convert(varchar(32),
case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end),
"PRECISION" = convert(int,
case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else isnull(convert(int,c.prec), 2147483647)
end),
LENGTH = convert(int,
case
when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */
c.prec+2
else
isnull(d.length, c.length)
end),
SCALE = convert(smallint, c.scale),
RADIX = d.RADIX,
NULLABLE = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
SQL_DATA_TYPE = d.SQL_DATA_TYPE,
SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
syscomments m,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @table_id
AND c.id = o.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND o.type <> 'P'
AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.cdefault *= m.id
AND m.colid = 1
ORDER BY 17
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT
TABLE_QUALIFIER = convert(varchar(32),DB_NAME()),
TABLE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
TABLE_NAME = convert(varchar(32),o.name),
COLUMN_NAME = convert(varchar(32),c.name),
DATA_TYPE = d.DATA_TYPE,
TYPE_NAME = convert(varchar(32),
case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end),
"PRECISION" = convert(int,
case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else isnull(convert(int,c.prec), 2147483647)
end),
LENGTH = convert(int,
case
when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */
c.prec+2
else
isnull(d.length, c.length)
end),
SCALE = convert(smallint, c.scale),
RADIX = d.RADIX,
NULLABLE = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
SQL_DATA_TYPE = d.SQL_DATA_TYPE,
SQL_DATETIME_SUB = d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647) + d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',(c.status&8)+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
syscomments m,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND o.type <> 'P'
AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.cdefault *= m.id
AND m.colid = 1
ORDER BY 2, 3, 17
end
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_columns
go
/* Procedure for 7.0 server */
CREATE PROCEDURE sp_columns (
@table_name nvarchar(384),
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@column_name nvarchar(384) = null,
@ODBCVer int = 2)
AS
DECLARE @full_table_name nvarchar(769)
DECLARE @table_id int
if @ODBCVer <> 3
select @ODBCVer = 2
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((isnull(charindex('%', @full_table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('[', @table_owner),0) = 0) and
(isnull(charindex('_', @full_table_name),0) = 0) and
@table_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.id = @table_id
AND c.id = o.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 17
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 2, 3, 17
end
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_columns
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_columns (
@table_name nvarchar(384),
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@column_name nvarchar(384) = null,
@ODBCVer int = 2)
AS
DECLARE @full_table_name nvarchar(769)
DECLARE @table_id int
if @ODBCVer <> 3
select @ODBCVer = 2
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((isnull(charindex('%', @full_table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('[', @table_owner),0) = 0) and
(isnull(charindex('_', @full_table_name),0) = 0) and
@table_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.id = @table_id
AND c.id = o.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 17
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 2, 3, 17
end
go
grant execute on sp_columns to public
go
dump tran master with no_log
go
print 'creating sp_databases'
go
/* Procedure for pre-7.0 server */
create proc sp_databases
as
set nocount on
/* Use temporary table to sum up database size w/o using group by */
create table #databases (
DATABASE_NAME varchar(32) NOT NULL,
size int NOT NULL)
/* Insert row for each database */
insert into #databases
select
name,
(select sum(size) from master.dbo.sysusages
where dbid = d.dbid)
from master.dbo.sysdatabases d
select
DATABASE_NAME,
DATABASE_SIZE = size*2, /* Convert from 2048 byte pages to K */
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from #databases
order by 1
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_databases
go
/* Procedure for 8.0 server */
create proc sp_databases
as
set nocount on
declare @name sysname
declare @SQL nvarchar(600)
/* Use temporary table to sum up database size w/o using group by */
create table #databases (
DATABASE_ID int NOT NULL,
size int NOT NULL)
declare c1 cursor for
select name from master.dbo.sysdatabases
where has_dbaccess(name) = 1 -- Only look at databases to which we have access
open c1
fetch c1 into @name
while @@fetch_status >= 0
begin
select @SQL = 'insert into #databases
select '+ convert(sysname, db_id(@name)) + ', sum(size) from '
+ QuoteName(@name) + '.dbo.sysfiles'
/* Insert row for each database */
execute (@SQL)
fetch c1 into @name
end
deallocate c1
select
DATABASE_NAME = db_name(DATABASE_ID),
DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from #databases
order by 1
go
grant execute on sp_databases to public
go
dump tran master with no_log
go
print 'creating sp_datatype_info'
go
/* Procedure for pre-6.0 server */
create proc sp_datatype_info
(@data_type int = 0, @ODBCVer tinyint = 2)
as
if @ODBCVer <> 3
select @ODBCVer = 2
if @data_type = 0
select
TYPE_NAME = t.name,
d.DATA_TYPE,
"PRECISION" = isnull(d.data_precision, convert(int,t.length)),
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
d.NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
LOCAL_TYPE_NAME = t.name,
MINIMUM_SCALE = d.numeric_scale,
MAXIMUM_SCALE = d.numeric_scale,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and t.usertype *= e.user_type
and (t.type not in (111,109,38,110) or /* get rid of nullable types */
t.usertype > 100)
order by 2, 12, 11, t.usertype
else
select
TYPE_NAME = t.name,
d.DATA_TYPE,
"PRECISION" = isnull(d.data_precision, convert(int,t.length)),
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
d.NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
LOCAL_TYPE_NAME = t.name,
MINIMUM_SCALE = d.numeric_scale,
MAXIMUM_SCALE = d.numeric_scale,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
DATA_TYPE = @data_type
and d.ss_dtype = t.type
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and t.usertype *= e.user_type
and (t.type not in (111,109,38,110) or /* get rid of nullable types */
t.usertype > 100)
order by 12, 11, t.usertype
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_datatype_info
go
/* Procedure for 6.0 and 6.50 servers */
create proc sp_datatype_info
(@data_type int = 0, @ODBCVer tinyint = 2)
as
if @ODBCVer <> 3
select @ODBCVer = 2
if @data_type = 0
select
convert(varchar(32),case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end) TYPE_NAME,
d.DATA_TYPE,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
when d.ss_dtype in (35,34) then 2147483647 /* TEXT/IMAGE */
when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */
else t.prec
end) "PRECISION",
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
convert(smallint,case
when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
else t.allownulls
end) NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
convert(varchar(32),case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end) LOCAL_TYPE_NAME,
convert(smallint,case
when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale
else d.numeric_scale
end) MINIMUM_SCALE,
convert(smallint,case
when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
else t.scale
end) MAXIMUM_SCALE,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and t.usertype *= e.user_type
and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */
t.usertype > 100)
and (t.usertype <= 100 or
isnull(d.AUTO_INCREMENT,0) = 0)
order by 2, 12, 11, t.usertype
else
select
convert(varchar(32),case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end) TYPE_NAME,
d.DATA_TYPE,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
when d.ss_dtype in (35,34) then 2147483647 /* TEXT/IMAGE */
when d.ss_dtype in (55,63,106,108) and t.usertype <= 100 then @@max_precision /* DECIMAL/NUMERIC */
else t.prec
end) "PRECISION",
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
convert(smallint,case
when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
else t.allownulls
end) NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
convert(varchar(32),case
when t.usertype > 100 or t.usertype in (18,80) then t.name
else d.TYPE_NAME
end) LOCAL_TYPE_NAME,
convert(smallint,case
when d.ss_dtype in (55,63,106,108) and t.usertype > 100 then t.scale
else d.numeric_scale
end) MINIMUM_SCALE,
convert(smallint,case
when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 0 then @@max_precision /* DECIMAL/NUMERIC */
when d.ss_dtype in (106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
else t.scale
end) MAXIMUM_SCALE,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.DATA_TYPE = @data_type
and d.ss_dtype = t.type
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and t.usertype *= e.user_type
and isnull(d.AUTO_INCREMENT,0) *= e.AUTO_INCREMENT
and (t.type not in (111,109,38,110,55,63) or /* get rid of nullable types */
t.usertype > 100)
and (t.usertype <= 100 or
isnull(d.AUTO_INCREMENT,0) = 0)
order by 12, 11, t.usertype
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_datatype_info
go
/* Procedure for 7.0 server */
create proc sp_datatype_info
(@data_type int = 0, @ODBCVer tinyint = 2)
as
declare @mintype int
declare @maxtype int
if @ODBCVer <> 3
select @ODBCVer = 2
if @data_type = 0
begin
select @mintype = -32768
select @maxtype = 32767
end
else
begin
select @mintype = @data_type
select @maxtype = @data_type
end
select
convert(sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME
end) TYPE_NAME,
d.DATA_TYPE,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
when type_name(d.ss_dtype) IN ('numeric','decimal') and
t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
else OdbcPrec(t.xtype, t.length, t.xprec)
end) "PRECISION",
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
convert(smallint,case
when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
else TypeProperty (t.name, 'AllowsNull')
end) NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
convert(sysname,case
when t.xusertype > 255 then t.name
else d.LOCAL_TYPE_NAME
end) LOCAL_TYPE_NAME,
MINIMUM_SCALE = d.numeric_scale,
convert(smallint,case
when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
when type_name(d.ss_dtype) IN ('numeric','decimal') and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
else TypeProperty (t.name, 'Scale')
end) MAXIMUM_SCALE,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d
INNER JOIN systypes t on d.ss_dtype = t.xtype
LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
t.xusertype = e.user_type
and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT
where
d.DATA_TYPE between @mintype and @maxtype
and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and (t.xusertype <= 255 or
isnull(d.AUTO_INCREMENT,0) = 0)
order by 2, 12, 11,
case
when t.usertype=18 then 255
else t.usertype
end
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_datatype_info
go
/* Procedure for 8.0 server */
create proc sp_datatype_info
(@data_type int = 0, @ODBCVer tinyint = 2)
as
declare @mintype int
declare @maxtype int
if @ODBCVer <> 3
select @ODBCVer = 2
if @data_type = 0
begin
select @mintype = -32768
select @maxtype = 32767
end
else
begin
select @mintype = @data_type
select @maxtype = @data_type
end
select
convert(sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
d.DATA_TYPE,
convert(int,case
when d.DATA_TYPE in (6,7,-150) then d.data_precision /* FLOAT/REAL/sql_variant*/
when d.ss_dtype in (55,63,106,108) and
t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
else OdbcPrec(t.xtype, t.length, t.xprec)
end) "PRECISION",
d.LITERAL_PREFIX,
d.LITERAL_SUFFIX,
e.CREATE_PARAMS,
convert(smallint,case
when d.AUTO_INCREMENT = 1 then 0 /* IDENTITY*/
else TypeProperty (t.name, 'AllowsNull')
end) NULLABLE,
d.CASE_SENSITIVE,
d.SEARCHABLE,
d.UNSIGNED_ATTRIBUTE,
d.MONEY,
d.AUTO_INCREMENT,
convert(sysname,case
when t.xusertype > 255 then t.name
else d.LOCAL_TYPE_NAME collate database_default
end) LOCAL_TYPE_NAME,
convert(smallint,case
when d.ss_dtype in (55,63,106,108) and t.xusertype > 255 then TypeProperty (t.name, 'Scale')
else d.numeric_scale
end) MINIMUM_SCALE,
convert(smallint,case
when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 0 and t.xusertype <= 255 then @@max_precision /* DECIMAL/NUMERIC */
when d.ss_dtype in (55,63,106,108) and d.AUTO_INCREMENT = 1 then 0 /* DECIMAL/NUMERIC IDENTITY*/
else TypeProperty (t.name, 'Scale')
end) MAXIMUM_SCALE,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
NUM_PREC_RADIX = convert(int,d.RADIX),
INTERVAL_PRECISION = convert(smallint,NULL),
USERTYPE = t.usertype
from master.dbo.spt_datatype_info d
INNER JOIN systypes t on d.ss_dtype = t.xtype
LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
t.xusertype = e.user_type
and isnull(d.AUTO_INCREMENT,0) = e.AUTO_INCREMENT
where
d.DATA_TYPE between @mintype and @maxtype
and (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
and (t.xusertype <= 255 or
isnull(d.AUTO_INCREMENT,0) = 0)
order by 2, 12, 11,
case
when t.usertype=18 then 255
else t.usertype
end
go
grant execute on sp_datatype_info to public
go
dump tran master with no_log
go
print 'creating sp_fkeys'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_fkeys(
@pktable_name varchar(32) = null,
@pktable_owner varchar(32) = null,
@pktable_qualifier varchar(32) = null,
@fktable_name varchar(32) = null,
@fktable_owner varchar(32) = null,
@fktable_qualifier varchar(32) = null )
as
set nocount on
declare @order_by_pk int
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror 20004 '~~Rush_25~~'
return
end
if @fktable_qualifier is not null
begin
if db_name() <> @fktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_26~~'
return
end
end
if @pktable_qualifier is not null
begin
if db_name() <> @pktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_27~~'
return
end
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @pktable_name = '%'
select @order_by_pk = 1
end
if @pktable_owner is null /* If PK owner not supplied, match all */
select @pktable_owner = '%'
if @fktable_name is null /* If table name not supplied, match all */
select @fktable_name = '%'
if @fktable_owner is null /* If FK owner not supplied, match all */
select @fktable_owner = '%'
if @@trancount <> 0
begin /* If inside a transaction */
raiserror 20003 '~~Rush_28~~'
return
end
create table #fkeys(
PKTABLE_QUALIFIER varchar(32) NULL,
PKTABLE_OWNER varchar(32) NULL,
PKTABLE_NAME varchar(32) NOT NULL,
PKCOLUMN_NAME varchar(32) NOT NULL,
FKTABLE_QUALIFIER varchar(32) NULL,
FKTABLE_OWNER varchar(32) NULL,
FKTABLE_NAME varchar(32) NOT NULL,
FKCOLUMN_NAME varchar(32) NOT NULL,
KEY_SEQ smallint NOT NULL)
/* SQL Server supports upto 8 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
8 possible relationships */
insert into #fkeys
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
1
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key1
and c2.id = k.depid
and c2.colid = k.depkey1
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
2
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key2
and c2.id = k.depid
and c2.colid = k.depkey2
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
3
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key3
and c2.id = k.depid
and c2.colid = k.depkey3
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
4
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key4
and c2.id = k.depid
and c2.colid = k.depkey4
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
5
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key5
and c2.id = k.depid
and c2.colid = k.depkey5
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
6
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key6
and c2.id = k.depid
and c2.colid = k.depkey6
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
7
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key7
and c2.id = k.depid
and c2.colid = k.depkey7
and o1.id = k.depid
and o2.id = k.id
union all
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
8
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key8
and c2.id = k.depid
and c2.colid = k.depkey8
and o1.id = k.depid
and o2.id = k.id
if @order_by_pk = 1 /* If order by PK fields */
select
PKTABLE_QUALIFIER,
PKTABLE_OWNER,
PKTABLE_NAME,
PKCOLUMN_NAME,
FKTABLE_QUALIFIER,
FKTABLE_OWNER,
FKTABLE_NAME,
FKCOLUMN_NAME,
KEY_SEQ,
UPDATE_RULE = convert(smallint, null),
DELETE_RULE = convert(smallint,null),
FK_NAME = convert(varchar(32),null),
PK_NAME = convert(varchar(32),null),
DEFERRABILITY = convert(smallint,7)
from #fkeys
where FKTABLE_NAME like @fktable_name
and FKTABLE_OWNER like @fktable_owner
and PKTABLE_NAME like @pktable_name
and PKTABLE_OWNER like @pktable_owner
order by 1, 2, 3, 9, 4
else /* Order by FK fields */
select
PKTABLE_QUALIFIER,
PKTABLE_OWNER,
PKTABLE_NAME,
PKCOLUMN_NAME,
FKTABLE_QUALIFIER,
FKTABLE_OWNER,
FKTABLE_NAME,
FKCOLUMN_NAME,
KEY_SEQ,
UPDATE_RULE = convert(smallint,null),
DELETE_RULE = convert(smallint,null),
FK_NAME = convert(varchar(32),null),
PK_NAME = convert(varchar(32),null),
DEFERRABILITY = convert(smallint,7)
from #fkeys
where FKTABLE_NAME like @fktable_name
and FKTABLE_OWNER like @fktable_owner
and PKTABLE_NAME like @pktable_name
and PKTABLE_OWNER like @pktable_owner
order by 5, 6, 7, 9, 8
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_fkeys
go
/* Procedure for 6.0 and 6.50 servers */
CREATE PROCEDURE sp_fkeys(
@pktable_name varchar(32) = null,
@pktable_owner varchar(32) = null,
@pktable_qualifier varchar(32) = null,
@fktable_name varchar(32) = null,
@fktable_owner varchar(32) = null,
@fktable_qualifier varchar(32) = null )
as
set nocount on
DECLARE @pktable_id int
DECLARE @pkfull_table_name varchar(65) /* 2*32 +1 */
DECLARE @fktable_id int
DECLARE @fkfull_table_name varchar(65) /* 2*32 +1 */
declare @order_by_pk int
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror (15252,-1,-1)
return
end
if @fktable_qualifier is not null
begin
if db_name() <> @fktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_qualifier is not null
begin
if db_name() <> @pktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_owner is null
begin /* If unqualified primary key table name */
SELECT @pkfull_table_name = @pktable_name
end
else
begin /* Qualified primary key table name */
SELECT @pkfull_table_name = @pktable_owner + '.' + @pktable_name
end
/* Get Object ID */
SELECT @pktable_id = object_id(@pkfull_table_name)
if @fktable_owner is null
begin /* If unqualified foreign key table name */
SELECT @fkfull_table_name = @fktable_name
end
else
begin /* Qualified foreign key table name */
SELECT @fkfull_table_name = @fktable_owner + '.' + @fktable_name
end
/* Get Object ID */
SELECT @fktable_id = object_id(@fkfull_table_name)
if @fktable_name is not null
begin
if @fktable_id is null
SELECT @fktable_id = 0 /* fk table not found, empty result */
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @order_by_pk = 1
end
else
begin
if @pktable_id is null
begin
SELECT @pktable_id = 0 /* pk table not found, empty result */
end
end
if (@@trancount <> 0 and
charindex('6.50', @@version) = 0)
begin /* If inside a transaction */
raiserror (15002,-1,-1,'sp_fkeys')
return
end
create table #fkeys(
pkdb_id int NOT NULL,
pktable_id int NOT NULL,
pkcolid int NOT NULL,
fkdb_id int NOT NULL,
fktable_id int NOT NULL,
fkcolid int NOT NULL,
KEY_SEQ smallint NOT NULL,
fk_id int NOT NULL,
pk_id int NOT NULL)
/* SQL Server supports upto 16 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
16 possible relationships */
insert into #fkeys
select
r.rkeydbid,
r.rkeyid,
r.rkey1,
r.fkeydbid,
r.fkeyid,
r.fkey1,
1,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey2,
r.fkeydbid,
r.fkeyid,
r.fkey2,
2,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey3,
r.fkeydbid,
r.fkeyid,
r.fkey3,
3,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey4,
r.fkeydbid,
r.fkeyid,
r.fkey4,
4,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey5,
r.fkeydbid,
r.fkeyid,
r.fkey5,
5,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey6,
r.fkeydbid,
r.fkeyid,
r.fkey6,
6,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey7,
r.fkeydbid,
r.fkeyid,
r.fkey7,
7,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey8,
r.fkeydbid,
r.fkeyid,
r.fkey8,
8,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey9,
r.fkeydbid,
r.fkeyid,
r.fkey9,
9,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey10,
r.fkeydbid,
r.fkeyid,
r.fkey10,
10,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey11,
r.fkeydbid,
r.fkeyid,
r.fkey11,
11,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey12,
r.fkeydbid,
r.fkeyid,
r.fkey12,
12,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey13,
r.fkeydbid,
r.fkeyid,
r.fkey13,
13,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey14,
r.fkeydbid,
r.fkeyid,
r.fkey14,
14,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey15,
r.fkeydbid,
r.fkeyid,
r.fkey15,
15,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union all
select
r.rkeydbid,
r.rkeyid,
r.rkey16,
r.fkeydbid,
r.fkeyid,
r.fkey16,
16,
r.constid,
s.constid
from
sysreferences r, sysconstraints s
where r.rkeyid = s.id
AND (s.status & 0xf) = 1
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
if @order_by_pk = 1 /* If order by PK fields */
select
PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
PKTABLE_NAME = convert(varchar(32),o1.name),
PKCOLUMN_NAME = convert(varchar(32),c1.name),
FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
FKTABLE_NAME = convert(varchar(32),o2.name),
FKCOLUMN_NAME = convert(varchar(32),c2.name),
KEY_SEQ,
UPDATE_RULE = convert(smallint,1),
DELETE_RULE = convert(smallint,1),
FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
DEFERRABILITY = convert(smallint,7)
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
order by 1,2,3,9,4
else /* Order by FK fields */
select
PKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.pkdb_id)),
PKTABLE_OWNER = convert(varchar(32),USER_NAME(o1.uid)),
PKTABLE_NAME = convert(varchar(32),o1.name),
PKCOLUMN_NAME = convert(varchar(32),c1.name),
FKTABLE_QUALIFIER = convert(varchar(32),DB_NAME(f.fkdb_id)),
FKTABLE_OWNER = convert(varchar(32),USER_NAME(o2.uid)),
FKTABLE_NAME = convert(varchar(32),o2.name),
FKCOLUMN_NAME = convert(varchar(32),c2.name),
KEY_SEQ,
UPDATE_RULE = convert(smallint,1),
DELETE_RULE = convert(smallint,1),
FK_NAME = convert(varchar(32),OBJECT_NAME(fk_id)),
PK_NAME = convert(varchar(32),OBJECT_NAME(pk_id)),
DEFERRABILITY = convert(smallint,7)
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
order by 5,6,7,9,8
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_fkeys
go
/* Procedure for 7.0 server */
CREATE PROCEDURE sp_fkeys(
@pktable_name sysname = null,
@pktable_owner sysname = null,
@pktable_qualifier sysname = null,
@fktable_name sysname = null,
@fktable_owner sysname = null,
@fktable_qualifier sysname = null )
as
set nocount on
DECLARE @pktable_id int
DECLARE @pkfull_table_name nvarchar(257) /* 2*128 + 1 */
DECLARE @fktable_id int
DECLARE @fkfull_table_name nvarchar(257) /* 2*128 + 1 */
declare @order_by_pk int
/* select 'XXX starting table creation' */
create table #fkeysall(
rkeyid int NOT NULL,
rkey1 int NOT NULL,
rkey2 int NOT NULL,
rkey3 int NOT NULL,
rkey4 int NOT NULL,
rkey5 int NOT NULL,
rkey6 int NOT NULL,
rkey7 int NOT NULL,
rkey8 int NOT NULL,
rkey9 int NOT NULL,
rkey10 int NOT NULL,
rkey11 int NOT NULL,
rkey12 int NOT NULL,
rkey13 int NOT NULL,
rkey14 int NOT NULL,
rkey15 int NOT NULL,
rkey16 int NOT NULL,
fkeyid int NOT NULL,
fkey1 int NOT NULL,
fkey2 int NOT NULL,
fkey3 int NOT NULL,
fkey4 int NOT NULL,
fkey5 int NOT NULL,
fkey6 int NOT NULL,
fkey7 int NOT NULL,
fkey8 int NOT NULL,
fkey9 int NOT NULL,
fkey10 int NOT NULL,
fkey11 int NOT NULL,
fkey12 int NOT NULL,
fkey13 int NOT NULL,
fkey14 int NOT NULL,
fkey15 int NOT NULL,
fkey16 int NOT NULL,
constid int NOT NULL,
name sysname NOT NULL)
create table #fkeys(
pktable_id int NOT NULL,
pkcolid int NOT NULL,
fktable_id int NOT NULL,
fkcolid int NOT NULL,
KEY_SEQ smallint NOT NULL,
fk_id int NOT NULL,
PK_NAME sysname NOT NULL)
create table #fkeysout(
PKTABLE_QUALIFIER sysname NULL,
PKTABLE_OWNER sysname NULL,
PKTABLE_NAME sysname NOT NULL,
PKCOLUMN_NAME sysname NOT NULL,
FKTABLE_QUALIFIER sysname NULL,
FKTABLE_OWNER sysname NULL,
FKTABLE_NAME sysname NOT NULL,
FKCOLUMN_NAME sysname NOT NULL,
KEY_SEQ smallint NOT NULL,
UPDATE_RULE smallint NULL,
DELETE_RULE smallint NULL,
FK_NAME sysname NULL,
PK_NAME sysname NULL,
DEFERRABILITY smallint null)
/* select 'XXX starting parameter analysis' */
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror (15252,-1,-1)
return
end
if @fktable_qualifier is not null
begin
if db_name() <> @fktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_qualifier is not null
begin
if db_name() <> @pktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_owner is null
begin /* If unqualified primary key table name */
SELECT @pkfull_table_name = quotename(@pktable_name)
end
else
begin /* Qualified primary key table name */
if @pktable_owner = ''
begin /* If empty owner name */
SELECT @pkfull_table_name = quotename(@pktable_owner)
end
else
begin
SELECT @pkfull_table_name = quotename(@pktable_owner) +
'.' + quotename(@pktable_name)
end
end
/* Get Object ID */
SELECT @pktable_id = object_id(@pkfull_table_name)
if @fktable_owner is null
begin /* If unqualified foreign key table name */
SELECT @fkfull_table_name = quotename(@fktable_name)
end
else
begin /* Qualified foreign key table name */
if @fktable_owner = ''
begin /* If empty owner name */
SELECT @fkfull_table_name = quotename(@fktable_owner)
end
else
begin
SELECT @fkfull_table_name = quotename(@fktable_owner) +
'.' + quotename(@fktable_name)
end
end
/* Get Object ID */
SELECT @fktable_id = object_id(@fkfull_table_name)
if @fktable_name is not null
begin
if @fktable_id is null
SELECT @fktable_id = 0 /* fk table not found, empty result */
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @order_by_pk = 1
end
else
begin
if @pktable_id is null
begin
SELECT @pktable_id = 0 /* pk table not found, empty result */
end
end
/* SQL Server supports upto 16 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* First, attempt to get all 16 keys for each rel'ship, then sort
them out with a 16-way "insert select ... union select ..." */
/* select 'XXX starting data analysis' */
insert into #fkeysall
select
r.rkeyid,
r.rkey1, r.rkey2, r.rkey3, r.rkey4,
r.rkey5, r.rkey6, r.rkey7, r.rkey8,
r.rkey9, r.rkey10, r.rkey11, r.rkey12,
r.rkey13, r.rkey14, r.rkey15, r.rkey16,
r.fkeyid,
r.fkey1, r.fkey2, r.fkey3, r.fkey4,
r.fkey5, r.fkey6, r.fkey7, r.fkey8,
r.fkey9, r.fkey10, r.fkey11, r.fkey12,
r.fkey13, r.fkey14, r.fkey15, r.fkey16,
r.constid,
i.name
from
sysreferences r, sysobjects o, sysindexes i
where r.constid = o.id
AND o.xtype = 'F'
AND r.rkeyindid = i.indid
AND r.rkeyid = i.id
AND r.rkeyid between isnull(@pktable_id, 0)
and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0)
and isnull(@fktable_id, 0x7fffffff)
/* select count (*) as 'XXX countall' from #fkeysall */
insert into #fkeys
select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name
from #fkeysall
union all
select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name
from #fkeysall
union all
select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name
from #fkeysall
union all
select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name
from #fkeysall
union all
select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name
from #fkeysall
union all
select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name
from #fkeysall
union all
select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name
from #fkeysall
union all
select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name
from #fkeysall
union all
select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name
from #fkeysall
union all
select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name
from #fkeysall
union all
select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name
from #fkeysall
union all
select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name
from #fkeysall
union all
select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name
from #fkeysall
union all
select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name
from #fkeysall
union all
select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name
from #fkeysall
union all
select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name
from #fkeysall
/* select count (*) as 'XXX count' from #fkeys */
insert into #fkeysout
select
PKTABLE_QUALIFIER = convert(sysname,db_name()),
PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),
PKTABLE_NAME = convert(sysname,o1.name),
PKCOLUMN_NAME = convert(sysname,c1.name),
FKTABLE_QUALIFIER = convert(sysname,db_name()),
FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),
FKTABLE_NAME = convert(sysname,o2.name),
FKCOLUMN_NAME = convert(sysname,c2.name),
KEY_SEQ,
UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN
convert(smallint,0) ELSE convert(smallint,1) END,
DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN
convert(smallint,0) ELSE convert(smallint,1) END,
FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),
PK_NAME,
DEFERRABILITY = 7 /* SQL_NOT_DEFERRABLE */
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
/* select count (*) as 'XXX countout' from #fkeysout */
if @order_by_pk = 1 /* If order by PK fields */
select
PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
from #fkeysout
order by 1,2,3,9,4
else /* Order by FK fields */
select
PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
from #fkeysout
order by 5,6,7,9,8
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_fkeys
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_fkeys(
@pktable_name sysname = null,
@pktable_owner sysname = null,
@pktable_qualifier sysname = null,
@fktable_name sysname = null,
@fktable_owner sysname = null,
@fktable_qualifier sysname = null )
as
set nocount on
DECLARE @pktable_id int
DECLARE @pkfull_table_name nvarchar(257) /* 2*128 + 1 */
DECLARE @fktable_id int
DECLARE @fkfull_table_name nvarchar(257) /* 2*128 + 1 */
declare @order_by_pk int
/* select 'XXX starting table creation' */
create table #fkeysall(
rkeyid int NOT NULL,
rkey1 int NOT NULL,
rkey2 int NOT NULL,
rkey3 int NOT NULL,
rkey4 int NOT NULL,
rkey5 int NOT NULL,
rkey6 int NOT NULL,
rkey7 int NOT NULL,
rkey8 int NOT NULL,
rkey9 int NOT NULL,
rkey10 int NOT NULL,
rkey11 int NOT NULL,
rkey12 int NOT NULL,
rkey13 int NOT NULL,
rkey14 int NOT NULL,
rkey15 int NOT NULL,
rkey16 int NOT NULL,
fkeyid int NOT NULL,
fkey1 int NOT NULL,
fkey2 int NOT NULL,
fkey3 int NOT NULL,
fkey4 int NOT NULL,
fkey5 int NOT NULL,
fkey6 int NOT NULL,
fkey7 int NOT NULL,
fkey8 int NOT NULL,
fkey9 int NOT NULL,
fkey10 int NOT NULL,
fkey11 int NOT NULL,
fkey12 int NOT NULL,
fkey13 int NOT NULL,
fkey14 int NOT NULL,
fkey15 int NOT NULL,
fkey16 int NOT NULL,
constid int NOT NULL,
name sysname collate database_default NOT NULL)
create table #fkeys(
pktable_id int NOT NULL,
pkcolid int NOT NULL,
fktable_id int NOT NULL,
fkcolid int NOT NULL,
KEY_SEQ smallint NOT NULL,
fk_id int NOT NULL,
PK_NAME sysname collate database_default NOT NULL)
create table #fkeysout(
PKTABLE_QUALIFIER sysname collate database_default NULL,
PKTABLE_OWNER sysname collate database_default NULL,
PKTABLE_NAME sysname collate database_default NOT NULL,
PKCOLUMN_NAME sysname collate database_default NOT NULL,
FKTABLE_QUALIFIER sysname collate database_default NULL,
FKTABLE_OWNER sysname collate database_default NULL,
FKTABLE_NAME sysname collate database_default NOT NULL,
FKCOLUMN_NAME sysname collate database_default NOT NULL,
KEY_SEQ smallint NOT NULL,
UPDATE_RULE smallint NULL,
DELETE_RULE smallint NULL,
FK_NAME sysname collate database_default NULL,
PK_NAME sysname collate database_default NULL,
DEFERRABILITY smallint null)
/* select 'XXX starting parameter analysis' */
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror (15252,-1,-1)
return
end
if @fktable_qualifier is not null
begin
if db_name() <> @fktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_qualifier is not null
begin
if db_name() <> @pktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @pktable_owner is null
begin /* If unqualified primary key table name */
SELECT @pkfull_table_name = quotename(@pktable_name)
end
else
begin /* Qualified primary key table name */
if @pktable_owner = ''
begin /* If empty owner name */
SELECT @pkfull_table_name = quotename(@pktable_owner)
end
else
begin
SELECT @pkfull_table_name = quotename(@pktable_owner) +
'.' + quotename(@pktable_name)
end
end
/* Get Object ID */
SELECT @pktable_id = object_id(@pkfull_table_name)
if @fktable_owner is null
begin /* If unqualified foreign key table name */
SELECT @fkfull_table_name = quotename(@fktable_name)
end
else
begin /* Qualified foreign key table name */
if @fktable_owner = ''
begin /* If empty owner name */
SELECT @fkfull_table_name = quotename(@fktable_owner)
end
else
begin
SELECT @fkfull_table_name = quotename(@fktable_owner) +
'.' + quotename(@fktable_name)
end
end
/* Get Object ID */
SELECT @fktable_id = object_id(@fkfull_table_name)
if @fktable_name is not null
begin
if @fktable_id is null
SELECT @fktable_id = 0 /* fk table not found, empty result */
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @order_by_pk = 1
end
else
begin
if @pktable_id is null
begin
SELECT @pktable_id = 0 /* pk table not found, empty result */
end
end
/* SQL Server supports upto 16 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* First, attempt to get all 16 keys for each rel'ship, then sort
them out with a 16-way "insert select ... union select ..." */
/* select 'XXX starting data analysis' */
insert into #fkeysall
select
r.rkeyid,
r.rkey1, r.rkey2, r.rkey3, r.rkey4,
r.rkey5, r.rkey6, r.rkey7, r.rkey8,
r.rkey9, r.rkey10, r.rkey11, r.rkey12,
r.rkey13, r.rkey14, r.rkey15, r.rkey16,
r.fkeyid,
r.fkey1, r.fkey2, r.fkey3, r.fkey4,
r.fkey5, r.fkey6, r.fkey7, r.fkey8,
r.fkey9, r.fkey10, r.fkey11, r.fkey12,
r.fkey13, r.fkey14, r.fkey15, r.fkey16,
r.constid,
i.name
from
sysreferences r, sysobjects o, sysindexes i
where r.constid = o.id
AND o.xtype = 'F'
AND r.rkeyindid = i.indid
AND r.rkeyid = i.id
AND r.rkeyid between isnull(@pktable_id, 0)
and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0)
and isnull(@fktable_id, 0x7fffffff)
/* select count (*) as 'XXX countall' from #fkeysall */
insert into #fkeys
select rkeyid, rkey1, fkeyid, fkey1, 1, constid, name
from #fkeysall
union all
select rkeyid, rkey2, fkeyid, fkey2, 2, constid, name
from #fkeysall
union all
select rkeyid, rkey3, fkeyid, fkey3, 3, constid, name
from #fkeysall
union all
select rkeyid, rkey4, fkeyid, fkey4, 4, constid, name
from #fkeysall
union all
select rkeyid, rkey5, fkeyid, fkey5, 5, constid, name
from #fkeysall
union all
select rkeyid, rkey6, fkeyid, fkey6, 6, constid, name
from #fkeysall
union all
select rkeyid, rkey7, fkeyid, fkey7, 7, constid, name
from #fkeysall
union all
select rkeyid, rkey8, fkeyid, fkey8, 8, constid, name
from #fkeysall
union all
select rkeyid, rkey9, fkeyid, fkey9, 9, constid, name
from #fkeysall
union all
select rkeyid, rkey10, fkeyid, fkey10, 10, constid, name
from #fkeysall
union all
select rkeyid, rkey11, fkeyid, fkey11, 11, constid, name
from #fkeysall
union all
select rkeyid, rkey12, fkeyid, fkey12, 12, constid, name
from #fkeysall
union all
select rkeyid, rkey13, fkeyid, fkey13, 13, constid, name
from #fkeysall
union all
select rkeyid, rkey14, fkeyid, fkey14, 14, constid, name
from #fkeysall
union all
select rkeyid, rkey15, fkeyid, fkey15, 15, constid, name
from #fkeysall
union all
select rkeyid, rkey16, fkeyid, fkey16, 16, constid, name
from #fkeysall
/* select count (*) as 'XXX count' from #fkeys */
insert into #fkeysout
select
PKTABLE_QUALIFIER = convert(sysname,db_name()),
PKTABLE_OWNER = convert(sysname,USER_NAME(o1.uid)),
PKTABLE_NAME = convert(sysname,o1.name),
PKCOLUMN_NAME = convert(sysname,c1.name),
FKTABLE_QUALIFIER = convert(sysname,db_name()),
FKTABLE_OWNER = convert(sysname,USER_NAME(o2.uid)),
FKTABLE_NAME = convert(sysname,o2.name),
FKCOLUMN_NAME = convert(sysname,c2.name),
KEY_SEQ,
UPDATE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsUpdateCascade')=1) THEN
convert(smallint,0) ELSE convert(smallint,1) END,
DELETE_RULE = CASE WHEN (ObjectProperty(fk_id, 'CnstIsDeleteCascade')=1) THEN
convert(smallint,0) ELSE convert(smallint,1) END,
FK_NAME = convert(sysname,OBJECT_NAME(fk_id)),
PK_NAME,
DEFERRABILITY = 7 /* SQL_NOT_DEFERRABLE */
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
/* select count (*) as 'XXX countout' from #fkeysout */
if @order_by_pk = 1 /* If order by PK fields */
select
PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
from #fkeysout
order by 1,2,3,9,4
else /* Order by FK fields */
select
PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME,
FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME,
KEY_SEQ, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY
from #fkeysout
order by 5,6,7,9,8
go
grant execute on sp_fkeys to public
go
dump tran master with no_log
go
print 'creating sp_pkeys'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_pkeys(
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null )
as
set nocount on
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
if @@trancount <> 0
begin /* If inside a transaction */
raiserror 20003 '~~Rush_35~~'
return
end
create table #pkeys(
TABLE_QUALIFIER varchar(32) NULL,
TABLE_OWNER varchar(32) NULL,
TABLE_NAME varchar(32) NOT NULL,
COLUMN_NAME varchar(32) NOT NULL,
KEY_SEQ smallint NOT NULL)
/* SQL Server supports upto 8 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
8 possible relationships */
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
1
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = k.key1
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
2
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key2
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
3
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key3
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
4
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key4
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
5
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key5
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
6
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key6
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
7
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key7
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
8
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key8
done:
select
TABLE_QUALIFIER,
TABLE_OWNER,
TABLE_NAME,
COLUMN_NAME,
KEY_SEQ,
PK_NAME = convert(varchar(32),null)
from #pkeys
where TABLE_NAME = @table_name
and TABLE_OWNER like @table_owner
order by 1, 2, 3, 5
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_pkeys
go
/* Procedure for 6.0 and 6.50 servers */
CREATE PROCEDURE sp_pkeys(
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null )
as
DECLARE @table_id int
DECLARE @full_table_name varchar(255) /* 2*128 + 1 */
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = @table_owner
end
else
begin
SELECT @full_table_name = @table_owner + '.' + @table_name
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
select
TABLE_QUALIFIER = convert(sysname,db_name()),
TABLE_OWNER = convert(sysname,user_name(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
KEY_SEQ =
case
when c.name = index_col(@full_table_name, i.indid, 1) then convert (smallint,1)
when c.name = index_col(@full_table_name, i.indid, 2) then convert (smallint,2)
when c.name = index_col(@full_table_name, i.indid, 3) then convert (smallint,3)
when c.name = index_col(@full_table_name, i.indid, 4) then convert (smallint,4)
when c.name = index_col(@full_table_name, i.indid, 5) then convert (smallint,5)
when c.name = index_col(@full_table_name, i.indid, 6) then convert (smallint,6)
when c.name = index_col(@full_table_name, i.indid, 7) then convert (smallint,7)
when c.name = index_col(@full_table_name, i.indid, 8) then convert (smallint,8)
when c.name = index_col(@full_table_name, i.indid, 9) then convert (smallint,9)
when c.name = index_col(@full_table_name, i.indid, 10) then convert (smallint,10)
when c.name = index_col(@full_table_name, i.indid, 11) then convert (smallint,11)
when c.name = index_col(@full_table_name, i.indid, 12) then convert (smallint,12)
when c.name = index_col(@full_table_name, i.indid, 13) then convert (smallint,13)
when c.name = index_col(@full_table_name, i.indid, 14) then convert (smallint,14)
when c.name = index_col(@full_table_name, i.indid, 15) then convert (smallint,15)
when c.name = index_col(@full_table_name, i.indid, 16) then convert (smallint,16)
end,
PK_NAME = convert(sysname,i.name)
from
sysindexes i, syscolumns c, sysobjects o
where
o.id = @table_id
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800
and (c.name = index_col (@full_table_name, i.indid, 1) or
c.name = index_col (@full_table_name, i.indid, 2) or
c.name = index_col (@full_table_name, i.indid, 3) or
c.name = index_col (@full_table_name, i.indid, 4) or
c.name = index_col (@full_table_name, i.indid, 5) or
c.name = index_col (@full_table_name, i.indid, 6) or
c.name = index_col (@full_table_name, i.indid, 7) or
c.name = index_col (@full_table_name, i.indid, 8) or
c.name = index_col (@full_table_name, i.indid, 9) or
c.name = index_col (@full_table_name, i.indid, 10) or
c.name = index_col (@full_table_name, i.indid, 11) or
c.name = index_col (@full_table_name, i.indid, 12) or
c.name = index_col (@full_table_name, i.indid, 13) or
c.name = index_col (@full_table_name, i.indid, 14) or
c.name = index_col (@full_table_name, i.indid, 15) or
c.name = index_col (@full_table_name, i.indid, 16)
)
order by 1, 2, 3, 5
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_pkeys
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_pkeys(
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null )
as
DECLARE @table_id int
DECLARE @full_table_name nvarchar(255)
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
select
TABLE_QUALIFIER = convert(sysname,db_name()),
TABLE_OWNER = convert(sysname,user_name(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
--KEY_SEQ = convert(smallint,c.colid),
KEY_SEQ =
case
when c.name = index_col(@full_table_name, i.indid, 1) then convert (smallint,1)
when c.name = index_col(@full_table_name, i.indid, 2) then convert (smallint,2)
when c.name = index_col(@full_table_name, i.indid, 3) then convert (smallint,3)
when c.name = index_col(@full_table_name, i.indid, 4) then convert (smallint,4)
when c.name = index_col(@full_table_name, i.indid, 5) then convert (smallint,5)
when c.name = index_col(@full_table_name, i.indid, 6) then convert (smallint,6)
when c.name = index_col(@full_table_name, i.indid, 7) then convert (smallint,7)
when c.name = index_col(@full_table_name, i.indid, 8) then convert (smallint,8)
when c.name = index_col(@full_table_name, i.indid, 9) then convert (smallint,9)
when c.name = index_col(@full_table_name, i.indid, 10) then convert (smallint,10)
when c.name = index_col(@full_table_name, i.indid, 11) then convert (smallint,11)
when c.name = index_col(@full_table_name, i.indid, 12) then convert (smallint,12)
when c.name = index_col(@full_table_name, i.indid, 13) then convert (smallint,13)
when c.name = index_col(@full_table_name, i.indid, 14) then convert (smallint,14)
when c.name = index_col(@full_table_name, i.indid, 15) then convert (smallint,15)
when c.name = index_col(@full_table_name, i.indid, 16) then convert (smallint,16)
end,
PK_NAME = convert(sysname,i.name)
from
sysindexes i, syscolumns c, sysobjects o --, syscolumns c1
where
o.id = @table_id
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800
--and c.name = index_col (@full_table_name, i.indid, c1.colid)
and (c.name = index_col (@full_table_name, i.indid, 1) or
c.name = index_col (@full_table_name, i.indid, 2) or
c.name = index_col (@full_table_name, i.indid, 3) or
c.name = index_col (@full_table_name, i.indid, 4) or
c.name = index_col (@full_table_name, i.indid, 5) or
c.name = index_col (@full_table_name, i.indid, 6) or
c.name = index_col (@full_table_name, i.indid, 7) or
c.name = index_col (@full_table_name, i.indid, 8) or
c.name = index_col (@full_table_name, i.indid, 9) or
c.name = index_col (@full_table_name, i.indid, 10) or
c.name = index_col (@full_table_name, i.indid, 11) or
c.name = index_col (@full_table_name, i.indid, 12) or
c.name = index_col (@full_table_name, i.indid, 13) or
c.name = index_col (@full_table_name, i.indid, 14) or
c.name = index_col (@full_table_name, i.indid, 15) or
c.name = index_col (@full_table_name, i.indid, 16)
)
--and c1.colid <= i.keycnt /* create rows from 1 to keycnt */
--and c1.id = @table_id
order by 1, 2, 3, 5
go
grant execute on sp_pkeys to public
go
dump tran master with no_log
go
print 'creating sp_server_info'
go
create proc sp_server_info (
@attribute_id int = null)
as
if @attribute_id is not null
select *
from master.dbo.spt_server_info
where attribute_id = @attribute_id
else
select *
from master.dbo.spt_server_info
order by attribute_id
go
grant execute on sp_server_info to public
go
dump tran master with no_log
go
print 'creating sp_special_columns'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_special_columns (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U',
@ODBCVer int = 2)
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name varchar(65) /* 2*32+1 */
DECLARE @scopeout smallint
if @col_type not in ('R','V') or @col_type is null
begin
raiserror 20002 '~~Rush_42~~'
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror 20002 '~~Rush_43~~'
return
end
if @nullable not in ('U','O') or @nullable is null
begin
raiserror 20002 '~~Rush_44~~'
return
end
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
SCOPE = convert(smallint,NULL),
COLUMN_NAME = convert(varchar(32),c.name),
DATA_TYPE = convert(smallint, -3),
TYPE_NAME = t.name,
"PRECISION" = convert(int,8),
LENGTH = convert(int,8),
SCALE = convert(smallint, NULL),
PSEUDO_COLUMN = convert(smallint,1)
FROM
systypes t, syscolumns c
WHERE
c.id = @table_id
AND c.usertype = 80 /* TIMESTAMP */
AND t.usertype = 80 /* TIMESTAMP */
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes i,syscolumns c,syscolumns c2
WHERE
i.status&2 = 2 /* If Unique Index */
AND c.id = i.id
AND c2.id = c.id
AND c2.colid < i.keycnt + (i.status&16)/16
AND i.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,i.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes i
WHERE
status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT
SCOPE = @scopeout,
COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
d.DATA_TYPE,
TYPE_NAME = t.name,
"PRECISION" = isnull(d.data_precision, convert(int,c.length)),
LENGTH = isnull(d.length, convert(int,c.length)),
SCALE = d.numeric_scale,
PSEUDO_COLUMN = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < keycnt+(x.status&16)/16
AND x.indid = @indid
AND t.type = d.ss_dtype
AND c.length = d.fixlen
AND c.usertype = t.usertype
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_special_columns
go
/* Procedure for 6.0 and 6.50 servers */
CREATE PROCEDURE sp_special_columns (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U',
@ODBCVer int = 2)
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name varchar(65) /* 2*32+1 */
DECLARE @scopeout smallint
if @col_type not in ('R','V') or @col_type is null
begin
raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror (15251,-1,-1,'scope','''C'' or ''T''')
return
end
if @nullable not in ('U','O') or @nullable is null
begin
raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
return
end
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
SCOPE = convert(smallint,NULL),
COLUMN_NAME = convert(varchar(32),c.name),
DATA_TYPE = convert(smallint, -2),
TYPE_NAME = t.name,
"PRECISION" = convert(int,8),
LENGTH = convert(int,8),
SCALE = convert(smallint, NULL),
PSEUDO_COLUMN = convert(smallint,1)
FROM
systypes t, syscolumns c
WHERE
c.id = @table_id
AND c.usertype = 80 /* TIMESTAMP */
AND t.usertype = 80 /* TIMESTAMP */
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes i,syscolumns c,syscolumns c2
WHERE
i.status&2 = 2 /* If Unique Index */
AND c.id = i.id
AND c2.id = c.id
AND c2.colid < i.keycnt + (i.status&16)/16
AND i.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,i.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes i
WHERE
status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT
SCOPE = @scopeout,
COLUMN_NAME = convert(varchar(32),INDEX_COL(@full_table_name,indid,c2.colid)),
d.DATA_TYPE,
convert(varchar(32),case
when (t.usertype > 100 or t.usertype in (18,80))
then t.name
else d.TYPE_NAME
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else isnull(convert(int,c.prec), 2147483647)
end) "PRECISION",
convert(int,case
when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */
convert(int,c.prec+2)
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, c.scale),
PSEUDO_COLUMN = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt+(x.status&16)/16
AND x.indid = @indid
AND t.type = d.ss_dtype
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = (c.status&128)/128
AND c.usertype = t.usertype
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_special_columns
go
/* Procedure for 7.0 servers */
CREATE PROCEDURE sp_special_columns (
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U',
@ODBCVer int = 2)
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name nvarchar(257)
DECLARE @scopeout smallint
if @col_type not in ('R','V') or @col_type is null
begin
raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror (15251,-1,-1,'scope','''C'' or ''T''')
return
end
if @nullable not in ('U','O') or @nullable is null
begin
raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
return
end
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
SCOPE = convert(smallint,NULL),
COLUMN_NAME = convert(sysname,c.name),
DATA_TYPE = convert(smallint, -2),
TYPE_NAME = t.name,
"PRECISION" = convert(int,8),
LENGTH = convert(int,8),
SCALE = convert(smallint, NULL),
PSEUDO_COLUMN = convert(smallint,1)
FROM
systypes t, syscolumns c
WHERE
not (@table_id is null)
AND c.id = @table_id
AND t.name = 'timestamp' /* TIMESTAMP */
AND t.xtype = c.xtype
AND t.xusertype = c.xusertype
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes x, syscolumns c, syscolumns c2
WHERE
not (@table_id is null)
AND x.status&2 = 2 /* If Unique Index */
AND c.id = x.id
AND c2.id = c.id
AND c2.colid < x.keycnt + (x.status&16)/16
AND x.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,x.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes x
WHERE
not (@table_id is null)
AND status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT
SCOPE = @scopeout,
COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),
d.DATA_TYPE,
convert(sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
PSEUDO_COLUMN = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
not (@table_id is null)
AND x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt + (x.status&16)/16
AND x.indid = @indid
AND t.xtype = d.ss_dtype
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_special_columns
go
/* Procedure for 8.0 and later servers */
CREATE PROCEDURE sp_special_columns (
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U',
@ODBCVer int = 2)
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name nvarchar(257)
DECLARE @scopeout smallint
if @col_type not in ('R','V') or @col_type is null
begin
raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror (15251,-1,-1,'scope','''C'' or ''T''')
return
end
if @nullable not in ('U','O') or @nullable is null
begin
raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
return
end
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
SCOPE = convert(smallint,NULL),
COLUMN_NAME = convert(sysname,c.name),
DATA_TYPE = convert(smallint, -2),
TYPE_NAME = t.name,
"PRECISION" = convert(int,8),
LENGTH = convert(int,8),
SCALE = convert(smallint, NULL),
PSEUDO_COLUMN = convert(smallint,1)
FROM
systypes t, syscolumns c
WHERE
not (@table_id is null)
AND c.id = @table_id
AND t.name = 'timestamp' /* TIMESTAMP */
AND t.xtype = c.xtype
AND t.xusertype = c.xusertype
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes x, syscolumns c, syscolumns c2
WHERE
not (@table_id is null)
AND x.status&2 = 2 /* If Unique Index */
AND c.id = x.id
AND c2.id = c.id
AND c2.colid < x.keycnt + (x.status&18)/18
AND x.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,x.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes x
WHERE
not (@table_id is null)
AND status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT
SCOPE = @scopeout,
COLUMN_NAME = convert(sysname,INDEX_COL(@full_table_name,indid,c2.colid)),
d.DATA_TYPE,
convert(sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
PSEUDO_COLUMN = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
not (@table_id is null)
AND x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt + (x.status&16)/16
AND x.indid = @indid
AND t.xtype = d.ss_dtype
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
go
grant execute on sp_special_columns to public
go
dump tran master with no_log
go
print 'creating sp_sproc_columns'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name varchar(102) = '%', /* 3*32+5+1 */
@procedure_owner varchar(96) = null,
@procedure_qualifier varchar(32) = null,
@column_name varchar(96) = null,
@ODBCVer int = 2)
AS
DECLARE @group_num_lower smallint
DECLARE @group_num_upper smallint
DECLARE @semi_position int
DECLARE @full_procedure_name varchar(205)/* 2*102+1 */
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() <> @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_51~~'
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @group_num_upper = @group_num_lower
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to group number of 1 */
select @group_num_lower = 1
select @group_num_upper = 32767
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = @procedure_name
end
else
begin /* Qualified procedure name */
SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((charindex('%',@full_procedure_name) = 0) and
(charindex('_',@full_procedure_name) = 0) and
@procedure_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(varchar(32),c.name),
COLUMN_TYPE = convert(smallint, 0),
d.DATA_TYPE,
TYPE_NAME = t.name,
"PRECISION" = isnull(d.data_precision, convert(int,c.length)),
LENGTH = isnull(d.length, convert(int,c.length)),
SCALE = d.numeric_scale,
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),null),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(varchar(32),'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(varchar(32),c.name),
COLUMN_TYPE = convert(smallint, 0),
d.DATA_TYPE,
TYPE_NAME = t.name,
"PRECISION" = isnull(d.data_precision, convert(int,c.length)),
LENGTH = isnull(d.length, convert(int,c.length)),
SCALE = d.numeric_scale,
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),null),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.data_precision, convert(int,c.length))+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND t.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND c.usertype = t.usertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(varchar(32),'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
go
if (charindex('6.00', @@version) = 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_sproc_columns
go
/* Procedure for 6.0 and 6.50 servers */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name varchar(102) = '%', /* 3*36+5+1 */
@procedure_owner varchar(96) = null,
@procedure_qualifier varchar(32) = null,
@column_name varchar(96) = null,
@ODBCVer int = 2)
AS
DECLARE @group_num_lower smallint
DECLARE @group_num_upper smallint
DECLARE @semi_position int
DECLARE @full_procedure_name varchar(205)
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() <> @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @group_num_upper = @group_num_lower
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to group number of 1 */
select @group_num_lower = 1
select @group_num_upper = 32767
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = @procedure_name
end
else
begin /* Qualified procedure name */
SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((charindex('%',@full_procedure_name) = 0) and
(charindex('[',@full_procedure_name) = 0) and
(charindex('_',@full_procedure_name) = 0) and
@procedure_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(varchar(32),c.name),
COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else isnull(convert(int,c.prec), 2147483647)
end) "PRECISION",
convert(int,case
when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */
c.prec+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, c.scale),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.usertype = t.usertype
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(varchar(32),'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(varchar(32),c.name),
COLUMN_TYPE = convert(smallint, 1+((c.status/64)&1)),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else isnull(convert(int,c.prec), 2147483647)
end) "PRECISION",
convert(int,case
when d.ss_dtype IN (106, 108, 55, 63) then /* decimal/numeric types */
c.prec+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, c.scale),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(convert(int,c.prec), 2147483647)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.usertype = t.usertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(varchar(32),DB_NAME()),
PROCEDURE_OWNER = convert(varchar(32),USER_NAME(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(varchar(32),'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(varchar(32),'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(varchar(255),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_sproc_columns
go
/* Procedure for 7.0 server */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name nvarchar(390) = '%',
@procedure_owner nvarchar(384) = null,
@procedure_qualifier sysname = null,
@column_name nvarchar(384) = null,
@ODBCVer int = 2)
AS
DECLARE @group_num_lower smallint
DECLARE @group_num_upper smallint
DECLARE @semi_position int
DECLARE @full_procedure_name nvarchar(774)
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() <> @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @group_num_upper = @group_num_lower
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to all groups */
select @group_num_lower = 1
select @group_num_upper = 32767
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = quotename(@procedure_name)
end
else
begin /* Qualified procedure name */
if @procedure_owner = ''
begin /* If empty owner name */
SELECT @full_procedure_name = quotename(@procedure_owner)
end
else
begin
SELECT @full_procedure_name = quotename(@procedure_owner) +
'.' + quotename(@procedure_name)
end
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((isnull(charindex('%', @full_procedure_name),0) = 0) and
(isnull(charindex('[', @procedure_name),0) = 0) and
(isnull(charindex('[', @procedure_owner),0) = 0) and
(isnull(charindex('_', @full_procedure_name),0) = 0) and
not (@procedure_id is null))
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,c.name),
COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(sysname,'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,c.name),
COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(sysname,'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.name like @procedure_name
AND c.id = o.id
AND user_name(o.uid) like @procedure_owner
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
ORDER BY 1, 2, 3, 18
end
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_sproc_columns
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name nvarchar(390) = '%',
@procedure_owner nvarchar(384) = null,
@procedure_qualifier sysname = null,
@column_name nvarchar(384) = null,
@ODBCVer int = 2)
AS
DECLARE @group_num_lower smallint
DECLARE @group_num_upper smallint
DECLARE @semi_position int
DECLARE @full_procedure_name nvarchar(774)
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() <> @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @group_num_upper = @group_num_lower
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to all groups */
select @group_num_lower = 1
select @group_num_upper = 32767
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = quotename(@procedure_name)
end
else
begin /* Qualified procedure name */
if @procedure_owner = ''
begin /* If empty owner name */
SELECT @full_procedure_name = quotename(@procedure_owner)
end
else
begin
SELECT @full_procedure_name = quotename(@procedure_owner) +
'.' + quotename(@procedure_name)
end
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((isnull(charindex('%', @full_procedure_name),0) = 0) and
(isnull(charindex('[', @procedure_name),0) = 0) and
(isnull(charindex('[', @procedure_owner),0) = 0) and
(isnull(charindex('_', @full_procedure_name),0) = 0) and
not (@procedure_id is null))
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,c.name),
COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND c.name like @column_name
AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
AND ((c.number between @group_num_lower and @group_num_upper)
OR (c.number = 0 and o.type = 'FN'))
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5),
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(sysname,'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.colid = 1
AND o.type = 'P' /* Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* UDF return value */
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, c.isnullable),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND o.id = c.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND o.type = 'FN' /* Scalar UDF */
AND c.name like @column_name
AND c.colid = 0
AND c.number = 0
UNION ALL
SELECT /* Table valued functions */
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),
COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 3),
DATA_TYPE = convert(smallint, NULL),
TYPE_NAME = convert(sysname, 'table'),
"PRECISION" = convert(int,0),
LENGTH = convert(int,0),
SCALE = convert(smallint,0),
RADIX = convert(smallint,0),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254), 'Result table returned by table valued function'),
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, NULL),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,0)
FROM
syscomments c, sysobjects o
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.colid = 1
AND o.type IN ('TF', 'IF')
AND '@TABLE_RETURN_VALUE' like @column_name
AND c.number = 0
ORDER BY 1, 2, 3, 18
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,c.name),
COLUMN_TYPE = convert(smallint, 1+c.isoutparam),
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
d.NULLABLE,
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int, c.colid),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND c.name like @column_name
AND (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
AND ((c.number between @group_num_lower and @group_num_upper)
OR (c.number = 0 and o.type = 'FN'))
UNION ALL
SELECT /* return value row*/
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ isnull(ltrim(str(c.number,5)),'1')),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */
DATA_TYPE = convert(smallint, 4),
TYPE_NAME = convert(sysname,'int'),
"PRECISION" = convert(int,10),
LENGTH = convert(int,4),
SCALE = convert(smallint,0),
RADIX = convert(smallint,10),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, 4),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,56)
FROM
syscomments c, sysobjects o
WHERE
o.name like @procedure_name
AND c.id = o.id
AND user_name(o.uid) like @procedure_owner
AND c.colid = 1
AND o.type = 'P' /* Procedures */
AND '@RETURN_VALUE' like @column_name
AND c.number between @group_num_lower and @group_num_upper
UNION ALL
SELECT /* UDF return value */
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
COLUMN_NAME = convert(sysname,'@RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 5), /* SQL_RETURN_VALUE */
d.DATA_TYPE,
TYPE_NAME = t.name,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then /* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, c.isnullable),
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
COLUMN_DEF = convert(nvarchar(4000),NULL),
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),rtrim(substring('NO YES',d.NULLABLE*3+1,3))),
SS_DATA_TYPE = c.type
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND isnull(d.AUTO_INCREMENT,0) = 0
AND c.xusertype = t.xusertype
AND o.type = 'FN' /* Scalar UDF */
AND c.name like @column_name
AND c.colid = 0
AND c.number = 0
UNION ALL
SELECT /* Table valued functions */
PROCEDURE_QUALIFIER = convert(sysname,DB_NAME()),
PROCEDURE_OWNER = convert(sysname,USER_NAME(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';1'),
COLUMN_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
COLUMN_TYPE = convert(smallint, 3),
DATA_TYPE = convert(smallint, NULL),
TYPE_NAME = convert(sysname, 'table'),
"PRECISION" = convert(int,0),
LENGTH = convert(int,0),
SCALE = convert(smallint,0),
RADIX = convert(smallint,0),
NULLABLE = convert(smallint,0),
REMARKS = convert(varchar(254), 'Result table returned by table valued function'),
COLUMN_DEF = convert(nvarchar(4000),NULL),
SQL_DATA_TYPE = convert(smallint, NULL),
SQL_DATETIME_SUB = convert(smallint,null),
CHAR_OCTET_LENGTH = convert(int,null),
ORDINAL_POSITION = convert(int,0),
IS_NULLABLE = convert(varchar(254),'NO'),
SS_DATA_TYPE = convert(tinyint,0)
FROM
syscomments c, sysobjects o
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id = o.id
AND c.colid = 1
AND o.type IN ('TF', 'IF')
AND '@TABLE_RETURN_VALUE' like @column_name
AND c.number = 0
ORDER BY 1, 2, 3, 18
end
go
grant execute on sp_sproc_columns to public
go
dump tran master with no_log
go
print 'creating sp_statistics'
go
/* Procedure for pre-7.0 server */
CREATE PROCEDURE sp_statistics (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@index_name varchar(32) = '%',
@is_unique char(1) = 'N',
@accuracy char(1) = 'Q')
AS
set nocount on
DECLARE @indid int
DECLARE @lastindid int
DECLARE @table_id int
DECLARE @full_table_name varchar(65) /* 2*32+1 */
create table #TmpIndex(
TABLE_QUALIFIER varchar(32) NULL,
TABLE_OWNER varchar(32) NULL,
TABLE_NAME varchar(32) NOT NULL,
INDEX_QUALIFIER varchar(32) null,
INDEX_NAME varchar(32) null,
NON_UNIQUE smallint null,
TYPE smallint NOT NULL,
SEQ_IN_INDEX smallint null,
COLUMN_NAME varchar(32) null,
COLLATION char(1) null,
index_id int null,
CARDINALITY int null,
PAGES int null,
status smallint NOT NULL)
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
if @accuracy not in ('Q','E')
begin
raiserror 20002 '~~Rush_58~~'
return
end
if (@@trancount <> 0 and
charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* If inside a transaction */
raiserror 20003 '~~Rush_59~~'
return
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = @table_owner
end
else
begin
SELECT @full_table_name = @table_owner + '.' + @table_name
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
/* Start at lowest index id */
SELECT @indid = min(indid)
FROM sysindexes
WHERE id = @table_id
AND indid > 0
AND indid < 255
WHILE @indid is not NULL
BEGIN
INSERT #TmpIndex /* Add all columns that are in index */
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
o.name, /* INDEX_QUALIFIER */
x.name, /* INDEX_NAME */
0, /* NON_UNIQUE */
1, /* SQL_INDEX_CLUSTERED */
colid, /* SEQ_IN_INDEX */
INDEX_COL(@full_table_name,indid,colid),/* COLUMN_NAME */
'A', /* COLLATION */
@indid, /* index_id */
x.rows, /* CARDINALITY */
x.dpages, /* PAGES */
x.status /* status */
FROM sysindexes x, syscolumns c, sysobjects o
WHERE
x.id = @table_id
AND x.id = o.id
AND x.id = c.id
AND c.colid < keycnt+(x.status&16)/16 /* all but Unique Clust indices have an extra key */
AND x.indid = @indid
/*
** Now move @indid to the next index.
*/
SELECT @lastindid = @indid
SELECT @indid = NULL
SELECT @indid = min(indid)
FROM sysindexes
WHERE id = @table_id
AND indid > @lastindid
AND indid < 255
END
UPDATE #TmpIndex
SET NON_UNIQUE = 1
WHERE status&2 <> 2 /* If non-unique index */
UPDATE #TmpIndex
SET
TYPE = 3, /* SQL_INDEX_OTHER */
CARDINALITY = NULL,
PAGES = NULL
WHERE index_id > 1 /* If non-clustered index */
/* now add row for table statistics */
INSERT #TmpIndex
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
null, /* INDEX_QUALIFIER */
null, /* INDEX_NAME */
null, /* NON_UNIQUE */
0, /* SQL_TABLE_STAT */
null, /* SEQ_IN_INDEX */
null, /* COLUMN_NAME */
null, /* COLLATION */
0, /* index_id */
x.rows, /* CARDINALITY */
x.dpages, /* PAGES */
0 /* status */
FROM sysindexes x, sysobjects o
WHERE o.id = @table_id
AND x.id = o.id
AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */
/* then table stats are in */
/* a row with indid =0 */
if @is_unique <> 'Y' /* If all indexes desired */
SELECT
TABLE_QUALIFIER,
TABLE_OWNER,
TABLE_NAME,
NON_UNIQUE,
INDEX_QUALIFIER,
INDEX_NAME,
TYPE,
SEQ_IN_INDEX,
COLUMN_NAME,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION = convert(varchar(128),null)
FROM #TmpIndex
WHERE
INDEX_NAME like @index_name /* If matching name */
or INDEX_NAME is null /* If SQL_TABLE_STAT row */
ORDER BY 4, 7, 6, 8
else /* If only unique indexes desired */
SELECT
TABLE_QUALIFIER,
TABLE_OWNER,
TABLE_NAME,
NON_UNIQUE,
INDEX_QUALIFIER,
INDEX_NAME,
TYPE,
SEQ_IN_INDEX,
COLUMN_NAME,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION = convert(varchar(128),null)
FROM #TmpIndex
WHERE
(NON_UNIQUE = 0 /* If unique */
or NON_UNIQUE is NULL) /* If SQL_TABLE_STAT row */
and (INDEX_NAME like @index_name /* If matching name */
or INDEX_NAME is null) /* If SQL_TABLE_STAT row */
ORDER BY 4, 7, 6, 8
DROP TABLE #TmpIndex
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_statistics
go
/* Procedure for 7.0 server */
CREATE PROCEDURE sp_statistics (
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null,
@index_name sysname = '%',
@is_unique char(1) = 'N',
@accuracy char(1) = 'Q')
AS
set nocount on
DECLARE @indid int
DECLARE @lastindid int
DECLARE @table_id int
DECLARE @full_table_name nvarchar(257)
create table #TmpIndex(
TABLE_QUALIFIER sysname NULL,
TABLE_OWNER sysname NULL,
TABLE_NAME sysname NOT NULL,
INDEX_QUALIFIER sysname null,
INDEX_NAME sysname null,
NON_UNIQUE smallint null,
TYPE smallint NOT NULL,
SEQ_IN_INDEX smallint null,
COLUMN_NAME sysname null,
COLLATION char(1) null,
index_id int null,
CARDINALITY int null,
PAGES int null,
status int NOT NULL)
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @accuracy not in ('Q','E')
begin
raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')
return
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
/* Start at lowest index id */
SELECT @indid = min(indid)
FROM sysindexes
WHERE not (@table_id is null)
AND id = @table_id
AND indid > 0
AND indid < 255
/* Create a temp table to correct the ordinal position of the columns */
create table #TmpColumns
(ordinal int identity(1,1),
colid smallint not null)
/* Load columns into the temp table */
insert into #TmpColumns (colid)
select c.colid
from syscolumns c
where c.id = @table_id
order by c.colid
WHILE @indid is not NULL
BEGIN
INSERT #TmpIndex /* Add all columns that are in index */
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
o.name, /* INDEX_QUALIFIER */
x.name, /* INDEX_NAME */
case /* NON_UNIQUE */
WHEN x.status&2 <> 2 then 1 /* Nonunique index */
else 0 /* Unique index */
end,
case /* TYPE */
when @indid > 1 then 3 /* Non-Clustered */
else 1 /* Clustered index */
end,
tc.ordinal, /* SEQ_IN_INDEX */
INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME */
'A', /* COLLATION */
@indid, /* index_id */
case /* CARDINALITY */
when @indid > 1 then NULL /* Non-Clustered */
else x.rows /* Clustered index */
end,
case /* PAGES */
when @indid > 1 then NULL /* Non-Clustered */
else x.dpages /* Clustered index */
end,
x.status /* status */
FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc
WHERE
not (@table_id is null)
AND x.id = @table_id
AND x.id = o.id
AND x.id = c.id
AND tc.colid = c.colid
AND tc.ordinal < keycnt+(x.status&18)/18 /* all but Unique Clust indices have an extra key */
AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL
AND indid = @indid
AND (x.status&2 = 2
OR @is_unique <> 'Y')
AND (x.status&32) = 0
/*
** Now move @indid to the next index.
*/
SELECT @lastindid = @indid
SELECT @indid = NULL
SELECT @indid = min(indid)
FROM sysindexes
WHERE not (@table_id is null)
AND id = @table_id
AND indid > @lastindid
AND indid < 255
END
/* now add row for table statistics */
INSERT #TmpIndex
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
null, /* INDEX_QUALIFIER */
null, /* INDEX_NAME */
null, /* NON_UNIQUE */
0, /* SQL_TABLE_STAT */
null, /* SEQ_IN_INDEX */
null, /* COLUMN_NAME */
null, /* COLLATION */
0, /* index_id */
x.rows, /* CARDINALITY */
x.dpages, /* PAGES */
0 /* status */
FROM sysindexes x, sysobjects o
WHERE not (@table_id is null)
AND o.id = @table_id
AND x.id = o.id
AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */
/* then table stats are in */
/* a row with indid =0 */
SELECT
TABLE_QUALIFIER,
TABLE_OWNER,
TABLE_NAME,
NON_UNIQUE,
INDEX_QUALIFIER,
INDEX_NAME,
TYPE,
SEQ_IN_INDEX,
COLUMN_NAME,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION = convert(varchar(128),null)
FROM #TmpIndex
WHERE
INDEX_NAME like @index_name /* If matching name */
or INDEX_NAME is null /* If SQL_TABLE_STAT row */
ORDER BY 4, 7, 6, 8
DROP TABLE #TmpIndex, #TmpColumns
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_statistics
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_statistics (
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null,
@index_name sysname = '%',
@is_unique char(1) = 'N',
@accuracy char(1) = 'Q')
AS
set nocount on
DECLARE @indid int
DECLARE @lastindid int
DECLARE @table_id int
DECLARE @full_table_name nvarchar(257)
create table #TmpIndex(
TABLE_QUALIFIER sysname collate database_default NULL,
TABLE_OWNER sysname collate database_default NULL,
TABLE_NAME sysname collate database_default NOT NULL,
INDEX_QUALIFIER sysname collate database_default null,
INDEX_NAME sysname collate database_default null,
NON_UNIQUE smallint null,
TYPE smallint NOT NULL,
SEQ_IN_INDEX smallint null,
COLUMN_NAME sysname collate database_default null,
COLLATION char(1) collate database_default null,
index_id int null,
CARDINALITY int null,
PAGES int null,
status int NOT NULL)
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @accuracy not in ('Q','E')
begin
raiserror (15251,-1,-1,'accuracy','''Q'' or ''E''')
return
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin /* Qualified table name */
if @table_owner = ''
begin /* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
/* Start at lowest index id */
SELECT @indid = min(indid)
FROM sysindexes
WHERE not (@table_id is null)
AND id = @table_id
AND indid > 0
AND indid < 255
/* Create a temp table to correct the ordinal position of the columns */
create table #TmpColumns
(ordinal int identity(1,1),
colid smallint not null)
/* Load columns into the temp table */
insert into #TmpColumns (colid)
select c.colid
from syscolumns c
where c.id = @table_id
order by c.colid
WHILE @indid is not NULL
BEGIN
INSERT #TmpIndex /* Add all columns that are in index */
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
o.name, /* INDEX_QUALIFIER */
x.name, /* INDEX_NAME */
case /* NON_UNIQUE */
WHEN x.status&2 <> 2 then 1 /* Nonunique index */
else 0 /* Unique index */
end,
case /* TYPE */
when @indid > 1 then 3 /* Non-Clustered */
else 1 /* Clustered index */
end,
tc.ordinal, /* SEQ_IN_INDEX */
INDEX_COL(@full_table_name, indid, tc.ordinal),/* COLUMN_NAME */
'A', /* COLLATION */
@indid, /* index_id */
case /* CARDINALITY */
when @indid > 1 then NULL /* Non-Clustered */
else x.rows /* Clustered index */
end,
case /* PAGES */
when @indid > 1 then NULL /* Non-Clustered */
else x.dpages /* Clustered index */
end,
x.status /* status */
FROM sysindexes x, syscolumns c, sysobjects o, #TmpColumns tc
WHERE
not (@table_id is null)
AND x.id = @table_id
AND x.id = o.id
AND x.id = c.id
AND tc.colid = c.colid
AND tc.ordinal < keycnt+(x.status&18)/18 /* all but Unique Clust indices have an extra key */
AND INDEX_COL(@full_table_name, indid, tc.ordinal) IS NOT NULL
AND indid = @indid
AND (x.status&2 = 2
OR @is_unique <> 'Y')
AND (x.status&32) = 0
/*
** Now move @indid to the next index.
*/
SELECT @lastindid = @indid
SELECT @indid = NULL
SELECT @indid = min(indid)
FROM sysindexes
WHERE not (@table_id is null)
AND id = @table_id
AND indid > @lastindid
AND indid < 255
END
/* now add row for table statistics */
INSERT #TmpIndex
SELECT
DB_NAME(), /* TABLE_QUALIFIER */
USER_NAME(o.uid), /* TABLE_OWNER */
o.name, /* TABLE_NAME */
null, /* INDEX_QUALIFIER */
null, /* INDEX_NAME */
null, /* NON_UNIQUE */
0, /* SQL_TABLE_STAT */
null, /* SEQ_IN_INDEX */
null, /* COLUMN_NAME */
null, /* COLLATION */
0, /* index_id */
x.rows, /* CARDINALITY */
x.dpages, /* PAGES */
0 /* status */
FROM sysindexes x, sysobjects o
WHERE not (@table_id is null)
AND o.id = @table_id
AND x.id = o.id
AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */
/* then table stats are in */
/* a row with indid =0 */
SELECT
TABLE_QUALIFIER,
TABLE_OWNER,
TABLE_NAME,
NON_UNIQUE,
INDEX_QUALIFIER,
INDEX_NAME,
TYPE,
SEQ_IN_INDEX,
COLUMN_NAME,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION = convert(varchar(128),null)
FROM #TmpIndex
WHERE
INDEX_NAME like @index_name /* If matching name */
or INDEX_NAME is null /* If SQL_TABLE_STAT row */
ORDER BY 4, 7, 6, 8
DROP TABLE #TmpIndex, #TmpColumns
go
grant execute on sp_statistics to public
go
dump tran master with no_log
go
print 'creating sp_stored_procedures'
go
/* pre 8.0 version */
create procedure sp_stored_procedures(
@sp_name varchar(102) = null,
@sp_owner varchar(96) = null,
@sp_qualifier varchar(32) = null)
as
declare @proc_type smallint
if @sp_qualifier is not null
begin
if db_name() <> @sp_qualifier
begin
if @sp_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @sp_name = ''
select @sp_owner = ''
end else
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_51~~'
return
end
end
end
if @sp_name is null
begin /* If procedure name not supplied, match all */
select @sp_name = '%'
end
else begin
if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
begin
if exists (select * from sysobjects
where uid = user_id()
and name = @sp_name
and type = 'P') /* Object type of Procedure */
begin
select @sp_owner = user_name()
end
end
end
if @sp_owner is null /* If procedure owner not supplied, match all */
select @sp_owner = '%'
select @proc_type=2 /* Return 2 for 4.2 and later servers. */
select
PROCEDURE_QUALIFIER = convert(varchar(32),db_name()),
PROCEDURE_OWNER = convert(varchar(32),user_name(o.uid)),
PROCEDURE_NAME = convert(varchar(36),o.name +';'+ ltrim(str(c.number,5))),
NUM_INPUT_PARAMS = -1, /* Constant since value unknown */
NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
NUM_RESULT_SETS = -1, /* Constant since value unknown */
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
PROCEDURE_TYPE = @proc_type
from
sysobjects o,syscomments c,sysusers u
where
o.name like @sp_name
and c.colid = 1
and user_name(o.uid) like @sp_owner
and o.type = 'P' /* Object type of Procedure */
and c.id = o.id
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* outer join to correlate with all rows in sysobjects */
where p.id =* o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 1, 2, 3
go
grant execute on sp_stored_procedures to public
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_stored_procedures
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 7.0 version */
create procedure sp_stored_procedures(
@sp_name nvarchar(390) = null,
@sp_owner nvarchar(384) = null,
@sp_qualifier sysname = null)
as
declare @proc_type smallint
if @sp_qualifier is not null
begin
if db_name() <> @sp_qualifier
begin
if @sp_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @sp_name = ''
select @sp_owner = ''
end else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @sp_name is null
begin /* If procedure name not supplied, match all */
select @sp_name = '%'
end
else begin
if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
begin
if exists (select * from sysobjects
where uid = user_id()
and name = @sp_name
and type = 'P') /* Object type of Procedure */
begin
select @sp_owner = user_name()
end
end
end
if @sp_owner is null /* If procedure owner not supplied, match all */
select @sp_owner = '%'
select @proc_type=2 /* Return 2 for 4.2 and later servers. */
select
PROCEDURE_QUALIFIER = convert(sysname,db_name()),
PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
NUM_INPUT_PARAMS = -1, /* Constant since value unknown */
NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
NUM_RESULT_SETS = -1, /* Constant since value unknown */
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
PROCEDURE_TYPE = @proc_type
from
sysobjects o,syscomments c
where
o.name like @sp_name
and c.colid = 1
and user_name(o.uid) like @sp_owner
and o.type = 'P' /* Object type of Procedure */
and c.id = o.id
and permissions (o.id)&32 <> 0
order by 1, 2, 3
go
grant execute on sp_stored_procedures to public
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_stored_procedures
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
create procedure sp_stored_procedures(
@sp_name nvarchar(390) = null,
@sp_owner nvarchar(384) = null,
@sp_qualifier sysname = null)
as
declare @proc_type smallint
if @sp_qualifier is not null
begin
if db_name() <> @sp_qualifier
begin
if @sp_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @sp_name = ''
select @sp_owner = ''
end else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @sp_name is null
begin /* If procedure name not supplied, match all */
select @sp_name = '%'
end
else
begin
if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
begin
if exists (select * from sysobjects
where uid = user_id()
and name = @sp_name
and type in ('P', 'FN', 'TF', 'IF')) /* Procedures, scalar UDF, table UDF */
begin
select @sp_owner = user_name()
end
end
end
if @sp_owner is null /* If procedure owner not supplied, match all */
select @sp_owner = '%'
select @proc_type=2 /* Return 2 for 4.2 and later servers. */
select
PROCEDURE_QUALIFIER = convert(sysname,db_name()),
PROCEDURE_OWNER = convert(sysname,user_name(o.uid)),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
NUM_INPUT_PARAMS = -1, /* Constant since value unknown */
NUM_OUTPUT_PARAMS = -1, /* Constant since value unknown */
NUM_RESULT_SETS = -1, /* Constant since value unknown */
REMARKS = convert(varchar(254),null), /* Remarks are NULL */
PROCEDURE_TYPE = @proc_type
from
sysobjects o,syscomments c
where
o.name like @sp_name
and c.colid = 1
and user_name(o.uid) like @sp_owner
and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure, scalar UDF, table UDF */
and c.id = o.id
and permissions (o.id)&32 <> 0
order by 1, 2, 3
go
grant execute on sp_stored_procedures to public
go
dump tran master with no_log
go
print 'creating sp_table_privileges'
go
/* Procedure for pre 6.50 server */
CREATE PROCEDURE sp_table_privileges (
@table_name varchar(90),
@table_owner varchar(90) = null,
@table_qualifier varchar(32) = null)
as
set nocount on
declare @table_id int,
@owner_id int,
@full_table_name char(181)
declare @refconst int
select @refconst = 1
if (charindex('6.00', @@version) = 0)
select @refconst = NULL
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_table_privileges'' cannot be executed from within a transaction.'
return
end
create table #table_priv1(
table_qualifier varchar(32) NOT NULL,
table_owner varchar(32) NOT NULL,
table_name varchar(32) NOT NULL,
grantor varchar(32) NOT NULL,
grantee varchar(32) NOT NULL,
select_privilege int NOT NULL,
insert_privilege int NOT NULL,
update_privilege int NOT NULL,
delete_privilege int NOT NULL,
references_privilege int NULL,
is_grantable varchar(3) NOT NULL,
uid int NOT NULL,
gid int NOT NULL)
insert into #table_priv1
select distinct
db_name(),
user_name(o.uid),
o.name,
user_name(o.uid),
u.name,
0,
0,
0,
0,
@refconst,
'no',
u.uid,
u.gid
from sysusers u, sysobjects o
where o.id = @table_id and u.uid != u.gid
and sysstat & 0xf in (1,2,3) /* only valid for system tables,
** user tables, and views. */
/*
** now add row for table owner
*/
if exists (
select *
from #table_priv1
where grantor = grantee)
begin
update #table_priv1
set
select_privilege = 1,
update_privilege = 1,
insert_privilege = 1,
delete_privilege = 1,
references_privilege = 1,
is_grantable = 'yes'
where grantor = grantee
end
else
begin
insert into #table_priv1
select db_name(),
user_name(o.uid),
o.name,
user_name(o.uid),
user_name(o.uid),
1,
1,
1,
1,
@refconst,
'yes',
o.uid,
u.gid
from sysobjects o, sysusers u
where o.id = @table_id and u.uid = o.uid
and sysstat & 0xf in (1,2,3) /* only valid for system tables,
** user tables, and views. */
end
update #table_priv1
set select_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 193)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 193)
update #table_priv1
set insert_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 195)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 195)
update #table_priv1
set delete_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 196)
and not exists (select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 196)
update #table_priv1
set update_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 197)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 197)
update #table_priv1
set references_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 26)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 26)
create table #table_priv2(
table_qualifier varchar(32) NULL,
table_owner varchar(32) NULL,
table_name varchar(32) NOT NULL,
grantor varchar(32) NULL,
grantee varchar(32) NOT NULL,
privilege varchar(32) NOT NULL,
is_grantable varchar(3) NULL)
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'SELECT',
is_grantable
from #table_priv1
where select_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'INSERT',
is_grantable
from #table_priv1
where insert_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'DELETE',
is_grantable
from #table_priv1
where delete_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'UPDATE',
is_grantable
from #table_priv1
where update_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'REFERENCES',
is_grantable
from #table_priv1
where references_privilege = 1
select * from #table_priv2
order by table_owner,table_name,privilege,grantee
/* order by 2,3,6,5 Can't use since fails on 4.21a server */
go
if (charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.50 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_table_privileges
go
/* Procedure for 6.50 server */
CREATE PROCEDURE sp_table_privileges (
@table_name varchar(96),
@table_owner varchar(96) = null,
@table_qualifier varchar(32) = null)
as
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
select @table_name = '%'
if @table_owner is null /* If no owner supplied, force wildcard */
select @table_owner = '%'
select
convert(varchar(32),db_name()) TABLE_QUALIFIER,
convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
convert(varchar(32),object_name(o.id)) TABLE_NAME,
convert(varchar(32),user_name(p.grantor)) GRANTOR,
convert(varchar(32),user_name(u.uid)) GRANTEE,
convert(varchar(32),case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),case when p.protecttype = 205 then 'NO'
else 'YES'
end) IS_GRANTABLE
from sysprotects p, sysobjects o, sysusers u
where
p.id = o.id
and o.type in ('U','V','S')
and object_name(o.id) like @table_name
and user_name(o.uid) like @table_owner
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or
(p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
convert(varchar(32),db_name()) TABLE_QUALIFIER,
convert(varchar(32),user_name(o.uid)) TABLE_OWNER,
convert(varchar(32),object_name(o.id)) TABLE_NAME,
convert(varchar(32),user_name(u.uid)) GRANTOR,
convert(varchar(32),user_name(o.uid)) GRANTEE,
convert(varchar(32),case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),'YES') IS_GRANTABLE
from sysobjects o, master.dbo.spt_values v, sysusers u
where
object_name(o.id) like @table_name
and o.type in ('U','V','S')
and user_name(o.uid) like @table_owner
and u.uid = 1 /* grantor is dbo of database */
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 2,3,6,5
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop proc sp_table_privileges
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 and later servers */
CREATE PROCEDURE sp_table_privileges (
@table_name nvarchar(384),
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null)
as
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
select @table_name = '%'
if @table_owner is null /* If no owner supplied, force wildcard */
select @table_owner = '%'
select
convert(sysname,db_name()) TABLE_QUALIFIER,
convert(sysname,user_name(o.uid)) TABLE_OWNER,
convert(sysname,object_name(o.id)) TABLE_NAME,
convert(sysname,user_name(p.grantor)) GRANTOR,
convert(sysname,user_name(u.uid)) GRANTEE,
convert(varchar(32),case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),case when p.protecttype = 205 then 'NO'
else 'YES'
end) IS_GRANTABLE
from sysprotects p, sysobjects o, sysusers u, sysmembers m
where
p.id = o.id
and o.type in ('U','V','S')
and object_name(o.id) like @table_name
and user_name(o.uid) like @table_owner
/* expand groups - AKUNDONE: only 1 level of grp unrolling. */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or
(p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
convert(sysname,db_name()) TABLE_QUALIFIER,
convert(sysname,user_name(o.uid)) TABLE_OWNER,
convert(sysname,object_name(o.id)) TABLE_NAME,
convert(sysname,user_name(u.uid)) GRANTOR,
convert(sysname,user_name(o.uid)) GRANTEE,
convert(varchar(32),case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end) PRIVILEGE,
convert(varchar(3),'YES') IS_GRANTABLE
from sysobjects o, master.dbo.spt_values v, sysusers u
where
object_name(o.id) like @table_name
and o.type in ('U','V','S')
and user_name(o.uid) like @table_owner
and u.uid = 1 /* grantor is 'dbo' of database */
and v.type = N'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 2,3,6,5
go
grant execute on sp_table_privileges to public
go
dump tran master with no_log
go
print 'creating sp_tables'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_tables(
@table_name varchar(96) = null,
@table_owner varchar(96) = null,
@table_qualifier varchar(32) = null,
@table_type varchar(100) = null)
as
declare @type1 varchar(3)
declare @tableindex int
/* Special feature #1: enumerate databases when owner and name
are blank but qualifier is explicitly '%'. */
if @table_qualifier = '%' and
@table_owner = '' and
@table_name = ''
begin /* If enumerating databases */
select
TABLE_QUALIFIER = convert(varchar(32),d.name),
TABLE_OWNER = convert(varchar(32),null),
TABLE_NAME = convert(varchar(32),null),
TABLE_TYPE = convert(varchar(32),null),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from master.dbo.sysdatabases d
where d.name <> 'model' /* eliminate MODEL database */
order by 1
end
/* Special feature #2: enumerate owners when qualifier and name
are blank but owner is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '%' and
@table_name = ''
begin /* If enumerating owners */
select distinct
TABLE_QUALIFIER = convert(varchar(32),null),
TABLE_OWNER = convert(varchar(32),user_name(uid)),
TABLE_NAME = convert(varchar(32),null),
TABLE_TYPE = convert(varchar(32),null),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects
order by 2
end
/* Special feature #3: enumerate table types when qualifier, owner and
name are blank but table type is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '' and
@table_name = '' and
@table_type = '%'
begin /* If enumerating table types */
select
TABLE_QUALIFIER = convert(varchar(32),null),
TABLE_OWNER = convert(varchar(32),null),
TABLE_NAME = convert(varchar(32),null),
TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE VIEW',(colid-1)*12+1,12))),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects o, syscolumns c
where o.id=c.id and o.name='sysusers' and colid<=3
end
else
begin /* end of special features - do normal processing */
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin
if @table_qualifier = ''
begin /* If empty qualifier supplied */
/* Force an empty result set */
select @table_name = ''
select @table_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
end
end
if @table_type is null
begin /* Select all ODBC supported table types */
select @type1 = 'SUV'
end
else
begin
/* TableType is case sensitive if CS server */
select @type1 = null
if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
select @type1 = @type1 + 'S' /* Add System Tables */
if (charindex('''TABLE''',@table_type) <> 0)
select @type1 = @type1 + 'U' /* Add User Tables */
if (charindex('''VIEW''',@table_type) <> 0)
select @type1 = @type1 + 'V' /* Add Views */
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
else
begin
if (@table_owner is null) and (charindex('%', @table_name) = 0)
begin /* If owner not specified and table is specified */
if exists (select * from sysobjects
where uid = user_id()
and name = @table_name
and (type = 'U' or type = 'V' or type = 'S'))
begin /* Override supplied owner w/owner of table */
select @table_owner = user_name()
end
end
end
if @table_owner is null /* If no owner supplied, force wildcard */
select @table_owner = '%'
select
TABLE_QUALIFIER = convert(varchar(32),db_name()),
TABLE_OWNER = convert(varchar(32),user_name(o.uid)),
TABLE_NAME = convert(varchar(32),o.name), /* make nullable */
TABLE_TYPE = convert(varchar(32),rtrim(
substring('SYSTEM TABLE TABLE VIEW ',
(ascii(o.type)-83)*12+1,12))), /* 'S'=0,'U'=2,'V'=3 */
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysusers u, sysobjects o
where
o.name like @table_name
and user_name(o.uid) like @table_owner
and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* outer join to correlate with all rows in sysobjects */
where p.id =* o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 1, 2, 3
end
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_tables
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_tables(
@table_name nvarchar(384) = null,
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@table_type varchar(100) = null)
as
declare @type1 varchar(3)
declare @tableindex int
/* Special feature #1: enumerate databases when owner and name
are blank but qualifier is explicitly '%'. */
if @table_qualifier = '%' and
@table_owner = '' and
@table_name = ''
begin /* If enumerating databases */
select
TABLE_QUALIFIER = convert(sysname,d.name),
TABLE_OWNER = convert(sysname,null),
TABLE_NAME = convert(sysname,null),
TABLE_TYPE = convert(varchar(32),null),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from master.dbo.sysdatabases d
where d.name <> 'model' /* eliminate MODEL database */
order by 1
end
/* Special feature #2: enumerate owners when qualifier and name
are blank but owner is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '%' and
@table_name = ''
begin /* If enumerating owners */
select distinct
TABLE_QUALIFIER = convert(sysname,null),
TABLE_OWNER = convert(sysname,user_name(uid)),
TABLE_NAME = convert(sysname,null),
TABLE_TYPE = convert(varchar(32),null),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects
order by 2
end
/* Special feature #3: enumerate table types when qualifier, owner and
name are blank but table type is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '' and
@table_name = '' and
@table_type = '%'
begin /* If enumerating table types */
select
TABLE_QUALIFIER = convert(sysname,null),
TABLE_OWNER = convert(sysname,null),
TABLE_NAME = convert(sysname,null),
TABLE_TYPE = convert(varchar(32),rtrim(substring('SYSTEM TABLETABLE VIEW',(colid-1)*12+1,12))),
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects o, syscolumns c
where o.id=c.id and o.name='sysusers' and colid<=3
end
else
begin /* end of special features - do normal processing */
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin
if @table_qualifier = ''
begin /* If empty qualifier supplied */
/* Force an empty result set */
select @table_name = ''
select @table_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
end
if @table_type is null
begin /* Select all ODBC supported table types */
select @type1 = 'SUV'
end
else
begin
/* TableType is case sensitive if CS server */
select @type1 = ''
if (charindex('''SYSTEM TABLE''',@table_type) <> 0)
select @type1 = @type1 + 'S' /* Add System Tables */
if (charindex('''TABLE''',@table_type) <> 0)
select @type1 = @type1 + 'U' /* Add User Tables */
if (charindex('''VIEW''',@table_type) <> 0)
select @type1 = @type1 + 'V' /* Add Views */
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
else
begin
if (@table_owner is null) and (charindex('%', @table_name) = 0)
begin /* If owner not specified and table is specified */
if exists (select * from sysobjects
where uid = user_id()
and name = @table_name
and (type = 'U' or type = 'V' or type = 'S'))
begin /* Override supplied owner w/owner of table */
select @table_owner = user_name()
end
end
end
if @table_owner is null /* If no owner supplied, force wildcard */
select @table_owner = '%'
select
TABLE_QUALIFIER = convert(sysname,db_name()),
TABLE_OWNER = convert(sysname,user_name(o.uid)),
TABLE_NAME = convert(sysname,o.name), /* make nullable */
TABLE_TYPE = convert(varchar(32),rtrim(
substring('SYSTEM TABLE TABLE VIEW ',
(ascii(o.type)-83)*12+1,12))), /* 'S'=0,'U'=2,'V'=3 */
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects o
where
o.name like @table_name
and user_name(o.uid) like @table_owner
and o.type in ('U','V','S')
and charindex(substring(o.type,1,1),@type1) <> 0 /* Only desired types */
and permissions (o.id)&4096 <> 0
order by 4, 1, 2, 3
end
go
grant execute on sp_tables to public
go
dump tran master with no_log
go
/*-----------------------------------------------------------------------------*/
/*-------------- CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/
/*-----------------------------------------------------------------------------*/
if object_id('sp_linkedservers', 'P') is not null
drop proc sp_linkedservers
go
raiserror(15339,-1,-1,'sp_linkedservers')
go
create proc sp_linkedservers as
IF is_srvrolemember('sysadmin') = 1
begin
select
SRV_NAME = srvname,
SRV_PROVIDERNAME = providername,
SRV_PRODUCT = srvproduct,
SRV_DATASOURCE = datasource,
SRV_PROVIDERSTRING = providerstring,
SRV_LOCATION = location,
SRV_CAT = catalog
from master.dbo.sysservers
order by 1
end
ELSE
begin
select
SRV_NAME = srvname,
SRV_PROVIDERNAME = providername,
SRV_PRODUCT = srvproduct,
SRV_DATASOURCE = datasource,
SRV_PROVIDERSTRING = NULL,
SRV_LOCATION = location,
SRV_CAT = catalog
from master.dbo.sysservers
order by 1
end
go
grant execute on sp_linkedservers to public
go
if object_id('sp_catalogs', 'P') is not null
drop proc sp_catalogs
go
raiserror(15339,-1,-1,'sp_catalogs')
go
create procedure sp_catalogs(
@server_name sysname)
as
select
CATALOG_NAME,
convert (nvarchar(255),DESCRIPTION)
from master.dbo.SYSREMOTE_CATALOGS < @server_name >
order by CATALOG_NAME
go
grant execute on sp_catalogs to public
go
if object_id('sp_tables_ex', 'P') is not null
drop proc sp_tables_ex
go
raiserror(15339,-1,-1,'sp_tables_ex')
go
create procedure sp_tables_ex(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null,
@table_type sysname = null)
as
if ((isnull(charindex('%', @table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('_', @table_name),0) = 0))
begin /* If no wild carding */
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
TABLE_TYPE = TABLE_TYPE,
REMARKS = convert(nvarchar(255),DESCRIPTION)
from master.dbo.SYSREMOTE_TABLES <
@table_server,
@table_catalog,
NULL,
@table_name,
NULL >
where (TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (TABLE_CATALOG like @table_catalog
or @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))
and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0
or @table_type is NULL)
order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
end
else
begin /* If wild carding */
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
TABLE_TYPE = TABLE_TYPE,
REMARKS = convert(nvarchar(255),DESCRIPTION)
from master.dbo.SYSREMOTE_TABLES <
@table_server,
@table_catalog,
NULL,
NULL,
NULL >
where (TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (TABLE_CATALOG like @table_catalog
or @table_catalog is NULL or (TABLE_CATALOG is NULL and @table_catalog = N'%'))
and (charindex ('''' + TABLE_TYPE + '''', @table_type) <> 0
or @table_type is NULL)
and TABLE_NAME like @table_name
order by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
end
go
grant execute on sp_tables_ex to public
go
if object_id('sp_columns_ex', 'P') is not null
drop proc sp_columns_ex
go
/* 7.0 version */
raiserror(15339,-1,-1,'sp_columns_ex')
go
create procedure sp_columns_ex(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null,
@column_name sysname = null,
@ODBCVer int = 2)
as
set nocount on
declare
@DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1), @DBCOLUMNFLAGS_ISLONG binary(1),
@DBCOLUMNFLAGS_ISROWVER binary(2)
select
@DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10, @DBCOLUMNFLAGS_ISLONG = 0x80,
@DBCOLUMNFLAGS_ISROWVER = 0x0200
declare
@DBTYPE_I2 smallint, @DBTYPE_I4 smallint,
@DBTYPE_R4 smallint, @DBTYPE_R8 smallint,
@DBTYPE_CY smallint, @DBTYPE_DATE smallint,
@DBTYPE_BSTR smallint, @DBTYPE_BOOL smallint,
@DBTYPE_VARNUMERIC smallint, @DBTYPE_DECIMAL smallint,
@DBTYPE_UI1 smallint, @DBTYPE_BYREF smallint,
@DBTYPE_I1 smallint, @DBTYPE_UI2 smallint,
@DBTYPE_UI4 smallint, @DBTYPE_I8 smallint,
@DBTYPE_UI8 smallint, @DBTYPE_GUID smallint,
@DBTYPE_BYTES smallint, @DBTYPE_STR smallint,
@DBTYPE_WSTR smallint, @DBTYPE_NUMERIC smallint,
@DBTYPE_DBDATE smallint, @DBTYPE_DBTIME smallint,
@DBTYPE_DBTIMESTAMP smallint
select
@DBTYPE_I2 = 2, @DBTYPE_I4 = 3,
@DBTYPE_R4 = 4, @DBTYPE_R8 = 5,
@DBTYPE_CY = 6, @DBTYPE_DATE = 7,
@DBTYPE_BSTR = 8, @DBTYPE_BOOL = 11,
@DBTYPE_VARNUMERIC = 139, @DBTYPE_DECIMAL = 14,
@DBTYPE_UI1 = 17, @DBTYPE_BYREF = 16384,
@DBTYPE_I1 = 16, @DBTYPE_UI2 = 18,
@DBTYPE_UI4 = 19, @DBTYPE_I8 = 20,
@DBTYPE_UI8 = 21, @DBTYPE_GUID = 72,
@DBTYPE_BYTES = 128, @DBTYPE_STR = 129,
@DBTYPE_WSTR = 130, @DBTYPE_NUMERIC = 131,
@DBTYPE_DBDATE = 133, @DBTYPE_DBTIME = 134,
@DBTYPE_DBTIMESTAMP = 135
declare
@ODS_SMALLINT_NOT_NULL tinyint, @ODS_INT_NULL tinyint,
@ODS_INT_NOT_NULL tinyint, @ODS_TINYINT_NOT_NULL tinyint,
@ODS_REAL_NOT_NULL tinyint, @ODS_FLOAT_NULL tinyint,
@ODS_FLOAT_NOT_NULL tinyint, @ODS_MONEY_NULL tinyint,
@ODS_MONEY_NOT_NULL tinyint, @ODS_DATETIME_NULL tinyint,
@ODS_DATETIME_NOT_NULL tinyint, @ODS_TEXT tinyint,
@ODS_BIT tinyint, @ODS_DECIMAL tinyint,
@ODS_NUMERIC tinyint, @ODS_GUID tinyint,
@ODS_IMAGE tinyint, @ODS_TIMESTAMP tinyint,
@ODS_BINARY_NULL tinyint, @ODS_BINARY_NOT_NULL tinyint,
@ODS_VARBINARY tinyint, @ODS_CHAR_NULL tinyint,
@ODS_CHAR_NOT_NULL tinyint, @ODS_VARCHAR tinyint
select
@ODS_IMAGE = 34, @ODS_TEXT = 35,
@ODS_GUID = 36, @ODS_BINARY_NULL = 37,
@ODS_VARBINARY = 37, @ODS_INT_NULL = 38,
@ODS_CHAR_NULL = 39, @ODS_VARCHAR = 39,
@ODS_TIMESTAMP = 45, @ODS_BINARY_NOT_NULL = 45,
@ODS_CHAR_NOT_NULL = 47, @ODS_TINYINT_NOT_NULL = 48,
@ODS_BIT = 50, @ODS_SMALLINT_NOT_NULL = 52,
@ODS_INT_NOT_NULL = 56, @ODS_REAL_NOT_NULL = 59,
@ODS_MONEY_NOT_NULL = 60, @ODS_DATETIME_NOT_NULL = 61,
@ODS_FLOAT_NOT_NULL = 62, @ODS_DECIMAL = 106,
@ODS_NUMERIC = 108, @ODS_FLOAT_NULL = 109,
@ODS_MONEY_NULL = 110, @ODS_DATETIME_NULL = 111
declare
@ODBC_GUID smallint, @ODBC_NTEXT smallint,
@ODBC_NVARCHAR smallint, @ODBC_NCHAR smallint,
@ODBC_BIT smallint, @ODBC_TINYINT smallint,
@ODBC_IMAGE smallint, @ODBC_VARBINARY smallint,
@ODBC_TIMESTAMP smallint, @ODBC_BINARY smallint,
@ODBC_TEXT smallint, @ODBC_CHAR smallint,
@ODBC_NUMERIC smallint, @ODBC_DECIMAL smallint,
@ODBC_MONEY smallint, @ODBC_INT smallint,
@ODBC_SMALLINT smallint, @ODBC_FLOAT smallint,
@ODBC_REAL smallint, @ODBC_VARCHAR smallint,
@ODBC_DATETIME smallint
select
@ODBC_GUID = -11, @ODBC_NTEXT = -10,
@ODBC_NVARCHAR = -9, @ODBC_NCHAR = -8,
@ODBC_BIT = -7, @ODBC_TINYINT = -6,
@ODBC_IMAGE = -4, @ODBC_VARBINARY = -3,
@ODBC_TIMESTAMP = -2, @ODBC_BINARY = -2,
@ODBC_TEXT = -1, @ODBC_CHAR = 1,
@ODBC_NUMERIC = 2, @ODBC_DECIMAL = 3,
@ODBC_MONEY = 3, @ODBC_INT = 4,
@ODBC_SMALLINT = 5, @ODBC_FLOAT = 6,
@ODBC_REAL = 7, @ODBC_VARCHAR = 12,
@ODBC_DATETIME =
case @ODBCVer
when 2 then 11
else 93
end
create table #tmp_columns
( TABLE_CAT sysname NULL,
TABLE_SCHEM sysname NULL,
TABLE_NAME sysname NOT NULL,
COLUMN_NAME sysname NULL,
DATA_TYPE smallint NOT NULL,
TYPE_NAME sysname NULL,
COLUMN_SIZE int NULL,
BUFFER_LENGTH int NULL,
DECIMAL_DIGITS smallint NULL,
NUM_PREC_RADIX smallint NULL,
NULLABLE smallint NOT NULL,
REMARKS nvarchar(255) NULL,
COLUMN_DEF nvarchar(128) NULL,
SQL_DATA_TYPE smallint null,
SQL_DATETIME_SUB smallint NULL,
CHAR_OCTET_LENGTH int NULL,
ORDINAL_POSITION smallint,
IS_NULLABLE varchar(254) NOT NULL,
SS_DATA_TYPE tinyint null,
COLUMN_FLAGS int NOT NULL)
if ((isnull(charindex('%', @table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('_', @table_name),0) = 0))
begin /* If no wild carding */
insert into #tmp_columns
select
TABLE_CAT = c.TABLE_CATALOG,
TABLE_SCHEM = c.TABLE_SCHEMA,
TABLE_NAME = c.TABLE_NAME,
COLUMN_NAME = c.COLUMN_NAME,
DATA_TYPE =
case c.DATA_TYPE & ~@DBTYPE_BYREF
when @DBTYPE_I2 then @ODBC_SMALLINT
when @DBTYPE_I4 then @ODBC_INT
when @DBTYPE_R4 then @ODBC_REAL
when @DBTYPE_R8 then @ODBC_FLOAT
when @DBTYPE_CY then @ODBC_MONEY
when @DBTYPE_DATE then @ODBC_DATETIME
when @DBTYPE_DBDATE then @ODBC_DATETIME
when @DBTYPE_DBTIME then @ODBC_DATETIME
when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME
when @DBTYPE_BOOL then @ODBC_BIT
when @DBTYPE_DECIMAL then @ODBC_DECIMAL
when @DBTYPE_UI1 then @ODBC_TINYINT
when @DBTYPE_I1 then @ODBC_NUMERIC
when @DBTYPE_UI2 then @ODBC_NUMERIC
when @DBTYPE_UI4 then @ODBC_NUMERIC
when @DBTYPE_I8 then @ODBC_NUMERIC
when @DBTYPE_UI8 then @ODBC_NUMERIC
when @DBTYPE_NUMERIC then @ODBC_NUMERIC
when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC
when @DBTYPE_GUID then @ODBC_GUID
when @DBTYPE_BYTES then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
p.COLUMN_SIZE = 8
then @ODBC_TIMESTAMP
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODBC_BINARY
else @ODBC_VARBINARY
end
when @DBTYPE_STR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
else @ODBC_VARCHAR
end
when @DBTYPE_WSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
when @DBTYPE_BSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
else @ODBC_NVARCHAR /* Unknown OleDB datatype */
end,
TYPE_NAME = p.TYPE_NAME,
COLUMN_SIZE =
COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
DECIMAL_DIGITS = c.NUMERIC_SCALE,
NUM_PREC_RADIX = NULL,
NULLABLE = convert(smallint, c.IS_NULLABLE),
REMARKS = convert(nvarchar(255),c.DESCRIPTION),
COLUMN_DEF = c.COLUMN_DEFAULT,
SQL_DATA_TYPE = NULL,
SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
ORDINAL_POSITION = c.ORDINAL_POSITION,
IS_NULLABLE =
case c.IS_NULLABLE
when 1 then 'YES'
else 'NO'
end,
SS_DATA_TYPE = NULL,
COLUMN_FLAGS = c.COLUMN_FLAGS
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
NULL,
@table_name,
NULL > c,
master.dbo.SYSREMOTE_PROVIDER_TYPES <
@table_server > p
/* LUXOR/KAGERA don't support restricting DATA_TYPE */
where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
(TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (c.COLUMN_NAME like @column_name
or @column_name is NULL)
end
else
begin /* If wild carding */
insert into #tmp_columns
select
TABLE_CAT = c.TABLE_CATALOG,
TABLE_SCHEM = c.TABLE_SCHEMA,
TABLE_NAME = c.TABLE_NAME,
COLUMN_NAME = c.COLUMN_NAME,
DATA_TYPE =
case c.DATA_TYPE & ~@DBTYPE_BYREF
when @DBTYPE_I2 then @ODBC_SMALLINT
when @DBTYPE_I4 then @ODBC_INT
when @DBTYPE_R4 then @ODBC_REAL
when @DBTYPE_R8 then @ODBC_FLOAT
when @DBTYPE_CY then @ODBC_MONEY
when @DBTYPE_DATE then @ODBC_DATETIME
when @DBTYPE_DBDATE then @ODBC_DATETIME
when @DBTYPE_DBTIME then @ODBC_DATETIME
when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME
when @DBTYPE_BOOL then @ODBC_BIT
when @DBTYPE_DECIMAL then @ODBC_DECIMAL
when @DBTYPE_UI1 then @ODBC_TINYINT
when @DBTYPE_I1 then @ODBC_NUMERIC
when @DBTYPE_UI2 then @ODBC_NUMERIC
when @DBTYPE_UI4 then @ODBC_NUMERIC
when @DBTYPE_I8 then @ODBC_NUMERIC
when @DBTYPE_UI8 then @ODBC_NUMERIC
when @DBTYPE_NUMERIC then @ODBC_NUMERIC
when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC
when @DBTYPE_GUID then @ODBC_GUID
when @DBTYPE_BYTES then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
p.COLUMN_SIZE = 8
then @ODBC_TIMESTAMP
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODBC_BINARY
else @ODBC_VARBINARY
end
when @DBTYPE_STR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
else @ODBC_VARCHAR
end
when @DBTYPE_WSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
when @DBTYPE_BSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
else @ODBC_NVARCHAR /* Unknown OleDB datatype */
end,
TYPE_NAME = p.TYPE_NAME,
COLUMN_SIZE =
COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
DECIMAL_DIGITS = c.NUMERIC_SCALE,
NUM_PREC_RADIX = NULL,
NULLABLE = convert(smallint, c.IS_NULLABLE),
REMARKS = convert(nvarchar(255),c.DESCRIPTION),
COLUMN_DEF = c.COLUMN_DEFAULT,
SQL_DATA_TYPE = NULL,
SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
ORDINAL_POSITION = c.ORDINAL_POSITION,
IS_NULLABLE =
case c.IS_NULLABLE
when 1 then 'YES'
else 'NO'
end,
SS_DATA_TYPE = NULL,
COLUMN_FLAGS = c.COLUMN_FLAGS
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
NULL,
NULL,
NULL > c,
master.dbo.SYSREMOTE_PROVIDER_TYPES <
@table_server > p
/* LUXOR/KAGERA don't support restricting DATA_TYPE */
where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
(TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (c.COLUMN_NAME like @column_name
or @column_name is NULL)
and c.TABLE_NAME like @table_name
end
update #tmp_columns
set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,
SQL_DATETIME_SUB =
case
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3
else #tmp_columns.SQL_DATETIME_SUB
end,
TYPE_NAME =
case
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
BUFFER_LENGTH = 8
then 'timestamp'
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
#tmp_columns.SQL_DATETIME_SUB = 0
then 'smalldatetime'
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and
#tmp_columns.COLUMN_SIZE = 10
then 'smallmoney'
when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or
#tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)
then spt_dt.TYPE_NAME
else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME)
end,
COLUMN_SIZE =
case
when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */
spt_dt.data_precision
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
#tmp_columns.SQL_DATETIME_SUB = 0
then 16
else #tmp_columns.COLUMN_SIZE
end,
BUFFER_LENGTH =
case
when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then /* decimal/numeric types */
COLUMN_SIZE+2
when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length
else #tmp_columns.BUFFER_LENGTH
end,
DECIMAL_DIGITS =
case
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME
then #tmp_columns.SQL_DATETIME_SUB
else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)
end,
NUM_PREC_RADIX = spt_dt.RADIX,
SS_DATA_TYPE =
case
when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT )
and #tmp_columns.NULLABLE = 1
then @ODS_INT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0
then @ODS_TINYINT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT and #tmp_columns.NULLABLE = 0
then @ODS_SMALLINT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_INT and #tmp_columns.NULLABLE = 0
then @ODS_INT_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1
then @ODS_FLOAT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0
then @ODS_REAL_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0
then @ODS_FLOAT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1
then @ODS_MONEY_NULL
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0
then @ODS_MONEY_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1
then @ODS_DATETIME_NULL
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0
then @ODS_DATETIME_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT
when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT
when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then @ODS_DECIMAL
when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then @ODS_NUMERIC
when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID
when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then @ODS_IMAGE
when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
BUFFER_LENGTH = 8
then @ODS_TIMESTAMP
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 1
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODS_BINARY_NULL
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 0
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODS_BINARY_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY
then @ODS_VARBINARY
when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1
then @ODS_CHAR_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0
then @ODS_CHAR_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR
else null
end
from master.dbo.spt_datatype_info spt_dt
where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE
AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)
and isnull(spt_dt.AUTO_INCREMENT,0) = 0
and not spt_dt.TYPE_NAME = 'smalldatetime'
select
TABLE_CAT, TABLE_SCHEM, TABLE_NAME,
COLUMN_NAME, DATA_TYPE, TYPE_NAME,
COLUMN_SIZE, BUFFER_LENGTH, DECIMAL_DIGITS,
NUM_PREC_RADIX, NULLABLE, REMARKS,
COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE,
SS_DATA_TYPE
from #tmp_columns
order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
drop table #tmp_columns
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_columns_ex
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
raiserror(15339,-1,-1,'sp_columns_ex')
go
create procedure sp_columns_ex(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null,
@column_name sysname = null,
@ODBCVer int = 2)
as
set nocount on
declare
@DBCOLUMNFLAGS_ISFIXEDLENGTH binary(1), @DBCOLUMNFLAGS_ISLONG binary(1),
@DBCOLUMNFLAGS_ISROWVER binary(2)
select
@DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10, @DBCOLUMNFLAGS_ISLONG = 0x80,
@DBCOLUMNFLAGS_ISROWVER = 0x0200
declare
@DBTYPE_I2 smallint, @DBTYPE_I4 smallint,
@DBTYPE_R4 smallint, @DBTYPE_R8 smallint,
@DBTYPE_CY smallint, @DBTYPE_DATE smallint,
@DBTYPE_BSTR smallint, @DBTYPE_BOOL smallint,
@DBTYPE_VARNUMERIC smallint, @DBTYPE_DECIMAL smallint,
@DBTYPE_UI1 smallint, @DBTYPE_BYREF smallint,
@DBTYPE_I1 smallint, @DBTYPE_UI2 smallint,
@DBTYPE_UI4 smallint, @DBTYPE_I8 smallint,
@DBTYPE_UI8 smallint, @DBTYPE_GUID smallint,
@DBTYPE_BYTES smallint, @DBTYPE_STR smallint,
@DBTYPE_WSTR smallint, @DBTYPE_NUMERIC smallint,
@DBTYPE_DBDATE smallint, @DBTYPE_DBTIME smallint,
@DBTYPE_DBTIMESTAMP smallint
select
@DBTYPE_I2 = 2, @DBTYPE_I4 = 3,
@DBTYPE_R4 = 4, @DBTYPE_R8 = 5,
@DBTYPE_CY = 6, @DBTYPE_DATE = 7,
@DBTYPE_BSTR = 8, @DBTYPE_BOOL = 11,
@DBTYPE_VARNUMERIC = 139, @DBTYPE_DECIMAL = 14,
@DBTYPE_UI1 = 17, @DBTYPE_BYREF = 16384,
@DBTYPE_I1 = 16, @DBTYPE_UI2 = 18,
@DBTYPE_UI4 = 19, @DBTYPE_I8 = 20,
@DBTYPE_UI8 = 21, @DBTYPE_GUID = 72,
@DBTYPE_BYTES = 128, @DBTYPE_STR = 129,
@DBTYPE_WSTR = 130, @DBTYPE_NUMERIC = 131,
@DBTYPE_DBDATE = 133, @DBTYPE_DBTIME = 134,
@DBTYPE_DBTIMESTAMP = 135
declare
@ODS_SMALLINT_NOT_NULL tinyint, @ODS_INT_NULL tinyint,
@ODS_INT_NOT_NULL tinyint, @ODS_TINYINT_NOT_NULL tinyint,
@ODS_REAL_NOT_NULL tinyint, @ODS_FLOAT_NULL tinyint,
@ODS_FLOAT_NOT_NULL tinyint, @ODS_MONEY_NULL tinyint,
@ODS_MONEY_NOT_NULL tinyint, @ODS_DATETIME_NULL tinyint,
@ODS_DATETIME_NOT_NULL tinyint, @ODS_TEXT tinyint,
@ODS_BIT tinyint, @ODS_DECIMAL tinyint,
@ODS_NUMERIC tinyint, @ODS_GUID tinyint,
@ODS_IMAGE tinyint, @ODS_TIMESTAMP tinyint,
@ODS_BINARY_NULL tinyint, @ODS_BINARY_NOT_NULL tinyint,
@ODS_VARBINARY tinyint, @ODS_CHAR_NULL tinyint,
@ODS_CHAR_NOT_NULL tinyint, @ODS_VARCHAR tinyint
select
@ODS_IMAGE = 34, @ODS_TEXT = 35,
@ODS_GUID = 36, @ODS_BINARY_NULL = 37,
@ODS_VARBINARY = 37, @ODS_INT_NULL = 38,
@ODS_CHAR_NULL = 39, @ODS_VARCHAR = 39,
@ODS_TIMESTAMP = 45, @ODS_BINARY_NOT_NULL = 45,
@ODS_CHAR_NOT_NULL = 47, @ODS_TINYINT_NOT_NULL = 48,
@ODS_BIT = 50, @ODS_SMALLINT_NOT_NULL = 52,
@ODS_INT_NOT_NULL = 56, @ODS_REAL_NOT_NULL = 59,
@ODS_MONEY_NOT_NULL = 60, @ODS_DATETIME_NOT_NULL = 61,
@ODS_FLOAT_NOT_NULL = 62, @ODS_DECIMAL = 106,
@ODS_NUMERIC = 108, @ODS_FLOAT_NULL = 109,
@ODS_MONEY_NULL = 110, @ODS_DATETIME_NULL = 111
declare
@ODBC_GUID smallint, @ODBC_NTEXT smallint,
@ODBC_NVARCHAR smallint, @ODBC_NCHAR smallint,
@ODBC_BIT smallint, @ODBC_TINYINT smallint,
@ODBC_IMAGE smallint, @ODBC_VARBINARY smallint,
@ODBC_TIMESTAMP smallint, @ODBC_BINARY smallint,
@ODBC_TEXT smallint, @ODBC_CHAR smallint,
@ODBC_NUMERIC smallint, @ODBC_DECIMAL smallint,
@ODBC_MONEY smallint, @ODBC_INT smallint,
@ODBC_SMALLINT smallint, @ODBC_FLOAT smallint,
@ODBC_REAL smallint, @ODBC_VARCHAR smallint,
@ODBC_DATETIME smallint
select
@ODBC_GUID = -11, @ODBC_NTEXT = -10,
@ODBC_NVARCHAR = -9, @ODBC_NCHAR = -8,
@ODBC_BIT = -7, @ODBC_TINYINT = -6,
@ODBC_IMAGE = -4, @ODBC_VARBINARY = -3,
@ODBC_TIMESTAMP = -2, @ODBC_BINARY = -2,
@ODBC_TEXT = -1, @ODBC_CHAR = 1,
@ODBC_NUMERIC = 2, @ODBC_DECIMAL = 3,
@ODBC_MONEY = 3, @ODBC_INT = 4,
@ODBC_SMALLINT = 5, @ODBC_FLOAT = 6,
@ODBC_REAL = 7, @ODBC_VARCHAR = 12,
@ODBC_DATETIME =
case @ODBCVer
when 2 then 11
else 93
end
create table #tmp_columns
( TABLE_CAT sysname collate database_default NULL,
TABLE_SCHEM sysname collate database_default NULL,
TABLE_NAME sysname collate database_default NOT NULL,
COLUMN_NAME sysname collate database_default NULL,
DATA_TYPE smallint NOT NULL,
TYPE_NAME sysname collate database_default NULL,
COLUMN_SIZE int NULL,
BUFFER_LENGTH int NULL,
DECIMAL_DIGITS smallint NULL,
NUM_PREC_RADIX smallint NULL,
NULLABLE smallint NOT NULL,
REMARKS nvarchar(255) collate database_default NULL,
COLUMN_DEF nvarchar(128) collate database_default NULL,
SQL_DATA_TYPE smallint null,
SQL_DATETIME_SUB smallint NULL,
CHAR_OCTET_LENGTH int NULL,
ORDINAL_POSITION smallint,
IS_NULLABLE varchar(254) collate database_default NOT NULL,
SS_DATA_TYPE tinyint null,
COLUMN_FLAGS int NOT NULL)
if ((isnull(charindex('%', @table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('_', @table_name),0) = 0))
begin /* If no wild carding */
insert into #tmp_columns
select
TABLE_CAT = c.TABLE_CATALOG,
TABLE_SCHEM = c.TABLE_SCHEMA,
TABLE_NAME = c.TABLE_NAME,
COLUMN_NAME = c.COLUMN_NAME,
DATA_TYPE =
case c.DATA_TYPE & ~@DBTYPE_BYREF
when @DBTYPE_I2 then @ODBC_SMALLINT
when @DBTYPE_I4 then @ODBC_INT
when @DBTYPE_R4 then @ODBC_REAL
when @DBTYPE_R8 then @ODBC_FLOAT
when @DBTYPE_CY then @ODBC_MONEY
when @DBTYPE_DATE then @ODBC_DATETIME
when @DBTYPE_DBDATE then @ODBC_DATETIME
when @DBTYPE_DBTIME then @ODBC_DATETIME
when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME
when @DBTYPE_BOOL then @ODBC_BIT
when @DBTYPE_DECIMAL then @ODBC_DECIMAL
when @DBTYPE_UI1 then @ODBC_TINYINT
when @DBTYPE_I1 then @ODBC_NUMERIC
when @DBTYPE_UI2 then @ODBC_NUMERIC
when @DBTYPE_UI4 then @ODBC_NUMERIC
when @DBTYPE_I8 then @ODBC_NUMERIC
when @DBTYPE_UI8 then @ODBC_NUMERIC
when @DBTYPE_NUMERIC then @ODBC_NUMERIC
when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC
when @DBTYPE_GUID then @ODBC_GUID
when @DBTYPE_BYTES then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
p.COLUMN_SIZE = 8
then @ODBC_TIMESTAMP
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODBC_BINARY
else @ODBC_VARBINARY
end
when @DBTYPE_STR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
else @ODBC_VARCHAR
end
when @DBTYPE_WSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
when @DBTYPE_BSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
else @ODBC_NVARCHAR /* Unknown OleDB datatype */
end,
TYPE_NAME = p.TYPE_NAME,
COLUMN_SIZE =
COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
DECIMAL_DIGITS = c.NUMERIC_SCALE,
NUM_PREC_RADIX = NULL,
NULLABLE = convert(smallint, c.IS_NULLABLE),
REMARKS = convert(nvarchar(255),c.DESCRIPTION),
COLUMN_DEF = c.COLUMN_DEFAULT,
SQL_DATA_TYPE = NULL,
SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
ORDINAL_POSITION = c.ORDINAL_POSITION,
IS_NULLABLE =
case c.IS_NULLABLE
when 1 then 'YES'
else 'NO'
end,
SS_DATA_TYPE = NULL,
COLUMN_FLAGS = c.COLUMN_FLAGS
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
NULL,
@table_name,
NULL > c,
master.dbo.SYSREMOTE_PROVIDER_TYPES <
@table_server > p
/* LUXOR/KAGERA don't support restricting DATA_TYPE */
where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
(TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (c.COLUMN_NAME like @column_name
or @column_name is NULL)
end
else
begin /* If wild carding */
insert into #tmp_columns
select
TABLE_CAT = c.TABLE_CATALOG,
TABLE_SCHEM = c.TABLE_SCHEMA,
TABLE_NAME = c.TABLE_NAME,
COLUMN_NAME = c.COLUMN_NAME,
DATA_TYPE =
case c.DATA_TYPE & ~@DBTYPE_BYREF
when @DBTYPE_I2 then @ODBC_SMALLINT
when @DBTYPE_I4 then @ODBC_INT
when @DBTYPE_R4 then @ODBC_REAL
when @DBTYPE_R8 then @ODBC_FLOAT
when @DBTYPE_CY then @ODBC_MONEY
when @DBTYPE_DATE then @ODBC_DATETIME
when @DBTYPE_DBDATE then @ODBC_DATETIME
when @DBTYPE_DBTIME then @ODBC_DATETIME
when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME
when @DBTYPE_BOOL then @ODBC_BIT
when @DBTYPE_DECIMAL then @ODBC_DECIMAL
when @DBTYPE_UI1 then @ODBC_TINYINT
when @DBTYPE_I1 then @ODBC_NUMERIC
when @DBTYPE_UI2 then @ODBC_NUMERIC
when @DBTYPE_UI4 then @ODBC_NUMERIC
when @DBTYPE_I8 then @ODBC_NUMERIC
when @DBTYPE_UI8 then @ODBC_NUMERIC
when @DBTYPE_NUMERIC then @ODBC_NUMERIC
when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC
when @DBTYPE_GUID then @ODBC_GUID
when @DBTYPE_BYTES then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
p.COLUMN_SIZE = 8
then @ODBC_TIMESTAMP
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODBC_BINARY
else @ODBC_VARBINARY
end
when @DBTYPE_STR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR
else @ODBC_VARCHAR
end
when @DBTYPE_WSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
when @DBTYPE_BSTR then
case
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT
when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR
else @ODBC_NVARCHAR
end
else @ODBC_NVARCHAR /* Unknown OleDB datatype */
end,
TYPE_NAME = p.TYPE_NAME,
COLUMN_SIZE =
COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE),
BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH,
DECIMAL_DIGITS = c.NUMERIC_SCALE,
NUM_PREC_RADIX = NULL,
NULLABLE = convert(smallint, c.IS_NULLABLE),
REMARKS = convert(nvarchar(255),c.DESCRIPTION),
COLUMN_DEF = c.COLUMN_DEFAULT,
SQL_DATA_TYPE = NULL,
SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION),
CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH,
ORDINAL_POSITION = c.ORDINAL_POSITION,
IS_NULLABLE =
case c.IS_NULLABLE
when 1 then 'YES'
else 'NO'
end,
SS_DATA_TYPE = NULL,
COLUMN_FLAGS = c.COLUMN_FLAGS
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
NULL,
NULL,
NULL > c,
master.dbo.SYSREMOTE_PROVIDER_TYPES <
@table_server > p
/* LUXOR/KAGERA don't support restricting DATA_TYPE */
where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and
(TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (c.COLUMN_NAME like @column_name
or @column_name is NULL)
and c.TABLE_NAME like @table_name
end
update #tmp_columns
set SQL_DATA_TYPE = spt_dt.SQL_DATA_TYPE,
SQL_DATETIME_SUB =
case
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME then 3
else #tmp_columns.SQL_DATETIME_SUB
end,
TYPE_NAME =
case
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
BUFFER_LENGTH = 8
then 'timestamp'
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
#tmp_columns.SQL_DATETIME_SUB = 0
then 'smalldatetime'
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and
#tmp_columns.COLUMN_SIZE = 10
then 'smallmoney'
when (#tmp_columns.DATA_TYPE in (@ODBC_BINARY, @ODBC_CHAR) and
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH) or
#tmp_columns.DATA_TYPE in (@ODBC_TEXT, @ODBC_NTEXT, @ODBC_IMAGE)
then spt_dt.TYPE_NAME collate database_default
else isnull(#tmp_columns.TYPE_NAME, spt_dt.TYPE_NAME collate database_default)
end,
COLUMN_SIZE =
case
when #tmp_columns.DATA_TYPE IN (@ODBC_REAL, @ODBC_FLOAT) then /* app. numeric types */
spt_dt.data_precision
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and
#tmp_columns.SQL_DATETIME_SUB = 0
then 16
else #tmp_columns.COLUMN_SIZE
end,
BUFFER_LENGTH =
case
when #tmp_columns.DATA_TYPE IN (@ODBC_NUMERIC, @ODBC_DECIMAL) then /* decimal/numeric types */
COLUMN_SIZE+2
when isnull (#tmp_columns.BUFFER_LENGTH,0) = 0 then spt_dt.length
else #tmp_columns.BUFFER_LENGTH
end,
DECIMAL_DIGITS =
case
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME
then #tmp_columns.SQL_DATETIME_SUB
else COALESCE (DECIMAL_DIGITS, spt_dt.numeric_scale)
end,
NUM_PREC_RADIX = spt_dt.RADIX,
SS_DATA_TYPE =
case
when #tmp_columns.DATA_TYPE in ( @ODBC_TINYINT, @ODBC_SMALLINT, @ODBC_INT )
and #tmp_columns.NULLABLE = 1
then @ODS_INT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_TINYINT and #tmp_columns.NULLABLE = 0
then @ODS_TINYINT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_SMALLINT and #tmp_columns.NULLABLE = 0
then @ODS_SMALLINT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_INT and #tmp_columns.NULLABLE = 0
then @ODS_INT_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_REAL, @ODBC_FLOAT) and #tmp_columns.NULLABLE = 1
then @ODS_FLOAT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_REAL and #tmp_columns.NULLABLE = 0
then @ODS_REAL_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_FLOAT and #tmp_columns.NULLABLE = 0
then @ODS_FLOAT_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 1
then @ODS_MONEY_NULL
when #tmp_columns.DATA_TYPE = @ODBC_MONEY and #tmp_columns.NULLABLE = 0
then @ODS_MONEY_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 1
then @ODS_DATETIME_NULL
when #tmp_columns.DATA_TYPE = @ODBC_DATETIME and #tmp_columns.NULLABLE = 0
then @ODS_DATETIME_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_NTEXT, @ODBC_TEXT) then @ODS_TEXT
when #tmp_columns.DATA_TYPE = @ODBC_BIT then @ODS_BIT
when #tmp_columns.DATA_TYPE = @ODBC_DECIMAL then @ODS_DECIMAL
when #tmp_columns.DATA_TYPE = @ODBC_NUMERIC then @ODS_NUMERIC
when #tmp_columns.DATA_TYPE = @ODBC_GUID then @ODS_GUID
when #tmp_columns.DATA_TYPE = @ODBC_IMAGE then @ODS_IMAGE
when #tmp_columns.DATA_TYPE = @ODBC_TIMESTAMP
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND
(COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and
BUFFER_LENGTH = 8
then @ODS_TIMESTAMP
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 1
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODS_BINARY_NULL
when #tmp_columns.DATA_TYPE = @ODBC_BINARY and #tmp_columns.NULLABLE = 0
and (COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH)
then @ODS_BINARY_NOT_NULL
when #tmp_columns.DATA_TYPE = @ODBC_VARBINARY
then @ODS_VARBINARY
when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 1
then @ODS_CHAR_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_CHAR, @ODBC_NCHAR) and #tmp_columns.NULLABLE = 0
then @ODS_CHAR_NOT_NULL
when #tmp_columns.DATA_TYPE in (@ODBC_VARCHAR, @ODBC_NVARCHAR) then @ODS_VARCHAR
else null
end
from master.dbo.spt_datatype_info spt_dt
where spt_dt.DATA_TYPE = #tmp_columns.DATA_TYPE
AND (spt_dt.ODBCVer is null or spt_dt.ODBCVer = @ODBCVer)
and isnull(spt_dt.AUTO_INCREMENT,0) = 0
and not spt_dt.TYPE_NAME = 'smalldatetime'
select
TABLE_CAT, TABLE_SCHEM, TABLE_NAME,
COLUMN_NAME, DATA_TYPE, TYPE_NAME,
COLUMN_SIZE, BUFFER_LENGTH, DECIMAL_DIGITS,
NUM_PREC_RADIX, NULLABLE, REMARKS,
COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE,
SS_DATA_TYPE
from #tmp_columns
order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
drop table #tmp_columns
go
grant execute on sp_columns_ex to public
go
if object_id('sp_table_privileges_ex', 'P') is not null
drop proc sp_table_privileges_ex
go
raiserror(15339,-1,-1,'sp_table_privileges_ex')
go
create procedure sp_table_privileges_ex(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null)
as
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
GRANTOR = GRANTOR,
GRANTEE = GRANTEE,
PRIVILEGE = PRIVILEGE_TYPE,
IS_GRANTABLE =
case IS_GRANTABLE
when 1 then 'YES'
when 0 then 'NO'
else null
end
from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
@table_server,
@table_catalog,
NULL,
NULL >
where (TABLE_SCHEMA like @table_schema
or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%'))
and (TABLE_NAME like @table_name
or @table_name is NULL)
order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, PRIVILEGE
go
grant execute on sp_table_privileges_ex to public
go
if object_id('sp_column_privileges_ex', 'P') is not null
drop proc sp_column_privileges_ex
go
raiserror(15339,-1,-1,'sp_column_privileges_ex')
go
create procedure sp_column_privileges_ex(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null,
@column_name sysname = null)
as
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
COLUMN_NAME = COLUMN_NAME,
GRANTOR = GRANTOR,
GRANTEE = GRANTEE,
PRIVILEGE = PRIVILEGE_TYPE,
IS_GRANTABLE =
case IS_GRANTABLE
when 1 then 'YES'
when 0 then 'NO'
else null
end
from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
@table_server,
@table_catalog,
@table_schema,
@table_name,
NULL >
where (COLUMN_NAME like @column_name
or @column_name is NULL)
order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, PRIVILEGE
go
grant execute on sp_column_privileges_ex to public
go
if object_id('sp_indexes', 'P') is not null
drop proc sp_indexes
go
raiserror(15339,-1,-1,'sp_indexes')
go
create procedure sp_indexes(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null,
@index_name sysname = null,
@is_unique bit = null)
as
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
NON_UNIQUE = convert(smallint, 1 - [UNIQUE]),
INDEX_QUALIFIER = TABLE_NAME,
INDEX_NAME = INDEX_NAME,
TYPE =
case [CLUSTERED]
when 1 then 1
else 3
end,
ORDINAL_POSITION = ORDINAL_POSITION,
COLUMN_NAME = COLUMN_NAME,
ASC_OR_DESC =
case [COLLATION]
when 1 then 'A'
when 2 then 'D'
else null
end,
CARDINALITY = CARDINALITY,
PAGES =
case [CLUSTERED]
when 1 then PAGES
else NULL
end,
FILTER_CONDITION = FILTER_CONDITION
from master.dbo.SYSREMOTE_INDEXES <
@table_server,
@table_catalog,
@table_schema,
@index_name,
NULL, /* TYPE (index type) */
@table_name >
where @is_unique is null or @is_unique = [UNIQUE]
order by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME, ORDINAL_POSITION
go
grant execute on sp_indexes to public
go
if object_id('sp_foreignkeys', 'P') is not null
drop proc sp_foreignkeys
go
raiserror(15339,-1,-1,'sp_foreignkeys')
go
create procedure sp_foreignkeys(
@table_server sysname,
@pktab_name sysname = null,
@pktab_schema sysname = null,
@pktab_catalog sysname = null,
@fktab_name sysname = null,
@fktab_schema sysname = null,
@fktab_catalog sysname = null)
as
select
PKTABLE_CAT = PK_TABLE_CATALOG,
PKTABLE_SCHEM = PK_TABLE_SCHEMA,
PKTABLE_NAME = PK_TABLE_NAME,
PKCOLUMN_NAME = PK_COLUMN_NAME,
FKTABLE_CAT = FK_TABLE_CATALOG,
FKTABLE_SCHEM = FK_TABLE_SCHEMA,
FKTABLE_NAME = FK_TABLE_NAME,
FKCOLUMN_NAME = FK_COLUMN_NAME,
KEY_SEQ = ORDINAL,
UPDATE_RULE =
case UPDATE_RULE
when 'CASCADE' then 0
when 'NO ACTION' then 1
when 'SET NULL' then 2
else null
end,
DELETE_RULE =
case DELETE_RULE
when 'CASCADE' then 0
when 'NO ACTION' then 1
when 'SET NULL' then 2
else null
end,
FK_NAME = convert(sysname, NULL),
PK_NAME = convert(sysname, NULL),
DEFERRABILITY = convert(smallint, null)
from master.dbo.SYSREMOTE_FOREIGN_KEYS <
@table_server,
@pktab_catalog,
@pktab_schema,
@pktab_name,
@fktab_catalog,
@fktab_schema,
@fktab_name >
order by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, KEY_SEQ
go
grant execute on sp_foreignkeys to public
go
if object_id('sp_primarykeys', 'P') is not null
drop proc sp_primarykeys
go
raiserror(15339,-1,-1,'sp_primarykeys')
go
create procedure sp_primarykeys(
@table_server sysname,
@table_name sysname = null,
@table_schema sysname = null,
@table_catalog sysname = null)
as
select
TABLE_CAT = TABLE_CATALOG,
TABLE_SCHEM = TABLE_SCHEMA,
TABLE_NAME = TABLE_NAME,
COLUMN_NAME = COLUMN_NAME,
KEY_SEQ = ORDINAL,
PK_NAME = convert(sysname, NULL)
from master.dbo.SYSREMOTE_PRIMARY_KEYS <
@table_server,
@table_catalog,
@table_schema,
@table_name >
order by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, KEY_SEQ
go
grant execute on sp_primarykeys to public
go
/*-------------- END CATALOG STORED PROCEDURES FOR OLEDB SOURCES ------------------*/
dump tran master with no_log
go
if (charindex('6.50', @@version) = 0 and
charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.50 SQL Server.'
print 'Ignore the following errors.'
end
print 'creating sp_ddopen'
go
/* Procedure for pre-6.50 server */
create procedure sp_ddopen(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 varchar(255) = null,
@p2 varchar(255) = null,
@p3 varchar(255) = null,
@p4 varchar(255) = null,
@p5 varchar(255) = null,
@p6 varchar(255) = null,
@p7 int = null,
@ODBCVer int = 2)
as
set nocount on
declare @ret int
if @procname = 'sp_column_privileges'
begin
create table #spcolpriv (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) not null,
COLUMN_NAME varchar(32) not null,
GRANTOR varchar(32) null,
GRANTEE varchar(32) not null,
PRIVILEGE varchar(32) not null,
IS_GRANTABLE varchar(3) null
)
insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
exec @ret = sp_cursoropen @handle output,
'select * from #spcolpriv',
@scrollopt output, @ccopt output, @rows output
drop table #spcolpriv
end
else if @procname = 'sp_columns'
begin
create table #spcolumns (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) not null,
COLUMN_NAME varchar(32) not null,
DATA_TYPE smallint not null,
TYPE_NAME varchar(32) not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) null,
COLUMN_DEF varchar(255) null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) null,
SS_DATA_TYPE tinyint null
)
insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spcolumns',
@scrollopt output, @ccopt output, @rows output
drop table #spcolumns
end
else if @procname = 'sp_datatype_info'
begin
create table #spdatatypeinfo (
TYPE_NAME varchar(32) not null,
DATA_TYPE smallint not null,
"PRECISION" int null,
LITERAL_PREFIX varchar(32) null,
LITERAL_SUFFIX varchar(32) null,
CREATE_PARAMS varchar(32) null,
NULLABLE smallint not null,
CASE_SENSITIVE smallint not null,
SEARCHABLE smallint not null,
UNSIGNED_ATTRIBUTE smallint null,
MONEY smallint not null,
AUTO_INCREMENT smallint null,
LOCAL_TYPE_NAME varchar(32) null,
MINIMUM_SCALE smallint null,
MAXIMUM_SCALE smallint null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
NUM_PREC_RADIX int null,
INTERVAL_PRECISION smallint NULL,
USERTYPE smallint not null)
insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spdatatypeinfo',
@scrollopt output, @ccopt output, @rows output
drop table #spdatatypeinfo
end
else if @procname = 'sp_fkeys'
begin
create table #spfkeys (
PKTABLE_QUALIFIER varchar(32) null,
PKTABLE_OWNER varchar(32) null,
PKTABLE_NAME varchar(32) not null,
PKCOLUMN_NAME varchar(32) not null,
FKTABLE_QUALIFIER varchar(32) null,
FKTABLE_OWNER varchar(32) null,
FKTABLE_NAME varchar(32) not null,
FKCOLUMN_NAME varchar(32) not null,
KEY_SEQ smallint not null,
UPDATE_RULE smallint null,
DELETE_RULE smallint null,
FK_NAME varchar(32) null,
PK_NAME varchar(32) null,
DEFERRABILITY smallint null
)
insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spfkeys',
@scrollopt output, @ccopt output, @rows output
drop table #spfkeys
end
else if @procname = 'sp_pkeys'
begin
create table #sppkeys (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) not null,
COLUMN_NAME varchar(32) not null,
KEY_SEQ smallint not null,
PK_NAME varchar(32) null
)
insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sppkeys',
@scrollopt output, @ccopt output, @rows output
drop table #sppkeys
end
else if @procname = 'sp_special_columns'
begin
create table #spspeccol (
SCOPE smallint null,
COLUMN_NAME varchar(32) not null,
DATA_TYPE smallint not null,
TYPE_NAME varchar(32) not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
PSEUDO_COLUMN smallint null
)
insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spspeccol',
@scrollopt output, @ccopt output, @rows output
drop table #spspeccol
end
else if @procname = 'sp_sproc_columns'
begin
create table #spproccol (
PROCEDURE_QUALIFIER varchar(32) null,
PROCEDURE_OWNER varchar(32) null,
PROCEDURE_NAME varchar(32) not null,
COLUMN_NAME varchar(32) not null,
COLUMN_TYPE smallint not null,
DATA_TYPE smallint not null,
TYPE_NAME varchar(32) not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) null,
COLUMN_DEF varchar(255) null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) null,
SS_DATA_TYPE tinyint null
)
insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spproccol',
@scrollopt output, @ccopt output, @rows output
drop table #spproccol
end
else if @procname = 'sp_statistics'
begin
create table #spstatistics (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) not null,
NON_UNIQUE smallint null,
INDEX_QUALIFIER varchar(32) null,
INDEX_NAME varchar(32) null,
TYPE smallint not null,
SEQ_IN_INDEX smallint null,
COLUMN_NAME varchar(32) null,
COLLATION char(1) null,
CARDINALITY int null,
PAGES int null,
FILTER_CONDITION varchar(128) null
)
insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spstatistics',
@scrollopt output, @ccopt output, @rows output
drop table #spstatistics
end
else if @procname = 'sp_stored_procedures'
begin
create table #spprocedures (
PROCEDURE_QUALIFIER varchar(32) null,
PROCEDURE_OWNER varchar(32) null,
PROCEDURE_NAME varchar(32) not null,
NUM_INPUT_PARAMS int null,
NUM_OUTPUT_PARAMS int null,
NUM_RESULT_SETS int null,
REMARKS varchar(254) null,
PROCEDURE_TYPE smallint null
)
insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #spprocedures',
@scrollopt output, @ccopt output, @rows output
drop table #spprocedures
end
else if @procname = 'sp_table_privileges'
begin
create table #sptabpriv (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) not null,
GRANTOR varchar(32) null,
GRANTEE varchar(32) not null,
PRIVILEGE varchar(32) not null,
IS_GRANTABLE varchar(3) null
)
insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sptabpriv',
@scrollopt output, @ccopt output, @rows output
drop table #sptabpriv
end
else if @procname = 'sp_tables'
begin
create table #sptables (
TABLE_QUALIFIER varchar(32) null,
TABLE_OWNER varchar(32) null,
TABLE_NAME varchar(32) null,
TABLE_TYPE varchar(32) null,
REMARKS varchar(254) null)
insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
exec @ret = sp_cursoropen @handle output,
'select * from #sptables',
@scrollopt output, @ccopt output, @rows output
drop table #sptables
end
else
print 'Unknown sp_ddopen procedure'
select @ret = isnull(@ret,0)
return isnull(@ret,0)
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_ddopen
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 server */
create procedure sp_ddopen; 1(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774) = null,
@p2 nvarchar(774) = null,
@p3 nvarchar(774) = null,
@p4 nvarchar(774) = null,
@p5 nvarchar(774) = null,
@p6 nvarchar(774) = null,
@p7 int = null,
@ODBCVer int = 2)
as
set nocount on
declare @ret int
if @procname = 'sp_column_privileges'
begin
exec @ret = sp_ddopen;2 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4
end
else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'
begin
exec @ret = sp_ddopen;3 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@ODBCVer
end
else if @procname = 'sp_datatype_info'
begin
exec @ret = sp_ddopen;4 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p7,
@ODBCVer
end
else if @procname = 'sp_fkeys'
begin
exec @ret = sp_ddopen;5 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6
end
else if @procname = 'sp_pkeys'
begin
exec @ret = sp_ddopen;6 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_special_columns'
begin
exec @ret = sp_ddopen;7 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6,
@ODBCVer
end
else if @procname = 'sp_sproc_columns'
begin
exec @ret = sp_ddopen;8 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@ODBCVer
end
else if @procname = 'sp_statistics'
begin
exec @ret = sp_ddopen;9 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6
end
else if @procname = 'sp_stored_procedures'
begin
exec @ret = sp_ddopen;10 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_table_privileges'
begin
exec @ret = sp_ddopen;11 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'
begin
exec @ret = sp_ddopen;12 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5
end
else if @procname = 'sp_tableswc'
begin
exec @ret = sp_ddopen;13 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4
end
else
print 'Unknown sp_ddopen procedure'
select @ret = isnull(@ret,0)
return isnull(@ret,0)
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 2(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774))
as
set nocount on
declare @ret int
create table #spcolpriv (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname not null,
COLUMN_NAME sysname not null,
GRANTOR sysname null,
GRANTEE sysname not null,
PRIVILEGE varchar(32) not null,
IS_GRANTABLE varchar(3) null
)
insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
exec @ret = sp_cursoropen @handle output,
'select * from #spcolpriv',
@scrollopt output, @ccopt output, @rows output
drop table #spcolpriv
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 3(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spcolumns (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname not null,
COLUMN_NAME sysname not null,
DATA_TYPE smallint not null,
TYPE_NAME sysname not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) null,
COLUMN_DEF nvarchar(3000) null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) null,
SS_DATA_TYPE tinyint null
)
if @procname = 'sp_columns'
begin
insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
end
else
begin
insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer
end
exec @ret = sp_cursoropen @handle output,
'select * from #spcolumns',
@scrollopt output, @ccopt output, @rows output
drop table #spcolumns
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 4(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p7 int,
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spdatatypeinfo (
TYPE_NAME sysname not null,
DATA_TYPE smallint not null,
"PRECISION" int null,
LITERAL_PREFIX varchar(32) null,
LITERAL_SUFFIX varchar(32) null,
CREATE_PARAMS varchar(32) null,
NULLABLE smallint not null,
CASE_SENSITIVE smallint not null,
SEARCHABLE smallint not null,
UNSIGNED_ATTRIBUTE smallint null,
MONEY smallint not null,
AUTO_INCREMENT smallint null,
LOCAL_TYPE_NAME sysname null,
MINIMUM_SCALE smallint null,
MAXIMUM_SCALE smallint null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
NUM_PREC_RADIX int null,
INTERVAL_PRECISION smallint NULL,
USERTYPE smallint not null)
insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spdatatypeinfo',
@scrollopt output, @ccopt output, @rows output
drop table #spdatatypeinfo
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 5(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774))
as
set nocount on
declare @ret int
create table #spfkeys (
PKTABLE_QUALIFIER sysname null,
PKTABLE_OWNER sysname null,
PKTABLE_NAME sysname not null,
PKCOLUMN_NAME sysname not null,
FKTABLE_QUALIFIER sysname null,
FKTABLE_OWNER sysname null,
FKTABLE_NAME sysname not null,
FKCOLUMN_NAME sysname not null,
KEY_SEQ smallint not null,
UPDATE_RULE smallint null,
DELETE_RULE smallint null,
FK_NAME sysname null,
PK_NAME sysname null,
DEFERRABILITY smallint null
)
insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spfkeys',
@scrollopt output, @ccopt output, @rows output
drop table #spfkeys
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 6(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #sppkeys (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname not null,
COLUMN_NAME sysname not null,
KEY_SEQ smallint not null,
PK_NAME sysname null
)
insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sppkeys',
@scrollopt output, @ccopt output, @rows output
drop table #sppkeys
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 7(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spspeccol (
SCOPE smallint null,
COLUMN_NAME sysname not null,
DATA_TYPE smallint not null,
TYPE_NAME sysname not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
PSEUDO_COLUMN smallint null
)
insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spspeccol',
@scrollopt output, @ccopt output, @rows output
drop table #spspeccol
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 8(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spproccol (
PROCEDURE_QUALIFIER sysname null,
PROCEDURE_OWNER sysname null,
PROCEDURE_NAME sysname not null,
COLUMN_NAME sysname not null,
COLUMN_TYPE smallint not null,
DATA_TYPE smallint not null,
TYPE_NAME sysname not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) null,
COLUMN_DEF nvarchar(3000) null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) null,
SS_DATA_TYPE tinyint null
)
insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spproccol',
@scrollopt output, @ccopt output, @rows output
drop table #spproccol
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 9(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774))
as
set nocount on
declare @ret int
create table #spstatistics (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname not null,
NON_UNIQUE smallint null,
INDEX_QUALIFIER sysname null,
INDEX_NAME sysname null,
TYPE smallint not null,
SEQ_IN_INDEX smallint null,
COLUMN_NAME sysname null,
COLLATION char(1) null,
CARDINALITY int null,
PAGES int null,
FILTER_CONDITION varchar(128) null
)
insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spstatistics',
@scrollopt output, @ccopt output, @rows output
drop table #spstatistics
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 10(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #spprocedures (
PROCEDURE_QUALIFIER sysname null,
PROCEDURE_OWNER sysname null,
PROCEDURE_NAME nvarchar(134) not null, /*134=sysname+';'+ltrim(str(c.number,5))*/
NUM_INPUT_PARAMS int null,
NUM_OUTPUT_PARAMS int null,
NUM_RESULT_SETS int null,
REMARKS varchar(254) null,
PROCEDURE_TYPE smallint null
)
insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #spprocedures',
@scrollopt output, @ccopt output, @rows output
drop table #spprocedures
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 11(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #sptabpriv (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname not null,
GRANTOR sysname null,
GRANTEE sysname not null,
PRIVILEGE varchar(32) not null,
IS_GRANTABLE varchar(3) null
)
insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sptabpriv',
@scrollopt output, @ccopt output, @rows output
drop table #sptabpriv
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 12(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774))
as
set nocount on
declare @ret int
create table #sptables (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname null,
TABLE_TYPE varchar(32) null,
REMARKS varchar(254) null)
if @procname = 'sp_tables'
begin
insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
end
else
begin
insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5
end
exec @ret = sp_cursoropen @handle output,
'select * from #sptables',
@scrollopt output, @ccopt output, @rows output
drop table #sptables
return @ret
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 13(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774), -- @table_name
@p2 nvarchar(774), -- @table_owner
@p3 nvarchar(774), -- @table_qualifier
@p4 nvarchar(774)) -- @table_type
as
-- this code was copied from sp_tableswc (for 7,0). Any changes
-- made here need to be evaluated for porting to sp_tableswc.
set nocount on
declare @ret int
declare @databasename sysname
declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */
create table #sptables (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname null,
TABLE_TYPE varchar(32) null,
REMARKS varchar(254) null)
declare databases CURSOR FOR
select name from master..sysdatabases
where name like @p3 and name <> 'model' and has_dbaccess(name)=1
for read only
open databases
fetch next from databases into @databasename
while (@@FETCH_STATUS <> -1)
begin
if (charindex('%', @databasename) = 0)
begin /* skip dbnames w/wildcard characters to prevent loop */
select @qualprocname = @databasename + '..sp_tables'
insert into #sptables exec @qualprocname
@p1, @p2, @databasename, @p3
end
fetch next from databases into @databasename
end
deallocate databases
exec @ret = sp_cursoropen @handle output,
'select * from #sptables',
@scrollopt output, @ccopt output, @rows output
drop table #sptables
return @ret
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_ddopen
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_ddopen; 1(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774) = null,
@p2 nvarchar(774) = null,
@p3 nvarchar(774) = null,
@p4 nvarchar(774) = null,
@p5 nvarchar(774) = null,
@p6 nvarchar(774) = null,
@p7 int = null,
@ODBCVer int = 2)
as
set nocount on
declare @ret int
if @procname = 'sp_column_privileges'
begin
exec @ret = sp_ddopen;2 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4
end
else if @procname = 'sp_columns' or @procname = 'sp_columns_ex'
begin
exec @ret = sp_ddopen;3 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@ODBCVer
end
else if @procname = 'sp_datatype_info'
begin
exec @ret = sp_ddopen;4 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p7,
@ODBCVer
end
else if @procname = 'sp_fkeys'
begin
exec @ret = sp_ddopen;5 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6
end
else if @procname = 'sp_pkeys'
begin
exec @ret = sp_ddopen;6 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_special_columns'
begin
exec @ret = sp_ddopen;7 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6,
@ODBCVer
end
else if @procname = 'sp_sproc_columns'
begin
exec @ret = sp_ddopen;8 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@ODBCVer
end
else if @procname = 'sp_statistics'
begin
exec @ret = sp_ddopen;9 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5,
@p6
end
else if @procname = 'sp_stored_procedures'
begin
exec @ret = sp_ddopen;10 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_table_privileges'
begin
exec @ret = sp_ddopen;11 @handle output,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3
end
else if @procname = 'sp_tables' or @procname = 'sp_tables_ex'
begin
exec @ret = sp_ddopen;12 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4,
@p5
end
else if @procname = 'sp_tableswc'
begin
exec @ret = sp_ddopen;13 @handle output,
@procname,
@scrollopt output,
@ccopt output,
@rows output,
@p1,
@p2,
@p3,
@p4
end
else
print 'Unknown sp_ddopen procedure'
select @ret = isnull(@ret,0)
return isnull(@ret,0)
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 2(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774))
as
set nocount on
declare @ret int
create table #spcolpriv (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default not null,
COLUMN_NAME sysname collate database_default not null,
GRANTOR sysname collate database_default null,
GRANTEE sysname collate database_default not null,
PRIVILEGE varchar(32) collate database_default not null,
IS_GRANTABLE varchar(3) collate database_default null
)
insert into #spcolpriv exec sp_column_privileges @p1,@p2,@p3,@p4
exec @ret = sp_cursoropen @handle output,
'select * from #spcolpriv',
@scrollopt output, @ccopt output, @rows output
drop table #spcolpriv
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 3(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spcolumns (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default not null,
COLUMN_NAME sysname collate database_default not null,
DATA_TYPE smallint not null,
TYPE_NAME sysname collate database_default not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) collate database_default null,
COLUMN_DEF nvarchar(3000) collate database_default null,
SQL_DATA_TYPE smallint null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) collate database_default null,
SS_DATA_TYPE tinyint null
)
if @procname = 'sp_columns'
begin
insert into #spcolumns exec sp_columns @p1,@p2,@p3,@p4,@ODBCVer
end
else
begin
insert into #spcolumns exec sp_columns_ex @p1,@p2,@p3,@p4,@p5,@ODBCVer
end
exec @ret = sp_cursoropen @handle output,
'select * from #spcolumns',
@scrollopt output, @ccopt output, @rows output
drop table #spcolumns
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 4(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p7 int,
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spdatatypeinfo (
TYPE_NAME sysname collate database_default not null,
DATA_TYPE smallint not null,
"PRECISION" int null,
LITERAL_PREFIX varchar(32) collate database_default null,
LITERAL_SUFFIX varchar(32) collate database_default null,
CREATE_PARAMS varchar(32) collate database_default null,
NULLABLE smallint not null,
CASE_SENSITIVE smallint not null,
SEARCHABLE smallint not null,
UNSIGNED_ATTRIBUTE smallint null,
MONEY smallint not null,
AUTO_INCREMENT smallint null,
LOCAL_TYPE_NAME sysname collate database_default null,
MINIMUM_SCALE smallint null,
MAXIMUM_SCALE smallint null,
SQL_DATA_TYPE smallint not null,
SQL_DATETIME_SUB smallint null,
NUM_PREC_RADIX int null,
INTERVAL_PRECISION smallint NULL,
USERTYPE smallint not null)
insert into #spdatatypeinfo exec sp_datatype_info @p7,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spdatatypeinfo',
@scrollopt output, @ccopt output, @rows output
drop table #spdatatypeinfo
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 5(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774))
as
set nocount on
declare @ret int
create table #spfkeys (
PKTABLE_QUALIFIER sysname collate database_default null,
PKTABLE_OWNER sysname collate database_default null,
PKTABLE_NAME sysname collate database_default not null,
PKCOLUMN_NAME sysname collate database_default not null,
FKTABLE_QUALIFIER sysname collate database_default null,
FKTABLE_OWNER sysname collate database_default null,
FKTABLE_NAME sysname collate database_default not null,
FKCOLUMN_NAME sysname collate database_default not null,
KEY_SEQ smallint not null,
UPDATE_RULE smallint null,
DELETE_RULE smallint null,
FK_NAME sysname collate database_default null,
PK_NAME sysname collate database_default null,
DEFERRABILITY smallint null
)
insert into #spfkeys exec sp_fkeys @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spfkeys',
@scrollopt output, @ccopt output, @rows output
drop table #spfkeys
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 6(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #sppkeys (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default not null,
COLUMN_NAME sysname collate database_default not null,
KEY_SEQ smallint not null,
PK_NAME sysname collate database_default null
)
insert into #sppkeys exec sp_pkeys @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sppkeys',
@scrollopt output, @ccopt output, @rows output
drop table #sppkeys
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 7(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spspeccol (
SCOPE smallint null,
COLUMN_NAME sysname collate database_default not null,
DATA_TYPE smallint not null,
TYPE_NAME sysname collate database_default not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
PSEUDO_COLUMN smallint null
)
insert into #spspeccol exec sp_special_columns @p1,@p2,@p3,@p4,@p5,@p6,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spspeccol',
@scrollopt output, @ccopt output, @rows output
drop table #spspeccol
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 8(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@ODBCVer int)
as
set nocount on
declare @ret int
create table #spproccol (
PROCEDURE_QUALIFIER sysname collate database_default null,
PROCEDURE_OWNER sysname collate database_default null,
PROCEDURE_NAME sysname collate database_default not null,
COLUMN_NAME sysname collate database_default not null,
COLUMN_TYPE smallint not null,
DATA_TYPE smallint null,
TYPE_NAME sysname collate database_default not null,
"PRECISION" int null,
LENGTH int null,
SCALE smallint null,
RADIX smallint null,
NULLABLE smallint not null,
REMARKS varchar(254) collate database_default null,
COLUMN_DEF nvarchar(3000) collate database_default null,
SQL_DATA_TYPE smallint null,
SQL_DATETIME_SUB smallint null,
CHAR_OCTET_LENGTH int null,
ORDINAL_POSITION int not null,
IS_NULLABLE varchar(254) collate database_default null,
SS_DATA_TYPE tinyint null
)
insert into #spproccol exec sp_sproc_columns @p1,@p2,@p3,@p4,@ODBCVer
exec @ret = sp_cursoropen @handle output,
'select * from #spproccol',
@scrollopt output, @ccopt output, @rows output
drop table #spproccol
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 9(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774),
@p6 nvarchar(774))
as
set nocount on
declare @ret int
create table #spstatistics (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default not null,
NON_UNIQUE smallint null,
INDEX_QUALIFIER sysname collate database_default null,
INDEX_NAME sysname collate database_default null,
TYPE smallint not null,
SEQ_IN_INDEX smallint null,
COLUMN_NAME sysname collate database_default null,
COLLATION char(1) collate database_default null,
CARDINALITY int null,
PAGES int null,
FILTER_CONDITION varchar(128) collate database_default null
)
insert into #spstatistics exec sp_statistics @p1,@p2,@p3,@p4,@p5,@p6
exec @ret = sp_cursoropen @handle output,
'select * from #spstatistics',
@scrollopt output, @ccopt output, @rows output
drop table #spstatistics
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 10(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #spprocedures (
PROCEDURE_QUALIFIER sysname collate database_default null,
PROCEDURE_OWNER sysname collate database_default null,
PROCEDURE_NAME nvarchar(134) collate database_default not null, /*134=sysname+';'+ltrim(str(c.number,5))*/
NUM_INPUT_PARAMS int null,
NUM_OUTPUT_PARAMS int null,
NUM_RESULT_SETS int null,
REMARKS varchar(254) collate database_default null,
PROCEDURE_TYPE smallint null
)
insert into #spprocedures exec sp_stored_procedures @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #spprocedures',
@scrollopt output, @ccopt output, @rows output
drop table #spprocedures
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 11(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774))
as
set nocount on
declare @ret int
create table #sptabpriv (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default not null,
GRANTOR sysname collate database_default null,
GRANTEE sysname collate database_default not null,
PRIVILEGE varchar(32) collate database_default not null,
IS_GRANTABLE varchar(3) collate database_default null
)
insert into #sptabpriv exec sp_table_privileges @p1,@p2,@p3
exec @ret = sp_cursoropen @handle output,
'select * from #sptabpriv',
@scrollopt output, @ccopt output, @rows output
drop table #sptabpriv
return @ret
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
create procedure sp_ddopen; 12(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774),
@p2 nvarchar(774),
@p3 nvarchar(774),
@p4 nvarchar(774),
@p5 nvarchar(774))
as
set nocount on
declare @ret int
create table #sptables (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default null,
TABLE_TYPE varchar(32) collate database_default null,
REMARKS varchar(254) collate database_default null)
if @procname = 'sp_tables'
begin
insert into #sptables exec sp_tables @p1,@p2,@p3,@p4
end
else
begin
insert into #sptables exec sp_tables_ex @p1,@p2,@p3,@p4,@p5
end
exec @ret = sp_cursoropen @handle output,
'select * from #sptables',
@scrollopt output, @ccopt output, @rows output
drop table #sptables
return @ret
go
create procedure sp_ddopen; 13(
@handle int output,
@procname sysname,
@scrollopt int output,
@ccopt int output,
@rows int output,
@p1 nvarchar(774), -- @table_name
@p2 nvarchar(774), -- @table_owner
@p3 nvarchar(774), -- @table_qualifier
@p4 nvarchar(774)) -- @table_type
as
-- this code was copied from sp_tableswc (for 8.0). Any changes
-- made here need to be evaluated for porting to sp_tableswc.
set nocount on
declare @ret int
declare @databasename sysname
declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */
create table #sptables (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default null,
TABLE_TYPE varchar(32) collate database_default null,
REMARKS varchar(254) collate database_default null)
declare databases CURSOR FOR
select name from master..sysdatabases
where name like @p3 and name <> 'model' and has_dbaccess(name)=1
for read only
open databases
fetch next from databases into @databasename
while (@@FETCH_STATUS <> -1)
begin
if (charindex('%', @databasename) = 0)
begin /* skip dbnames w/wildcard characters to prevent loop */
select @qualprocname = @databasename + '..sp_tables'
insert into #sptables exec @qualprocname
@p1, @p2, @databasename, @p4
end
fetch next from databases into @databasename
end
deallocate databases
exec @ret = sp_cursoropen @handle output,
'select * from #sptables',
@scrollopt output, @ccopt output, @rows output
drop table #sptables
return @ret
go
grant execute on sp_ddopen to public
go
print 'creating sp_tableswc'
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 server */
create procedure sp_tableswc(
@table_name nvarchar(384) = null,
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@table_type varchar(100) = null)
as
-- sp_ddopen; 13 contains the same code, so changes made here should
-- be evaluated for porting to sp_ddopen; 13
declare @databasename sysname
declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */
create table #sptables (
TABLE_QUALIFIER sysname null,
TABLE_OWNER sysname null,
TABLE_NAME sysname null,
TABLE_TYPE varchar(32) null,
REMARKS varchar(254) null)
declare databases CURSOR FOR
select name from master..sysdatabases
where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1
for read only
open databases
fetch next from databases into @databasename
while (@@FETCH_STATUS <> -1)
begin
if (charindex('%', @databasename) = 0)
begin /* skip dbnames w/wildcard characters to prevent loop */
select @qualprocname = @databasename + '..sp_tables'
insert into #sptables exec @qualprocname
@table_name, @table_owner, @databasename, @table_type
end
fetch next from databases into @databasename
end
deallocate databases
select * from #sptables
order by 4, 1, 2, 3
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop procedure sp_tableswc
go
create procedure sp_tableswc(
@table_name nvarchar(384) = null,
@table_owner nvarchar(384) = null,
@table_qualifier sysname = null,
@table_type varchar(100) = null)
as
declare @databasename sysname
declare @qualprocname nvarchar(141) /* 128 + '..sp_tables' */
create table #sptables (
TABLE_QUALIFIER sysname collate database_default null,
TABLE_OWNER sysname collate database_default null,
TABLE_NAME sysname collate database_default null,
TABLE_TYPE varchar(32) collate database_default null,
REMARKS varchar(254) collate database_default null)
declare databases CURSOR FOR
select name from master..sysdatabases
where name like @table_qualifier and name <> 'model' and has_dbaccess(name)=1
for read only
open databases
fetch next from databases into @databasename
while (@@FETCH_STATUS <> -1)
begin
if (charindex('%', @databasename) = 0)
begin /* skip dbnames w/wildcard characters to prevent loop */
select @qualprocname = @databasename + '..sp_tables'
insert into #sptables exec @qualprocname
@table_name, @table_owner, @databasename, @table_type
end
fetch next from databases into @databasename
end
deallocate databases
select * from #sptables
order by 4, 1, 2, 3
go
grant execute on sp_tableswc to public
go
dump tran master with no_log
go
/*-------------------------------------------------------------------------*/
/*-------------- CATALOG STORED PROCEDURES FOR SQLOLEDB ------------------*/
/*-------------------------------------------------------------------------*/
print ''
print 'creating spt_provider_types'
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Pre 8.0 Server */
create table spt_provider_types
(
ss_dtype tinyint not null,
fixlen int null, /* datatype len for variable, else null */
type_name sysname not null,
oledb_data_type smallint not null,
best_match bit not null,
is_nullable tinyint null,
case_sensitive bit not null,
fixed_prec_scale bit not null,
is_long bit not null,
auto_unique_value tinyint not null,
data_precision int null,
numeric_scale smallint null, /* min scale if 6.0 */
column_size int null,
literal_prefix varchar(32) null,
literal_suffix varchar(32) null,
searchable int not null,
unsigned_attribute tinyint null,
local_type_name sysname null
)
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* 8.0 Server */
create table spt_provider_types
(
ss_dtype tinyint not null,
fixlen int null, /* datatype len for variable, else null */
type_name sysname not null,
oledb_data_type smallint not null,
best_match bit not null,
is_nullable bit null,
case_sensitive bit not null,
fixed_prec_scale bit not null,
is_long bit not null,
auto_unique_value tinyint not null,
data_precision int null,
numeric_scale smallint null, /* min scale if 6.0 */
column_size int null,
literal_prefix nvarchar(32) null,
literal_suffix nvarchar(32) null,
searchable int not null,
unsigned_attribute tinyint null,
local_type_name sysname null
)
end
go
grant select on spt_provider_types to public
go
dump tran master with no_log
go
/*
** Insert the spt_provider_types rows for DBTYTPE_STR data types
*/
begin tran
/* Get case sensitivity */
declare @case_sensitive bit
select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
/* Local Char */
insert into spt_provider_types values
(
47 /*SQLCHARACTER*/, /* ss_dtype */
0, /* fixlen */
'char', /* type_name */
129 /*DBTYPE_STR*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
@case_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'char' /* local_type_name */
)
/* Local Varchar */
insert into spt_provider_types values
(
39 /*SQLVARCHAR*/, /* ss_dtype */
null, /* fixlen */
'varchar', /* type_name */
129 /*DBTYPE_STR*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
@case_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'varchar' /* local_type_name */
)
/* Local Text */
insert into spt_provider_types values
(
35 /*SQLTEXT*/, /* ss_dtype */
null, /* fixlen */
'text', /* type_name */
129 /*DBTYPE_STR*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
@case_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
1, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
2147483647, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
2 /*DB_LIKE_ONLY*/, /* searchable */
null, /* unsigned_attribute */
'text' /* local_type_name */
)
commit tran
go
dump tran master with no_log
go
/*
** Insert the spt_provider_types rows for DBTYTPE_BYTES data types
*/
begin tran
/* Local Binary */
insert into spt_provider_types values
(
45 /*SQLBINARY*/, /* ss_dtype */
0, /* fixlen */
'binary', /* type_name */
128 /*DBTYPE_BYTES*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'0x', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'binary' /* local_type_name */
)
/* Local Varbinary */
insert into spt_provider_types values
(
37 /*SQLVARBINARY*/, /* ss_dtype */
null, /* fixlen */
'varbinary', /* type_name */
128 /*DBTYPE_BYTES*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'0x', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'varbinary' /* local_type_name */
)
/* Local Image */
insert into spt_provider_types values
(
34 /*SQLIMAGE*/, /* ss_dtype */
null, /* fixlen */
'image', /* type_name */
128 /*DBTYPE_BYTES*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
1, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
2147483647, /* column_size */
'0x', /* literal_prefix */
null, /* literal_suffix */
1 /*DB_UNSEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'image' /* local_type_name */
)
commit tran
go
dump tran master with no_log
go
/*
** Insert the spt_provider_types rows for DBTYPE_DBTIMESTAMP data types
*/
begin tran
/* Local Datetime */
insert into spt_provider_types values
(
61 /*SQLDATETIME*/, /* ss_dtype */
8, /* fixlen */
'datetime', /* type_name */
135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
23, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'datetime' /* local_type_name */
)
/* Local Smalldatetime */
insert into spt_provider_types values
(
58 /*SQLDATETIM4*/, /* ss_dtype */
4, /* fixlen */
'smalldatetime', /* type_name */
135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
16, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'smalldatetime' /* local_type_name */
)
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Add nullable type for non-Sphinx server */
/* Local Datetimn */
insert into spt_provider_types values
(
111 /*SQLDATETIMN*/, /* ss_dtype */
4, /* fixlen */
'smalldatetime', /* type_name */
135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
16, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'smalldatetime' /* local_type_name */
)
insert into spt_provider_types values
(
111 /*SQLDATETIMN*/, /* ss_dtype */
8, /* fixlen */
'datetime', /* type_name */
135 /*DBTYPE_DBTIMESTAMP*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
23, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'datetime' /* local_type_name */
)
end
commit tran
go
dump tran master with no_log
go
/*
** Insert the spt_provider_types rows for DBTYPE_CY data types
*/
begin tran
/* Local Smallmoney */
insert into spt_provider_types values
(
122 /*SQLMONEY4*/, /* ss_dtype */
4, /* fixlen */
'smallmoney', /* type_name */
6 /*DBTYPE_CY*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
10, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'$', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'smallmoney' /* local_type_name */
)
/* Local Money */
insert into spt_provider_types values
(
60 /*SQLMONEY*/, /* ss_dtype */
8, /* fixlen */
'money', /* type_name */
6 /*DBTYPE_CY*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
19, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'$', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'money' /* local_type_name */
)
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Add nullable type for non-Sphinx server */
/* Local Moneyn */
insert into spt_provider_types values
(
110 /*SQLMONEYN*/, /* ss_dtype */
4, /* fixlen */
'smallmoney', /* type_name */
6 /*DBTYPE_CY*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
10, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'$', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'smallmoney' /* local_type_name */
)
insert into spt_provider_types values
(
110 /*SQLMONEYN*/, /* ss_dtype */
8, /* fixlen */
'money', /* type_name */
6 /*DBTYPE_CY*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
19, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'$', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'money' /* local_type_name */
)
end
commit tran
go
dump tran master with no_log
go
/*
** Insert the spt_provider_types rows for the numeric data types
*/
begin tran
/* Local Float */
insert into spt_provider_types values
(
62 /*SQLFLT8*/, /* ss_dtype */
8, /* fixlen */
'float', /* type_name */
5 /*DBTYPE_R8*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
15, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'float' /* local_type_name */
)
/* Local Real */
insert into spt_provider_types values
(
59 /*SQLFLT4*/, /* ss_dtype */
4, /* fixlen */
'real', /* type_name */
4 /*DBTYPE_R4*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
7, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'real' /* local_type_name */
)
/* Local Int */
insert into spt_provider_types values
(
56 /*SQLINT4*/, /* ss_dtype */
4, /* fixlen */
'int', /* type_name */
3 /*DBTYPE_I4*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
10, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'int' /* local_type_name */
)
/* Local Smallint */
insert into spt_provider_types values
(
52 /*SQLINT2*/, /* ss_dtype */
2, /* fixlen */
'smallint', /* type_name */
2 /*DBTYPE_I2*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
5, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'smallint' /* local_type_name */
)
/* Local Tinyint */
insert into spt_provider_types values
(
48 /*SQLINT1*/, /* ss_dtype */
1, /* fixlen */
'tinyint', /* type_name */
17 /*DBTYPE_UI1*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
3, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
1, /* unsigned_attribute */
'tinyint' /* local_type_name */
)
commit tran
go
dump tran master with no_log
go
begin tran
if (charindex('6.00', @@version) > 0 or
charindex('6.50', @@version) > 0 or
charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin /* Add 6.0 data types */
/* Local Decimal */
insert into spt_provider_types values
(
55 /*SQLDECIMAL*/, /* ss_dtype */
0, /* fixlen */
'decimal', /* type_name */
131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
38, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'decimal' /* local_type_name */
)
/* Local Numeric */
insert into spt_provider_types values
(
63 /*SQLNUMERIC*/, /* ss_dtype */
0, /* fixlen */
'numeric', /* type_name */
131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
38, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'numeric' /* local_type_name */
)
end
commit tran
go
dump tran master with no_log
go
begin tran
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin /* Add nullable type for non-Sphinx server */
/* Local Floatn */
insert into spt_provider_types values
(
109 /*SQLFLTN*/, /* ss_dtype */
8, /* fixlen */
'float', /* type_name */
5 /*DBTYPE_R8*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
15, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'float' /* local_type_name */
)
insert into spt_provider_types values
(
109 /*SQLFLT4*/, /* ss_dtype */
4, /* fixlen */
'real', /* type_name */
4 /*DBTYPE_R4*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
7, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'real' /* local_type_name */
)
/* Local Intn */
insert into spt_provider_types values
(
38 /*SQLINTN*/, /* ss_dtype */
4, /* fixlen */
'int', /* type_name */
3 /*DBTYPE_I4*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
10, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'int' /* local_type_name */
)
insert into spt_provider_types values
(
38 /*SQLINTN*/, /* ss_dtype */
2, /* fixlen */
'smallint', /* type_name */
2 /*DBTYPE_I2*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
5, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'smallint' /* local_type_name */
)
insert into spt_provider_types values
(
38 /*SQLINTN*/, /* ss_dtype */
1, /* fixlen */
'tinyint', /* type_name */
17 /*DBTYPE_UI1*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
3, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
1, /* unsigned_attribute */
'tinyint' /* local_type_name */
)
if (charindex('6.00', @@version) > 0 or charindex('6.50', @@version) > 0)
begin /* Add 6.0 data types */
/* Local Decimaln */
insert into spt_provider_types values
(
106 /*SQLDECIMALN*/, /* ss_dtype */
0, /* fixlen */
'decimal', /* type_name */
131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
38, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'decimal' /* local_type_name */
)
/* Local Numericn */
insert into spt_provider_types values
(
108 /*SQLNUMERICN*/, /* ss_dtype */
0, /* fixlen */
'numeric', /* type_name */
131 /*DBTYPE_NUMERIC*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
38, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'numeric' /* local_type_name */
)
end
end
commit tran
go
dump tran master with no_log
go
/*
** Remaining data types
*/
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
begin tran
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
begin
/* Local Bit */
insert into spt_provider_types values
(
50 /*SQLBIT*/, /* ss_dtype */
0, /* fixlen */
'bit', /* type_name */
11 /*DBTYPE_BOOL*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
1, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'bit' /* local_type_name */
)
/* Local Timestamp */
insert into spt_provider_types values
(
0, /* ss_dtype */
8, /* fixlen */
'timestamp', /* type_name */
128 /*DBTYPE_BYTES*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'0x', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'timestamp' /* local_type_name */
)
/* Local GUID */
insert into spt_provider_types values
(
0, /* ss_dtype */
16, /* fixlen */
'uniqueidentifier', /* type_name */
72 /*DBTYPE_GUID*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'''', /* literal_prefix */
'''', /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'uniqueidentifier' /* local_type_name */
)
/* Get case sensitivity */
declare @ncase_sensitive bit
select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
/* Local NChar */
insert into spt_provider_types values
(
0, /* ss_dtype */
0, /* fixlen */
'nchar', /* type_name */
130 /*DBTYPE_WSTR*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
@ncase_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'N''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'nchar' /* local_type_name */
)
/* Local NVarChar */
insert into spt_provider_types values
(
0, /* ss_dtype */
null, /* fixlen */
'nvarchar', /* type_name */
130 /*DBTYPE_WSTR*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
@ncase_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'N''', /* literal_prefix */
'''', /* literal_suffix */
4 /*DB_SEARCHABLE*/, /* searchable */
null, /* unsigned_attribute */
'nvarchar' /* local_type_name */
)
/* Local NText */
insert into spt_provider_types values
(
0, /* ss_dtype */
null, /* fixlen */
'ntext', /* type_name */
130 /*DBTYPE_WSTR*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
@ncase_sensitive, /* case_sensitive */
0, /* fixed_prec_scale */
1, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
1073741823, /* column_size */
'N''', /* literal_prefix */
'''', /* literal_suffix */
2 /*DB_LIKE_ONLY*/, /* searchable */
null, /* unsigned_attribute */
'ntext' /* local_type_name */
)
if (charindex('8.00', @@version) > 0)
begin
/* Local BIGINT */
insert into spt_provider_types values
(
127, /* ss_dtype */
8, /* fixlen */
'bigint', /* type_name */
20 /*DBTYPE_I8*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
1, /* fixed_prec_scale */
0, /* is_long */
1, /* auto_unique_value */
19, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
0, /* unsigned_attribute */
'bigint' /* local_type_name */
)
/* sql_variant */
insert into spt_provider_types values
(
98, /* ss_dtype */
null, /* fixlen */
'sql_variant', /* type_name */
12 /*DBTYPE_VARIANT*/, /* oledb_data_type */
1, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
16, /* data_precision sizeof(VARIANT)*/
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 , /*DB_ALL_EXCEPT_LIKE*/
null, /* unsigned_attribute */
'sql_variant' /* local_type_name */
)
end
/* data types changed in Sphinx: DO AFTER ALL TYPES INSERTED! */
update spt_provider_types set ss_dtype =
(select xtype from systypes
where type_name = name OR type_name = name+' identity' OR type_name = name+'() identity')
end
commit tran
go
dump tran master with no_log
go
begin tran
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
/* Local Bit */
insert into spt_provider_types values
(
50 /*SQLBIT*/, /* ss_dtype */
0, /* fixlen */
'bit', /* type_name */
11 /*DBTYPE_BOOL*/, /* oledb_data_type */
1, /* best_match */
0, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
1, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
null, /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'bit' /* local_type_name */
)
/* Local Timestamp */
insert into spt_provider_types values
(
45 /*SQLBINARY*/, /* ss_dtype */
8, /* fixlen */
'timestamp', /* type_name */
128 /*DBTYPE_BYTES*/, /* oledb_data_type */
0, /* best_match */
null, /* is_nullable */
0, /* case_sensitive */
0, /* fixed_prec_scale */
0, /* is_long */
0, /* auto_unique_value */
null, /* data_precision */
null, /* numeric_scale */
null, /* column_size */
'0x', /* literal_prefix */
null, /* literal_suffix */
3 /*DB_ALL_EXCEPT_LIKE*/, /* searchable */
null, /* unsigned_attribute */
'timestamp' /* local_type_name */
)
end
commit tran
go
dump tran master with no_log
go
create unique clustered index datatypeinfoclust on spt_provider_types(ss_dtype,fixlen)
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'spt_provider_types' and type = 'U '))
begin
drop table spt_provider_types
dump tran master with no_log
end
end
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/*
** (2/11/98)
** The following SP is shared by instcat.sql and the server to add information
** related to server language collations. The server calls it at the end of
** collation change to update the catalog with the new language collations
** Everything in this SP should NOT use tempdb.
*/
create procedure sp_add_server_sortinfo
as
-- spt_server_info has unigue clustered index on attribute_id
delete spt_server_info where attribute_id in (16,18)
--insert into spt_server_info
-- select 18,'COLLATION_SEQ',
-- 'charset='+t2.name+' sort_order='+t1.name
-- +' charset_num='+rtrim(convert(char(4),t1.csid))+
-- ' sort_order_num='+rtrim(convert(char(4),t1.id))
-- from master.dbo.syscharsets t1, master.dbo.syscharsets t2, master.dbo.sysconfigures t3
-- where t1.csid=t2.id and t1.id=t3.value and t3.config in (123,1123)
declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)
declare @case_sensitive bit
declare @ncase_sensitive bit
select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
select @sortid = value from sysconfigures where config = 1123
select @csid = csid, @sortname = name from master.dbo.syscharsets where id = @sortid
select @attribute_value = 'charset='+ name +' sort_order=' + @sortname
+ ' charset_num=' + rtrim(convert(char(4),@csid))+
' sort_order_num=' + rtrim(convert(char(4),@sortid))
from syscharsets where id = @csid
insert into spt_server_info
values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))
if @case_sensitive = 1 /* If case sensitive server */
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','SENSITIVE')
end
else
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','MIXED')
end
update spt_datatype_info set CASE_SENSITIVE = @case_sensitive
where DATA_TYPE in (-1, 1, 12) /* CHAR types */
update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive
where DATA_TYPE in (-10, -9, -8) /* NCHAR types */
update spt_provider_types set case_sensitive = @case_sensitive
where oledb_data_type = 129 /*DBTYPE_STR*/
update spt_provider_types set case_sensitive = @ncase_sensitive
where oledb_data_type = 130 /*DBTYPE_WSTR*/
/* sp_add_server_sortinfo */
go
if (charindex('7.00', @@version) > 0)
begin
exec sp_add_server_sortinfo
end
go
-- 8.0 version of sp_add_server_sortinfo
--
create procedure sp_add_server_sortinfo75
as
-- spt_server_info has unigue clustered index on attribute_id
delete spt_server_info where attribute_id in (16, 18)
declare @sortid int, @csid int, @sortname varchar(255), @attribute_value varchar(255)
declare @case_sensitive bit
declare @ncase_sensitive bit
select @case_sensitive = case when 'a' <> 'A' then 1 else 0 end
select @ncase_sensitive = case when N'a' <> N'A' then 1 else 0 end
select @sortid = convert(int, ServerProperty('sqlsortorder'))
select @csid = convert(int, ServerProperty('sqlcharset'))
select @sortname = name from master.dbo.syscharsets where id = @sortid
if @sortid = 0 -- Non-SQL Collations
BEGIN
select @attribute_value = 'charset='
+ name
+ ' collation=' + isnull(convert(sysname, ServerProperty('collation')), ' ')
from syscharsets where id = @csid
END
else
BEGIN
select @attribute_value = 'charset='+ name +' sort_order=' + @sortname
+ ' charset_num=' + rtrim(convert(char(4),@csid))+
' sort_order_num=' + rtrim(convert(char(4),@sortid))
from syscharsets where id = @csid
END
insert into spt_server_info
values (18,'COLLATION_SEQ', isnull(@attribute_value, ' '))
if @case_sensitive = 1 /* If case sensitive server */
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','SENSITIVE')
end
else
begin
insert into spt_server_info
values (16,'IDENTIFIER_CASE','MIXED')
end
update spt_datatype_info set CASE_SENSITIVE = @case_sensitive
where DATA_TYPE in (-1, 1, 12) /* CHAR types */
update spt_datatype_info set CASE_SENSITIVE = @ncase_sensitive
where DATA_TYPE in (-10, -9, -8) /* NCHAR types */
update spt_provider_types set case_sensitive = @case_sensitive
where oledb_data_type = 129 /*DBTYPE_STR*/
update spt_provider_types set case_sensitive = @ncase_sensitive
where oledb_data_type = 130 /*DBTYPE_WSTR*/
/* sp_add_server_info75 */
go
if (charindex('8.00', @@version) > 0)
begin
exec sp_add_server_sortinfo75
end
go
print ''
print 'creating sp_catalogs_rowset'
go
create procedure sp_catalogs_rowset
(
@catalog_name varchar(255)
)
as
select
CATALOG_NAME = name,
DESCRIPTION = convert(varchar(1),null)
from master.dbo.sysdatabases
where name = @catalog_name AND has_dbaccess(name)=1
go
dump tran master with no_log
go
create procedure sp_catalogs_rowset;2
(
@dummy int /* remove when Hydra bug 17032 is fixed */
)
as
select
CATALOG_NAME = name,
DESCRIPTION = convert(varchar(1),null)
from master.dbo.sysdatabases
where has_dbaccess(name)=1
order by 1
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_catalogs_rowset
go
/* Procedure for 8.0 server */
create procedure sp_catalogs_rowset
(
@catalog_name sysname
)
as
select
CATALOG_NAME = name,
DESCRIPTION = convert(nvarchar(1),null)
from master.dbo.sysdatabases
where name = @catalog_name AND has_dbaccess(name)=1
go
create procedure sp_catalogs_rowset;2
(
@dummy int /* remove when Hydra bug 17032 is fixed */
)
as
select
CATALOG_NAME = name,
DESCRIPTION = convert(nvarchar(1),null)
from master.dbo.sysdatabases
where has_dbaccess(name)=1
order by 1
go
create procedure sp_catalogs_rowset;5
(
@server_name sysname,
@catalog_name sysname = NULL
)
as
select CATALOG_NAME,
DESCRIPTION
from master.dbo.SYSREMOTE_CATALOGS <@server_name, @catalog_name>
where has_dbaccess(CATALOG_NAME)=1
order by 1
go
grant execute on sp_catalogs_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_catalogs_rowset' and type = 'P '))
begin
drop procedure sp_catalogs_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_column_privileges_rowset'
go
/* Procedure for 6.0 and 6.5 server */
CREATE PROCEDURE sp_column_privileges_rowset
(
@table_name varchar(255) = null,
@table_schema varchar(255) = null,
@column_name varchar(255) = null,
@grantor varchar(255) = null,
@grantee varchar(255) = null
)
as
IF @table_name is not null
BEGIN
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
END
ELSE
BEGIN
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
END
go
dump tran master with no_log
go
CREATE PROCEDURE sp_column_privileges_rowset;2
(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@table_name varchar(255) = null,
@table_schema varchar(255) = null,
@column_name varchar(255) = null,
@grantor varchar(255) = null,
@grantee varchar(255) = null
)
as
declare @ret int
SET NOCOUNT ON
create table #spcprivsrowset1
(
GRANTOR sysname not null,
GRANTEE sysname not null,
TABLE_CATALOG sysname not null,
TABLE_SCHEMA sysname not null,
TABLE_NAME sysname not null,
COLUMN_NAME sysname not null,
COLUMN_GUID binary(16) null,
COLUMN_PROPID int null,
PRIVILEGE_TYPE sysname not null,
IS_GRANTABLE bit not null
)
IF @table_name is not null
BEGIN
insert into #spcprivsrowset1
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
END
ELSE
BEGIN
insert into #spcprivsrowset1
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
END
exec @ret = sp_cursoropen @handle output, 'select * from #spcprivsrowset1',
@scrollopt output, @ccopt output, @rows output
drop table #spcprivsrowset1
return isnull(@ret,0)
go
dump tran master with no_log
go
CREATE PROCEDURE sp_column_privileges_rowset;3
as
select
GRANTOR = convert(sysname,' '),
GRANTEE = convert(sysname,' '),
TABLE_CATALOG = convert(sysname,' '),
TABLE_SCHEMA = convert(sysname,' '),
TABLE_NAME = convert(sysname,' '),
COLUMN_NAME = convert(sysname,' '),
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(varchar(30),' '),
IS_GRANTABLE = convert(bit,1)
where 1=0
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_column_privileges_rowset
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_column_privileges_rowset
(
@table_name sysname,
@table_schema sysname = null,
@column_name sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(nvarchar(30),
case p.action
when 193 then N'SELECT'
when 195 then N'INSERT'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(nvarchar(30),
case v.number
when 193 then N'SELECT'
when 195 then N'INSERT'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
go
dump tran master with no_log
go
CREATE PROCEDURE sp_column_privileges_rowset;2
(
@table_schema sysname = null,
@column_name sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(nvarchar(30),
case p.action
when 193 then N'SELECT'
when 195 then N'INSERT'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, master.dbo.spt_values v, syscolumns c, sysmembers m
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and c.id = p.id
and (@grantor is null or @grantor = user_name(p.grantor))
and case
when substring(p.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p.columns, v.low, 1))
else (~convert(tinyint, coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0 /* permission applies to this column */
and v.number <= (select count(*) from syscolumns where id = o.id) /* ranges from 1 to # of columns in table */
and v.type = 'P'
and v.number = c.colid
and (@grantee is null or @grantee = user_name(u.uid))
/* expand groups - AKUNDONE: only 1 level of group unrolling here. Need more?? */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where
p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid
and case
when substring(p1.columns, 1, 1) & 1 is null then 255 /* all columns have permission */
when substring(p1.columns, 1, 1) & 1 = 0 then convert(tinyint, substring(p1.columns, v.low, 1))
else (~convert(tinyint,coalesce(substring(p.columns, v.low, 1),0)))
end & v.high <> 0) /* permission applies to this column */
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
PRIVILEGE_TYPE = convert(nvarchar(30),
case v.number
when 193 then N'SELECT'
when 195 then N'INSERT'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u, syscolumns c
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and c.id = o.id
and (@column_name is null or @column_name = c.name)
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4, 5, 6, 9, 1, 2
go
dump tran master with no_log
go
create procedure sp_column_privileges_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null,
@column_name sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR,
GRANTEE,
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
PRIVILEGE_TYPE,
IS_GRANTABLE
from master.dbo.SYSREMOTE_COLUMN_PRIVILEGES <
@table_server,
@table_catalog,
@table_schema,
@table_name,
@column_name,
@grantor,
@grantee>
order by 3, 4, 5, 6, 9, 1, 2
go
grant execute on sp_column_privileges_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_column_privileges_rowset' and type = 'P '))
begin
drop procedure sp_column_privileges_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_columns_rowset'
go
/* Procedure for 6.0 and 6.50 server */
create procedure sp_columns_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@column_name varchar(255) = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
COLUMN_DEFAULT = convert (varchar (255),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)-2)
else substring(m.text,1,datalength(m.text)-2)
end),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when c.status&8 = 8
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128
then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/
else 0
end),
IS_NULLABLE = convert(bit,c.status&8),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(binary(16),null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then b_cha.name
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(varchar(1),null)
from
syscolumns c,
syscomments m,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
sysusers u,
master.dbo.sysconfigures cfg,
master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */
master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */
where
o.name = @table_name
and o.type in ('U','V','S')
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.type = d.ss_dtype
and (t.usertype != 80 or d.type_name='timestamp')
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and c.cdefault *= m.id
and m.colid = 1
and cfg.comment = 'default sortorder ID'
and a_cha.type = 1001 /* type is charset */
and b_cha.type = 2001 /* type is sortorder */
and a_cha.id = b_cha.csid
and b_cha.id = cfg.value
order by 2, 3, c.colid
go
dump tran master with no_log
go
create procedure sp_columns_rowset;2
(
@table_schema varchar(255) = null,
@column_name varchar(255) = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
COLUMN_DEFAULT = convert (varchar (255),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)-2)
else substring(m.text,1,datalength(m.text)-2)
end),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when c.status&8 = 8
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128
then 0x8 /*DBCOLUMNFLAGS_WRITEUNKNOWN*/
else 0
end),
IS_NULLABLE = convert(bit,c.status&8),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(binary(16),null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then 'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then b_cha.name
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(varchar(1),null)
from
syscolumns c,
syscomments m,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
sysusers u,
master.dbo.sysconfigures cfg,
master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */
master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */
where
o.type in ('U','V','S')
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.type = d.ss_dtype
and (t.usertype != 80 or d.type_name='timestamp')
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and c.cdefault *= m.id
and m.colid = 1
and cfg.comment = 'default sortorder ID'
and a_cha.type = 1001 /* type is charset */
and b_cha.type = 2001 /* type is sortorder */
and a_cha.id = b_cha.csid
and b_cha.id = cfg.value
order by 2, 3, c.colid
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_columns_rowset
go
/* Procedure for 7.0 server */
create procedure sp_columns_rowset
(
@table_name sysname,
@table_schema sysname = NULL,
@column_name sysname = NULL
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
COLUMN_DEFAULT = convert(nvarchar(2000),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)/2-2)
else substring(m.text,1,datalength(m.text)/2-2)
end ),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
then 0x4 /*DBCOLUMNFLAGS_WRITE*/
else 0
end),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(uniqueidentifier,null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then b_cha.name
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(nvarchar(1),null)
from
syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
master.dbo.sysconfigures cfg,
master.dbo.syscharsets a_cha, /* charset/1001, not sortorder. */
master.dbo.syscharsets b_cha /* sortorder/2001, not charset. */
where
permissions(o.id, c.name) <> 0
and o.name = @table_name
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and cfg.comment = 'default sortorder id'
and a_cha.type = 1001 /* type is charset */
and b_cha.type = 2001 /* type is sortorder */
and a_cha.id = b_cha.csid
and b_cha.id = cfg.value
order by 2, 3, c.colorder
go
dump tran master with no_log
go
/* Procedure for 7.0 server */
create procedure sp_columns_rowset;2
(
@table_schema sysname = NULL,
@column_name sysname = NULL
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
COLUMN_DEFAULT = convert(nvarchar(2000),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)/2-2)
else substring(m.text,1,datalength(m.text)/2-2)
end ),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
then 0x4 /*DBCOLUMNFLAGS_WRITE*/
else 0
end),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(uniqueidentifier,null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then b_cha.name
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(nvarchar(1),null)
from
syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
master.dbo.sysconfigures cfg,
master.dbo.syscharsets a_cha, /* charset/1001, not sortorder.*/
master.dbo.syscharsets b_cha /* sortorder/2001, not charset.*/
where
permissions(o.id, c.name) <> 0
and o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and cfg.comment = 'default sortorder id'
and a_cha.type = 1001 /* type is charset */
and b_cha.type = 2001 /* type is sortorder */
and a_cha.id = b_cha.csid
and b_cha.id = cfg.value
order by 2, 3, c.colorder
go
dump tran master with no_log
go
/* Procedure for 7.0 server */
create procedure sp_columns_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null,
@column_name sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
ORDINAL_POSITION,
COLUMN_HASDEFAULT,
COLUMN_DEFAULT,
COLUMN_FLAGS,
IS_NULLABLE,
DATA_TYPE,
TYPE_GUID,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE,
DATETIME_PRECISION,
CHARACTER_SET_CATALOG,
CHARACTER_SET_SCHEMA,
CHARACTER_SET_NAME,
COLLATION_CATALOG,
COLLATION_SCHEMA,
COLLATION_NAME,
DOMAIN_CATALOG,
DOMAIN_SCHEMA,
DOMAIN_NAME,
DESCRIPTION
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
@table_schema,
@table_name,
@column_name >
order by 1, 2, 3, 7
go
dump tran master with no_log
go
/* Procedure for 8.00 server */
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_columns_rowset
go
/* Procedure for 8.00 server */
create procedure sp_columns_rowset
(
@table_name sysname,
@table_schema sysname = NULL,
@column_name sysname = NULL
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
/* Get rid of ( if it is first char otherwise display the whole thing */
COLUMN_DEFAULT = convert(nvarchar(2000),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)/2-2)
else substring(m.text,1,datalength(m.text)/2-2)
end ),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
then 0x4 /*DBCOLUMNFLAGS_WRITE*/
else 0
end),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(uniqueidentifier,null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then c.collation
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(nvarchar(1),null),
COLUMN_LCID = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),
COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),
COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */
when ABS(c.collationid) > 0x1000000
then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))
else null
end,
COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),
IS_COMPUTED = convert(bit, c.iscomputed)
from
syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
master.dbo.syscharsets a_cha /* charset/1001, not sortorder. */
where
permissions(o.id, c.name) <> 0
and o.name = @table_name
and (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),
convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
order by 2, 3, c.colorder
go
/* Procedure for 8.0 server */
create procedure sp_columns_rowset;2
(
@table_schema sysname = NULL,
@column_name sysname = NULL
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_HASDEFAULT = convert(bit, case when m.text is null then 0 else 1 end),
COLUMN_DEFAULT = convert(nvarchar(2000),
case when substring(m.text,1,1) = '('
then substring(m.text,2,datalength(m.text)/2-2)
else substring(m.text,1,datalength(m.text)/2-2)
end ),
COLUMN_FLAGS = convert(int,
case when d.is_long = 1
then 0x82 /*DBCOLUMNFLAGS_ISLONG|DBCOLUMNFLAGS_MAYDEFER*/
else 0
end
| case when d.fixlen is not null
then 0x10 /*DBCOLUMNFLAGS_ISFIXEDLENGTH*/
else 0
end
| case when ColumnProperty(c.id,c.name,'AllowsNull') = 1
then 0x60 /*DBCOLUMNFLAGS_ISNULLABLE|DBCOLUMNFLAGS_MAYBENULL*/
else 0
end
| case
when d.type_name = 'timestamp'
then 0x200 /*DBCOLUMNFLAGS_ISROWVER*/
when (c.status&128) != 128 and permissions(o.id,c.name)&2 = 2
then 0x4 /*DBCOLUMNFLAGS_WRITE*/
else 0
end),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
TYPE_GUID = convert(uniqueidentifier,null),
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.xprec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DATETIME_PRECISION = convert(int,
case when d.oledb_data_type <> 135 /*DBTYPE_DBTIMESTAMP*/ then null
when data_precision = 23 then 3 else 0 end),
CHARACTER_SET_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
CHARACTER_SET_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
CHARACTER_SET_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then a_cha.name
else null
end),
COLLATION_CATALOG = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'master'
else null
end),
COLLATION_SCHEMA = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then N'dbo'
else null
end),
COLLATION_NAME = convert(sysname,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
then c.collation
else null
end),
DOMAIN_CATALOG = case when t.usertype < 256 then null else db_name() end,
DOMAIN_SCHEMA = case when t.usertype < 256 then null else user_name(o.uid) end,
DOMAIN_NAME = case when t.usertype < 256 then null else t.name end,
DESCRIPTION = convert(nvarchar(1),null),
COLUMN_LCID = convert(int, CollationPropertyFromID(c.collationid, 'lcid')),
COLUMN_COMPFLAGS = convert(int, CollationPropertyFromID(c.collationid, 'oledbcompstyle')),
COLUMN_SORTID = case /* hack to keep the old behavior: will be removed */
when ABS(c.collationid) > 0x1000000
then convert(int, DATABASEPROPERTYEX(db_name(),'sqlsortorder'))
else null
end,
COLUMN_TDSCOLLATION = convert (binary(5),CollationPropertyFromID(c.collationid, 'TDSCollation')),
IS_COMPUTED = convert(bit, c.iscomputed)
from
syscolumns c left join syscomments m on c.cdefault = m.id and m.colid = 1,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t,
master.dbo.syscharsets a_cha /* charset/1001, not sortorder.*/
where
permissions(o.id, c.name) <> 0
and (o.type in ('U','V','S') OR (o.type in ('TF', 'IF') and c.number = 0))
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@column_name is null or @column_name = c.name)
and o.id = c.id
and t.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and a_cha.type = 1001 /* type is charset */
and a_cha.id = isnull(convert(tinyint, CollationPropertyFromID(c.collationid, 'sqlcharset')),
convert(tinyint, ServerProperty('sqlcharset'))) -- make sure there's one and only one row selected for each column
order by 2, 3, c.colorder
go
dump tran master with no_log
go
/* Procedure for 8.0 server */
create procedure sp_columns_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null,
@column_name sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
ORDINAL_POSITION,
COLUMN_HASDEFAULT,
COLUMN_DEFAULT,
COLUMN_FLAGS,
IS_NULLABLE,
DATA_TYPE,
TYPE_GUID,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE,
DATETIME_PRECISION,
CHARACTER_SET_CATALOG,
CHARACTER_SET_SCHEMA,
CHARACTER_SET_NAME,
COLLATION_CATALOG,
COLLATION_SCHEMA,
COLLATION_NAME,
DOMAIN_CATALOG,
DOMAIN_SCHEMA,
DOMAIN_NAME,
DESCRIPTION
from master.dbo.SYSREMOTE_COLUMNS <
@table_server,
@table_catalog,
@table_schema,
@table_name,
@column_name >
order by 1, 2, 3, 7
go
grant execute on sp_columns_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_columns_rowset' and type = 'P '))
begin
drop procedure sp_columns_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_check_constraints_rowset'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_check_constraints_rowset
(
@constraint_name varchar(255),
@constraint_schema varchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(varchar(1),null)
from
sysobjects c_obj, syscomments m
where
c_obj.type = 'C '
and c_obj.name = @constraint_name
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and c_obj.id = m.id
order by 1,2,3
go
dump tran master with no_log
go
create procedure sp_check_constraints_rowset;2
(
@constraint_schema varchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(varchar(1),null)
from
sysobjects c_obj, syscomments m
where
c_obj.type = 'C '
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and c_obj.id = m.id
order by 1,2,3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_check_constraints_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 servers and 8.0 servers */
create procedure sp_check_constraints_rowset
(
@constraint_name sysname,
@constraint_schema sysname = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, syscomments m
where
c_obj.type = 'C '
and c_obj.name = @constraint_name
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and m.id = c_obj.id
order by 1,2,3
go
dump tran master with no_log
go
create procedure sp_check_constraints_rowset;2
(
@constraint_schema sysname = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, syscomments m
where
c_obj.type = 'C '
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and m.id = c_obj.id
order by 1,2,3
go
grant execute on sp_check_constraints_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_check_constraints_rowset' and type = 'P '))
begin
drop procedure sp_check_constraints_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_check_constbytable_rowset'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_check_constbytable_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@constraint_name varchar(255) = null,
@constraint_schema varchar(255) = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(varchar(1),null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m
where
t_obj.name = @table_name
and t_obj.type in ('U ','S ')
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and t_obj.id = c.id
and c.constid = c_obj.id
and c_obj.type = 'C '
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and c_obj.id = m.id
order by 1,2,3,4,5,6
go
dump tran master with no_log
go
create procedure sp_check_constbytable_rowset;2
(
@table_schema varchar(255) = null,
@constraint_name varchar(255) = null,
@constraint_schema varchar(255) = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(varchar(1),null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c, syscomments m
where
t_obj.type in ('U ','S ')
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c.id = t_obj.id
and c.constid = c_obj.id
and c_obj.type = 'C '
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and c_obj.id = m.id
order by 1,2,3,4,5,6
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_check_constbytable_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_check_constbytable_rowset
(
@table_name sysname,
@table_schema sysname = null,
@constraint_name sysname = null,
@constraint_schema sysname = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, syscomments m
where
t_obj.name = @table_name
and t_obj.type in ('U ','S ')
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c_obj.parent_obj = t_obj.id
and c_obj.type = 'C '
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and m.id = c_obj.id
order by 1,2,3,4,5,6
go
dump tran master with no_log
go
create procedure sp_check_constbytable_rowset;2
(
@table_schema sysname = null,
@constraint_name sysname = null,
@constraint_schema sysname = null
)
as
select
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
CHECK_CLAUSE = m.text,
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, syscomments m
where
t_obj.type in ('U ','S ')
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c_obj.parent_obj = t_obj.id
and c_obj.type = 'C '
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and m.id = c_obj.id
order by 1,2,3,4,5,6
go
dump tran master with no_log
go
grant execute on sp_check_constbytable_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_check_constbytable_rowset' and type = 'P '))
begin
drop procedure sp_check_constbytable_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_foreign_keys_rowset'
go
/* Procedure for 6.0 and 6.5 server */
CREATE PROCEDURE sp_foreign_keys_rowset
(
@pk_table_name varchar(255) = null,
@pk_table_schema varchar(255) = null,
@pk_table_catalog varchar(255) = null,
@fk_table_name varchar(255) = null,
@fk_table_schema varchar(255) = null,
@fk_table_catalog varchar(255) = null
)
as
BEGIN
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(binary(16),null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(binary(16),null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,1),
UPDATE_RULE = 'NO ACTION',
DELETE_RULE = 'NO ACTION',
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey1
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey1
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,2),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 2
and o1.id = c1.id
and c1.colid = r.rkey2
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey2
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,3),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 3
and o1.id = c1.id
and c1.colid = r.rkey3
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey3
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,4),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 4
and o1.id = c1.id
and c1.colid = r.rkey4
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey4
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,5),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 5
and o1.id = c1.id
and c1.colid = r.rkey5
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey5
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,6),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 6
and o1.id = c1.id
and c1.colid = r.rkey6
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey6
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,7),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 7
and o1.id = c1.id
and c1.colid = r.rkey7
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey7
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,8),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 8
and o1.id = c1.id
and c1.colid = r.rkey8
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey8
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,9),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 9
and o1.id = c1.id
and c1.colid = r.rkey9
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey9
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,10),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 10
and o1.id = c1.id
and c1.colid = r.rkey10
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey10
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,11),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 11
and o1.id = c1.id
and c1.colid = r.rkey11
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey11
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,12),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 12
and o1.id = c1.id
and c1.colid = r.rkey12
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey12
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,13),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 13
and o1.id = c1.id
and c1.colid = r.rkey13
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey13
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,14),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 14
and o1.id = c1.id
and c1.colid = r.rkey14
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey14
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,15),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 15
and o1.id = c1.id
and c1.colid = r.rkey15
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey15
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,16),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and o1.id = c1.id
and r.keycnt >= 16
and c1.colid = r.rkey16
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey16
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
order by 8,9,2,3,13
END
go
dump tran master with no_log
go
CREATE PROCEDURE sp_foreign_keys_rowset;2
(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@pk_table_name varchar(255) = null,
@pk_table_schema varchar(255) = null,
@pk_table_catalog varchar(255) = null,
@fk_table_name varchar(255) = null,
@fk_table_schema varchar(255) = null,
@fk_table_catalog varchar(255) = null
)
as
declare @ret int
SET NOCOUNT ON
create table #spfkeysrowset1
(
PK_TABLE_CATALOG sysname not null,
PK_TABLE_SCHEMA sysname not null,
PK_TABLE_NAME sysname not null,
PK_COLUMN_NAME sysname not null,
PK_COLUMN_GUID binary(16) null,
PK_COLUMN_PROPID int null,
FK_TABLE_CATALOG sysname not null,
FK_TABLE_SCHEMA sysname not null,
FK_TABLE_NAME sysname not null,
FK_COLUMN_NAME sysname not null,
FK_COLUMN_GUID binary(16) null,
FK_COLUMN_PROPID int null,
ORDINAL int not null,
UPDATE_RULE sysname not null,
DELETE_RULE sysname not null,
PK_NAME sysname not null,
FK_NAME sysname not null,
DEFERRABILITY smallint not null
)
BEGIN
insert into #spfkeysrowset1
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,1),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey1
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey1
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,2),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 2
and o1.id = c1.id
and c1.colid = r.rkey2
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey2
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,3),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 3
and o1.id = c1.id
and c1.colid = r.rkey3
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey3
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,4),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 4
and o1.id = c1.id
and c1.colid = r.rkey4
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey4
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,5),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 5
and o1.id = c1.id
and c1.colid = r.rkey5
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey5
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,6),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 6
and o1.id = c1.id
and c1.colid = r.rkey6
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey6
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,7),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 7
and o1.id = c1.id
and c1.colid = r.rkey7
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey7
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,8),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 8
and o1.id = c1.id
and c1.colid = r.rkey8
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey8
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,9),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 9
and o1.id = c1.id
and c1.colid = r.rkey9
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey9
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,10),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 10
and o1.id = c1.id
and c1.colid = r.rkey10
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey10
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,11),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 11
and o1.id = c1.id
and c1.colid = r.rkey11
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey11
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,12),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 12
and o1.id = c1.id
and c1.colid = r.rkey12
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey12
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,13),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 13
and o1.id = c1.id
and c1.colid = r.rkey13
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey13
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,14),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 14
and o1.id = c1.id
and c1.colid = r.rkey14
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey14
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,15),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and r.keycnt >= 15
and o1.id = c1.id
and c1.colid = r.rkey15
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey15
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
union all
select
db_name(r.rkeydbid),
user_name(o1.uid),
o1.name,
c1.name,
convert(binary(16),null),
convert(int,null),
db_name(r.fkeydbid),
user_name(o2.uid),
o2.name,
c2.name,
convert(binary(16),null),
convert(int,null),
convert(int,16),
'NO ACTION',
'NO ACTION',
i.name,
object_name(r.constid),
convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i, sysusers u
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@fk_table_name is null or @fk_table_name = o2.name)
and o1.id = r.rkeyid
and o1.id = c1.id
and r.keycnt >= 16
and c1.colid = r.rkey16
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey16
and i.id = r.rkeyid
and i.indid = r.rkeyindid
and u.uid = user_id()
and ( suser_id() = 1 /* User is the System Administrator */
or (
o1.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o1.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
and (
o2.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o2.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
)
order by 8,9,2,3,13
END
exec @ret = sp_cursoropen @handle output, 'select * from #spfkeysrowset1',
@scrollopt output, @ccopt output, @rows output
drop table #spfkeysrowset1
return isnull(@ret,0)
go
dump tran master with no_log
go
CREATE PROCEDURE sp_foreign_keys_rowset;3
as
select
PK_TABLE_CATALOG = convert(sysname,' '),
PK_TABLE_SCHEMA = convert(sysname,' '),
PK_TABLE_NAME = convert(sysname,' '),
PK_COLUMN_NAME = convert(sysname,' '),
PK_COLUMN_GUID = convert(binary(16),null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = convert(sysname,' '),
FK_TABLE_SCHEMA = convert(sysname,' '),
FK_TABLE_NAME = convert(sysname,' '),
FK_COLUMN_NAME = convert(sysname,' '),
FK_COLUMN_GUID = convert(binary(16),null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,1),
UPDATE_RULE = 'NO ACTION',
DELETE_RULE = 'NO ACTION',
PK_NAME = convert(sysname, ' '),
FK_NAME = convert(sysname, ' '),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
where 1=0
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_foreign_keys_rowset
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_foreign_keys_rowset
(
@pk_table_name sysname,
@pk_table_schema sysname = null,
@fk_table_name sysname = null,
@fk_table_schema sysname = null,
@fk_table_catalog sysname = null
)
as
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,1),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey1
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey1
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,2),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey2
and r.keycnt >= 2
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey2
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,3),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey3
and r.keycnt >= 3
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey3
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,4),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 4
and o1.id = c1.id
and c1.colid = r.rkey4
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey4
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,5),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 5
and o1.id = c1.id
and c1.colid = r.rkey5
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey5
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,6),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 6
and o1.id = c1.id
and c1.colid = r.rkey6
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey6
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,7),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 7
and o1.id = c1.id
and c1.colid = r.rkey7
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey7
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,8),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 8
and o1.id = c1.id
and c1.colid = r.rkey8
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey8
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,9),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 9
and o1.id = c1.id
and c1.colid = r.rkey9
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey9
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,10),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 10
and o1.id = c1.id
and c1.colid = r.rkey10
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey10
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,11),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 11
and o1.id = c1.id
and c1.colid = r.rkey11
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey11
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,12),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 12
and o1.id = c1.id
and c1.colid = r.rkey12
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey12
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,13),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 13
and o1.id = c1.id
and c1.colid = r.rkey13
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey13
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,14),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 14
and o1.id = c1.id
and c1.colid = r.rkey14
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey14
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,15),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 15
and o1.id = c1.id
and c1.colid = r.rkey15
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey15
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,16),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@fk_table_catalog is null or @fk_table_catalog = db_name())
and o1.name = @pk_table_name
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 16
and o1.id = c1.id
and c1.colid = r.rkey16
and r.fkeyid = o2.id
and (@fk_table_name is null or @fk_table_name = o2.name)
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey16
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
order by 8,9,2,3,13
go
dump tran master with no_log
go
CREATE PROCEDURE sp_foreign_keys_rowset;2
(
@fk_table_name sysname,
@fk_table_schema sysname = null,
@pk_table_name sysname = null,
@pk_table_schema sysname = null,
@pk_table_catalog sysname = null
)
as
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,1),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and o2.id = c2.id
and c2.colid = r.fkey1
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey1
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,2),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 2
and o2.id = c2.id
and c2.colid = r.fkey2
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey2
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,3),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 3
and o2.id = c2.id
and c2.colid = r.fkey3
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey3
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,4),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 4
and o2.id = c2.id
and c2.colid = r.fkey4
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey4
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,5),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 5
and o2.id = c2.id
and c2.colid = r.fkey5
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey5
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,6),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 6
and o2.id = c2.id
and c2.colid = r.fkey6
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey6
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,7),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 7
and o2.id = c2.id
and c2.colid = r.fkey7
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey7
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,8),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 8
and o2.id = c2.id
and c2.colid = r.fkey8
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey8
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,9),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 9
and o2.id = c2.id
and c2.colid = r.fkey9
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey9
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,10),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 10
and o2.id = c2.id
and c2.colid = r.fkey10
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey10
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,11),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 11
and o2.id = c2.id
and c2.colid = r.fkey11
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey11
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,12),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 12
and o2.id = c2.id
and c2.colid = r.fkey12
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey12
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,13),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 13
and o2.id = c2.id
and c2.colid = r.fkey13
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey13
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,14),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 14
and o2.id = c2.id
and c2.colid = r.fkey14
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey14
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,15),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 15
and o2.id = c2.id
and c2.colid = r.fkey15
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey15
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,16),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and o2.name = @fk_table_name
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = r.fkeyid
and r.keycnt >= 16
and o2.id = c2.id
and c2.colid = r.fkey16
and r.rkeyid = o1.id
and (@pk_table_name is null or @pk_table_name = o1.name)
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = c1.id
and c1.colid = r.rkey16
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
order by 8,9,2,3,13
go
dump tran master with no_log
go
CREATE PROCEDURE sp_foreign_keys_rowset;3
(
@pk_table_schema sysname = null,
@pk_table_catalog sysname = null,
@fk_table_schema sysname = null,
@fk_table_catalog sysname = null
)
as
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,1),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and o1.id = c1.id
and c1.colid = r.rkey1
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey1
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,2),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 2
and o1.id = c1.id
and c1.colid = r.rkey2
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey2
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,3),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 3
and o1.id = c1.id
and c1.colid = r.rkey3
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey3
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,4),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 4
and o1.id = c1.id
and c1.colid = r.rkey4
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey4
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,5),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 5
and o1.id = c1.id
and c1.colid = r.rkey5
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey5
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,6),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 6
and o1.id = c1.id
and c1.colid = r.rkey6
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey6
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,7),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 7
and o1.id = c1.id
and c1.colid = r.rkey7
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey7
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,8),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 8
and o1.id = c1.id
and c1.colid = r.rkey8
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey8
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,9),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 9
and o1.id = c1.id
and c1.colid = r.rkey9
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey9
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,10),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 10
and o1.id = c1.id
and c1.colid = r.rkey10
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey10
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,11),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 11
and o1.id = c1.id
and c1.colid = r.rkey11
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey11
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,12),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 12
and o1.id = c1.id
and c1.colid = r.rkey12
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey12
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,13),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 13
and o1.id = c1.id
and c1.colid = r.rkey13
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey13
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,14),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 14
and o1.id = c1.id
and c1.colid = r.rkey14
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey14
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,15),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and r.keycnt >= 15
and o1.id = c1.id
and c1.colid = r.rkey15
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey15
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
union all
select
PK_TABLE_CATALOG = db_name(r.rkeydbid),
PK_TABLE_SCHEMA = user_name(o1.uid),
PK_TABLE_NAME = o1.name,
PK_COLUMN_NAME = c1.name,
PK_COLUMN_GUID = convert(uniqueidentifier,null),
PK_COLUMN_PROPID = convert(int,null),
FK_TABLE_CATALOG = db_name(r.fkeydbid),
FK_TABLE_SCHEMA = user_name(o2.uid),
FK_TABLE_NAME = o2.name,
FK_COLUMN_NAME = c2.name,
FK_COLUMN_GUID = convert(uniqueidentifier,null),
FK_COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,16),
UPDATE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsUpdateCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
DELETE_RULE = CASE WHEN (ObjectProperty(r.constid, 'CnstIsDeleteCascade')=1) THEN N'CASCADE' ELSE N'NO ACTION' END,
PK_NAME = i.name,
FK_NAME = object_name(r.constid),
DEFERRABILITY = convert(smallint, 3) /*DBPROPVAL_DF_NOT_DEFERRABLE*/
from
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2,
sysreferences r, sysindexes i
where
(@pk_table_catalog is null or @pk_table_catalog = db_name())
and (@fk_table_catalog is null or @fk_table_catalog = db_name())
and (@pk_table_schema is null or @pk_table_schema = user_name(o1.uid))
and o1.id = r.rkeyid
and o1.id = c1.id
and r.keycnt >= 16
and c1.colid = r.rkey16
and r.fkeyid = o2.id
and (@fk_table_schema is null or @fk_table_schema = user_name(o2.uid))
and o2.id = c2.id
and c2.colid = r.fkey16
and permissions(o1.id) <> 0
and permissions(o2.id) <> 0
and i.id = r.rkeyid
and i.indid = r.rkeyindid
order by 8,9,2,3,13
go
dump tran master with no_log
go
create procedure sp_foreign_keys_rowset;5
(
@server_name sysname,
@pk_catalog_name sysname = null,
@fk_catalog_name sysname = null,
@pk_table_name sysname = null,
@pk_table_schema sysname = null,
@fk_table_name sysname = null,
@fk_table_schema sysname = null
)
as
select
PK_TABLE_CATALOG,
PK_TABLE_SCHEMA,
PK_TABLE_NAME,
PK_COLUMN_NAME,
PK_COLUMN_GUID,
PK_COLUMN_PROPID,
FK_TABLE_CATALOG,
FK_TABLE_SCHEMA,
FK_TABLE_NAME,
FK_COLUMN_NAME,
FK_COLUMN_GUID,
FK_COLUMN_PROPID,
ORDINAL,
UPDATE_RULE,
DELETE_RULE
--PK_NAME,
--FK_NAME,
--DEFERRABILITY
from master.dbo.SYSREMOTE_FOREIGN_KEYS <
@server_name,
@pk_catalog_name,
@pk_table_schema,
@pk_table_name,
@fk_catalog_name,
@fk_table_schema,
@fk_table_name >
order by 7,8,9,1,2,3,13
go
grant execute on sp_foreign_keys_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_foreign_keys_rowset' and type = 'P '))
begin
drop procedure sp_foreign_keys_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_indexes_rowset'
go
/* 6.0 and 6.5 version */
create procedure sp_indexes_rowset
(
@table_name varchar(255),
@index_name varchar(255) = null,
@table_schema varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_NAME = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(varchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysusers u
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and x.id = c.id
and c.colid < x.keycnt+(x.status&16)/16
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
create procedure sp_indexes_rowset;2
(
@index_name varchar(255) = null,
@table_schema varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
COLUMN_NAME = index_col(user_name(o.uid)+'.'+o.name, x.indid, c.colid),
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(varchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysusers u
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and x.id = c.id
and c.colid < x.keycnt+(x.status&16)/16
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_indexes_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 7.0 version */
create procedure sp_indexes_rowset
(
@table_name sysname,
@index_name sysname = null,
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int, xk.keyno),
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(nvarchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and o.id = c.id
and o.id = xk.id
and x.indid = xk.indid
and c.colid = xk.colid
and xk.keyno <= x.keycnt
and permissions(o.id, c.name) <> 0
and (x.status&32) = 0 -- No hypothetical indexes
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
create procedure sp_indexes_rowset;2
(
@index_name sysname = null,
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int, xk.keyno),
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint, 1 /* DB_COLLATION_ASC */),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(nvarchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and o.id = c.id
and o.id = xk.id
and x.indid = xk.indid
and c.colid = xk.colid
and xk.keyno <= x.keycnt
and permissions(o.id, c.name) <> 0
and (x.status&32) = 0 -- No hypothetical indexes
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
create procedure sp_indexes_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@index_name sysname = null,
@table_schema sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
INDEX_CATALOG,
INDEX_SCHEMA,
INDEX_NAME,
PRIMARY_KEY,
"UNIQUE",
"CLUSTERED",
"TYPE",
FILL_FACTOR,
INITIAL_SIZE,
NULLS,
SORT_BOOKMARKS,
AUTO_UPDATE,
NULL_COLLATION,
ORDINAL_POSITION,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION
-- INTEGRATED
from master.dbo.SYSREMOTE_INDEXES <
@table_server,
@table_catalog,
@table_schema,
@index_name,
NULL, /* TYPE (index type) */
@table_name >
order by 8 desc, 4, 5, 6, 17
go
grant execute on sp_indexes_rowset to public
go
dump tran master with no_log
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_indexes_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
create procedure sp_indexes_rowset
(
@table_name sysname,
@index_name sysname = null,
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int, xk.keyno),
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint,
case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1
then 2 /* DB_COLLATION_DESC */
else 1 /* DB_COLLATION_ASC */
end),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(nvarchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and o.id = c.id
and o.id = xk.id
and x.indid = xk.indid
and c.colid = xk.colid
and xk.keyno <= x.keycnt
and permissions(o.id, c.name) <> 0
and (x.status&32) = 0 -- No hypothetical indexes
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
create procedure sp_indexes_rowset;2
(
@index_name sysname = null,
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
INDEX_CATALOG = db_name(),
INDEX_SCHEMA = user_name(o.uid),
INDEX_NAME = x.name,
PRIMARY_KEY = convert(bit,(x.status & 0x800)/0x800),
"UNIQUE" = convert(bit,(x.status & 2)/2),
"CLUSTERED" = convert(bit,(x.status & 16)/16),
"TYPE" = convert(smallint, 1 /*DBPROPVAL_IT_BTREE*/),
FILL_FACTOR = convert(int, x.OrigFillFactor),
INITIAL_SIZE = convert(int,null),
NULLS = convert(int,null),
SORT_BOOKMARKS = convert(bit,0),
AUTO_UPDATE = convert(bit,1),
NULL_COLLATION = convert(int,4 /*DBPROPVAL_NC_LOW*/),
ORDINAL_POSITION = convert(int, xk.keyno),
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
COLLATION = convert(smallint,
case when indexkey_property(o.id, x.indid, xk.keyno, 'IsDescending') =1
then 2 /* DB_COLLATION_DESC */
else 1 /* DB_COLLATION_ASC */
end),
CARDINALITY = case when (x.status & 2) = 2 then x.rows else null end,
PAGES = convert(int, x.dpages),
FILTER_CONDITION = convert(nvarchar(1),null),
INTEGRATED = convert(bit,(x.status & 16)/16)
from sysobjects o, sysindexes x, syscolumns c, sysindexkeys xk
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@index_name is null or @index_name = x.name)
and x.id = o.id
and o.id = c.id
and o.id = xk.id
and x.indid = xk.indid
and c.colid = xk.colid
and xk.keyno <= x.keycnt
and permissions(o.id, c.name) <> 0
and (x.status&32) = 0 -- No hypothetical indexes
order by 8 desc, 4, 5, 6, 17
go
dump tran master with no_log
go
create procedure sp_indexes_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@index_name sysname = null,
@table_schema sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
INDEX_CATALOG,
INDEX_SCHEMA,
INDEX_NAME,
PRIMARY_KEY,
"UNIQUE",
"CLUSTERED",
"TYPE",
FILL_FACTOR,
INITIAL_SIZE,
NULLS,
SORT_BOOKMARKS,
AUTO_UPDATE,
NULL_COLLATION,
ORDINAL_POSITION,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
COLLATION,
CARDINALITY,
PAGES,
FILTER_CONDITION
-- INTEGRATED
from master.dbo.SYSREMOTE_INDEXES <
@table_server,
@table_catalog,
@table_schema,
@index_name,
NULL, /* TYPE (index type) */
@table_name >
order by 8 desc, 4, 5, 6, 17
go
grant execute on sp_indexes_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_indexes_rowset' and type = 'P '))
begin
drop procedure sp_indexes_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_primary_keys_rowset'
go
/* Procedure for 6.0 and 6.5 servers */
create procedure sp_primary_keys_rowset
(
@table_name varchar(255),
@table_schema varchar(244) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o, sysusers u
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_primary_keys_rowset;2
(
@table_schema varchar(244) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(binary(16),null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o, sysusers u
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_primary_keys_rowset
go
/* Procedure for 7.0 & 8.0 servers */
create procedure sp_primary_keys_rowset
(
@table_name sysname,
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800 -- PRIMARY KEY
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and permissions(o.id) <> 0
order by 2, 3
go
create procedure sp_primary_keys_rowset;2
(
@table_schema sysname = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800 -- PRIMARY KEY
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and permissions(o.id) <> 0
order by 2, 3
go
create procedure sp_primary_keys_rowset;3
(
@table_name sysname = null,
@table_schema sysname = null
)
as
IF @table_name is not NULL
BEGIN
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800 -- PRIMARY KEY
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and permissions(o.id) <> 0
END
ELSE
BEGIN
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
COLUMN_NAME = c.name,
COLUMN_GUID = convert(uniqueidentifier,null),
COLUMN_PROPID = convert(int,null),
ORDINAL = convert(int,
case
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 1) then 1
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 2) then 2
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 3) then 3
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 4) then 4
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 5) then 5
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 6) then 6
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 7) then 7
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 8) then 8
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 9) then 9
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 10) then 10
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 11) then 11
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 12) then 12
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 13) then 13
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 14) then 14
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 15) then 15
when c.name = index_col(user_name(o.uid)+'.'+o.name, i.indid, 16) then 16
end
),
PK_NAME = i.name
from sysindexes i, syscolumns c, sysobjects o
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800 -- PRIMARY KEY
and (c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 1) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 2) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 3) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 4) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 5) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 6) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 7) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 8) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 9) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 10) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 11) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 12) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 13) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 14) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 15) or
c.name = index_col (user_name(o.uid)+'.'+o.name, i.indid, 16)
)
and permissions(o.id) <> 0
END
go
create procedure sp_primary_keys_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLUMN_GUID,
COLUMN_PROPID,
ORDINAL
--PK_NAME
from master.dbo.SYSREMOTE_PRIMARY_KEYS <@table_server,
@table_catalog,
@table_schema,
@table_name>
order by 1,2,3
go
grant execute on sp_primary_keys_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_primary_keys_rowset' and type = 'P '))
begin
drop procedure sp_primary_keys_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_provider_types_rowset'
go
/* Procedure for 6.0 and 6.50 servers */
create proc sp_provider_types_rowset
(
@data_type smallint = null,
@best_match tinyint = null
)
as
select
TYPE_NAME = case when t.usertype = 80 then t.name
else d.type_name
end,
DATA_TYPE = d.oledb_data_type,
COLUMN_SIZE = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/
then @@max_precision
else coalesce(d.column_size,d.data_precision,t.prec) end,
LITERAL_PREFIX = d.literal_prefix,
LITERAL_SUFFIX = d.literal_suffix,
CREATE_PARAMS = convert(varchar(32),e.CREATE_PARAMS),
IS_NULLABLE = t.allownulls,
CASE_SENSITIVE = d.case_sensitive,
SEARCHABLE = d.searchable,
UNSIGNED_ATTRIBUTE = d.unsigned_attribute,
FIXED_PREC_SCALE = d.fixed_prec_scale,
AUTO_UNIQUE_VALUE = d.auto_unique_value,
LOCAL_TYPE_NAME = case when t.usertype = 80 then t.name
else d.local_type_name
end,
MINIMUM_SCALE = convert(smallint,
case
when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0
else null
end),
MAXIMUM_SCALE = convert(smallint,
case
when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/
then @@max_precision
else null
end),
GUID = convert(binary(16),null),
TYPELIB = convert(varchar(1),null),
VERSION = convert(varchar(1),null),
IS_LONG = d.is_long,
BEST_MATCH = case when t.usertype = 80
then convert(bit,0)
else d.best_match
end,
IS_FIXEDLENGTH = convert(bit,
case when d.fixlen is null then 0 else 1 end)
from master.dbo.spt_provider_types d, master.dbo.spt_datatype_info_ext e, systypes t
where d.ss_dtype = t.type
and t.usertype <= 100
and t.usertype <> 18 /* sysname */
and (case when t.usertype = 80 /* TIMESTAMP */ then 1 else 0 end
= case when d.type_name = 'timestamp' then 1 else 0 end)
and t.usertype *= e.user_type
and e.AUTO_INCREMENT = 0
and t.type not in (111,109,38,110,55,63) /* get rid of nullable types */
and (@data_type is null or d.oledb_data_type = @data_type)
and (@best_match is null or d.best_match = @best_match)
order by 2
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_provider_types_rowset
go
/* Procedure for 8.0 server */
create proc sp_provider_types_rowset
(
@data_type smallint = null,
@best_match tinyint = null
)
as
select
TYPE_NAME = case when t.usertype = 80 then t.name
else d.type_name
end,
DATA_TYPE = d.oledb_data_type,
COLUMN_SIZE = case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/
then @@max_precision
else coalesce(d.column_size,d.data_precision,t.prec) end,
LITERAL_PREFIX = d.literal_prefix,
LITERAL_SUFFIX = d.literal_suffix,
CREATE_PARAMS = convert(nvarchar(32),e.CREATE_PARAMS),
IS_NULLABLE = t.allownulls,
CASE_SENSITIVE = d.case_sensitive,
SEARCHABLE = d.searchable,
UNSIGNED_ATTRIBUTE = d.unsigned_attribute,
FIXED_PREC_SCALE = d.fixed_prec_scale,
AUTO_UNIQUE_VALUE = d.auto_unique_value,
LOCAL_TYPE_NAME = case when t.usertype = 80 then t.name
else d.local_type_name
end,
MINIMUM_SCALE = convert(smallint,
case
when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then 0
else null
end),
MAXIMUM_SCALE = convert(smallint,
case
when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/
then @@max_precision
else null
end),
GUID = convert(uniqueidentifier,null),
TYPELIB = convert(nvarchar(1),null),
VERSION = convert(nvarchar(1),null),
IS_LONG = d.is_long,
BEST_MATCH = case when t.usertype = 80
then convert(bit,0)
else d.best_match
end,
IS_FIXEDLENGTH = convert(bit,
case when d.fixlen is null then 0 else 1 end)
from master.dbo.spt_provider_types d
INNER JOIN master.dbo.systypes t on d.ss_dtype = t.xtype
LEFT OUTER JOIN master.dbo.spt_datatype_info_ext e on
t.xusertype = e.user_type
and e.AUTO_INCREMENT = 0
where (@data_type is null or d.oledb_data_type = @data_type)
and (@best_match is null or d.best_match = @best_match)
and t.usertype <= 255
and t.usertype <> 18 /* sysname */
order by 2
go
grant execute on sp_provider_types_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_provider_types_rowset' and type = 'P '))
begin
drop procedure sp_provider_types_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_procedure_params_rowset'
go
/* Procedure for 6.0 and 6.50 servers */
create procedure sp_procedure_params_rowset
(
@procedure_name varchar(255) = null,
@group_number int = null,
@procedure_schema varchar(255) = null,
@parameter_name varchar(255) = null
)
as
IF @procedure_name is not null
BEGIN
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,
case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/
then 0 else 1
end),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
syscolumns c,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t
where
o.name = @procedure_name
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.number = @group_number
and c.type = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and (t.usertype != 80 or d.type_name='timestamp')
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = convert(sysname,'int'),
LOCAL_TYPE_NAME = convert(sysname,'int')
from
syscomments c,
sysobjects o
where
o.name = @procedure_name
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
and c.id = o.id
and c.number = @group_number
and c.colid = 1
order by 2, 3, 5
END
ELSE
BEGIN
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,
case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/
then 0 else 1
end),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
syscolumns c,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t
where
o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.type = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and (t.usertype != 80 or d.type_name='timestamp')
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = convert(sysname,'int'),
LOCAL_TYPE_NAME = convert(sysname,'int')
from
syscomments c,
sysobjects o
where
o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
and c.id = o.id
and c.colid = 1
order by 2, 3, 5
END
go
dump tran master with no_log
go
create procedure sp_procedure_params_rowset;2
(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@procedure_name varchar(255) = null,
@group_number int = null,
@procedure_schema varchar(255) = null,
@parameter_name varchar(255) = null
)
as
declare @ret int
SET NOCOUNT ON
create table #spprocparamrowset1
(
PROCEDURE_CATALOG sysname not null,
PROCEDURE_SCHEMA sysname not null,
PROCEDURE_NAME varchar(35) not null,
PARAMETER_NAME sysname not null,
ORDINAL_POSITION smallint not null,
PARAMETER_TYPE smallint null,
PARAMETER_HASDEFAULT tinyint null,
PARAMETER_DEFAULT varchar(255) null,
IS_NULLABLE bit not null,
DATA_TYPE smallint null,
CHARACTER_MAXIMUM_LENGTH int null,
CHARACTER_OCTET_LENGTH int null,
NUMERIC_PRECISION smallint null,
NUMERIC_SCALE smallint null,
DESCRIPTION varchar(1) null,
TYPE_NAME sysname null,
LOCAL_TYPE_NAME sysname null,
)
IF @procedure_name is not null
BEGIN
insert into #spprocparamrowset1
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,
case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/
then 0 else 1
end),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
syscolumns c,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t
where
o.name = @procedure_name
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.number = @group_number
and c.type = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and (t.usertype != 80 or d.type_name='timestamp')
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = convert(sysname,'int'),
LOCAL_TYPE_NAME = convert(sysname,'int')
from
syscomments c,
sysobjects o
where
o.name = @procedure_name
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
and c.id = o.id
and c.number = @group_number
and c.colid = 1
order by 2, 3, 5
END
ELSE
BEGIN
insert into #spprocparamrowset1
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+((c.status/64)&1)),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,
case when d.oledb_data_type = 11 /*DBTYPE_BOOL*/
then 0 else 1
end),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
syscolumns c,
sysobjects o,
master.dbo.spt_provider_types d,
systypes t
where
o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.type = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.usertype = t.usertype
and (t.usertype != 80 or d.type_name='timestamp')
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint,0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = convert(sysname,'int'),
LOCAL_TYPE_NAME = convert(sysname,'int')
from
syscomments c,
sysobjects o
where
o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
and c.id = o.id
and c.colid = 1
order by 2, 3, 5
END
exec @ret = sp_cursoropen @handle output, 'select * from #spprocparamrowset1',
@scrollopt output, @ccopt output, @rows output
drop table #spprocparamrowset1
return isnull(@ret,0)
go
dump tran master with no_log
go
create procedure sp_procedure_params_rowset;3
as
select
PROCEDURE_CATALOG = convert(sysname, ' '),
PROCEDURE_SCHEMA = convert(sysname, ' '),
PROCEDURE_NAME = convert(varchar(35), ' '),
PARAMETER_NAME = convert(sysname, ' '),
ORDINAL_POSITION = convert(smallint, 0),
PARAMETER_TYPE = convert(smallint, 0),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(varchar(255),null),
IS_NULLABLE = convert(bit, 0),
DATA_TYPE = convert(smallint, 0),
CHARACTER_MAXIMUM_LENGTH= convert(int, 0),
CHARACTER_OCTET_LENGTH = convert(int, 0),
NUMERIC_PRECISION = convert(smallint, 0),
NUMERIC_SCALE = convert(smallint, 0),
DESCRIPTION = convert(varchar(1),null),
TYPE_NAME = convert(sysname,null),
LOCAL_TYPE_NAME = convert(sysname,null)
where 1=0
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_procedure_params_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 servers */
create procedure sp_procedure_params_rowset
(
@procedure_name sysname,
@group_number int = 1,
@procedure_schema sysname = null,
@parameter_name sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
where
o.name = @procedure_name
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.number = @group_number
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = convert(sysname,N'int'),
LOCAL_TYPE_NAME = convert(sysname,N'int')
from
sysobjects o,
syscomments c
where
o.name = @procedure_name
and o.id = c.id
and c.number = @group_number
and c.colid = 1
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
order by 2, 3, 5
go
dump tran master with no_log
go
create procedure sp_procedure_params_rowset;2
(
@procedure_schema sysname = null,
@parameter_name sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
where
o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = convert(sysname,N'int'),
LOCAL_TYPE_NAME = convert(sysname,N'int')
from
sysobjects o,
syscomments c
where
o.type = 'P' /* Just Procedures */
and o.id = c.id
and c.colid = 1
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
order by 2, 3, 5
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_procedure_params_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 servers */
create procedure sp_procedure_params_rowset
(
@procedure_name sysname,
@group_number int = 1,
@procedure_schema sysname = null,
@parameter_name sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
where
o.name = @procedure_name
and (o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and ((c.number = @group_number and o.type = 'P')
or (c.number = 0 and o.type = 'FN')
or (c.number = 1 and o.type in ('TF', 'IF')))
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = convert(sysname,N'int'),
LOCAL_TYPE_NAME = convert(sysname,N'int')
from
sysobjects o,
syscomments c
where
o.name = @procedure_name
and o.id = c.id
and c.number = @group_number
and c.colid = 1
and o.type = 'P' /* Just Procedures */
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
UNION ALL
SELECT /* UDF return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint, 0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit, c.isnullable),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH = convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
FROM
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
WHERE
o.name = @procedure_name
and o.id = c.id
and c.number = 0
and c.colid = 0
and o.type = 'FN' /* UDF scalar functions */
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
UNION ALL
SELECT /* UDF table value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint, 0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 0), /*DBTYPE_EMPTY*/
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(50), N'Result table returned by table valued function'),
TYPE_NAME = N'table',
LOCAL_TYPE_NAME = N'table'
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d
where
o.name = @procedure_name
and o.id = c.id
and c.number = 0
and c.colid = 1
and o.type in ('TF', 'IF') /* UDF table functions */
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')
order by 2, 3, 5
go
dump tran master with no_log
go
create procedure sp_procedure_params_rowset;2
(
@procedure_schema sysname = null,
@parameter_name sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = c.name,
ORDINAL_POSITION = convert(smallint, c.colid),
PARAMETER_TYPE = convert(smallint, 1+c.isoutparam),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,ColumnProperty(c.id,c.name,'AllowsNull')),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
where
(o.type in ('P', 'TF', 'IF') OR (len(c.name) > 0 and o.type = 'FN'))
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.id = c.id
and (o.type = 'P' or (c.number = 0 and o.type = 'FN') or (c.number = 1 and o.type in ('TF', 'IF')))
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@parameter_name is null or @parameter_name = c.name)
UNION ALL
SELECT /* return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint,0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 3 /*DBTYPE_I4*/),
CHARACTER_MAXIMUM_LENGTH= convert(int,null),
CHARACTER_OCTET_LENGTH = convert(int,null),
NUMERIC_PRECISION = convert(smallint,10),
NUMERIC_SCALE = convert(smallint,null),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = convert(sysname,N'int'),
LOCAL_TYPE_NAME = convert(sysname,N'int')
from
sysobjects o,
syscomments c
where
o.type = 'P' /* Just Procedures */
and o.id = c.id
and c.colid = 1
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
UNION ALL
SELECT /* UDF return value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint, 0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit, c.isnullable),
DATA_TYPE = d.oledb_data_type,
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = d.type_name,
LOCAL_TYPE_NAME = d.local_type_name
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d,
systypes t
where
o.id = c.id
and c.number = 0
and c.colid = 0
and o.type = 'FN' /* UDF scalar functions */
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and c.xusertype = t.xusertype
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@RETURN_VALUE')
UNION ALL
SELECT /* UDF table value row*/
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(c.number,5))),
PARAMETER_NAME = convert(sysname,'@TABLE_RETURN_VALUE'),
ORDINAL_POSITION = convert(smallint, 0),
PARAMETER_TYPE = convert(smallint, 4 /*DBPARAMTYPE_RETURNVALUE*/),
PARAMETER_HASDEFAULT = convert(tinyint, 0),
PARAMETER_DEFAULT = convert(nvarchar(255),null),
IS_NULLABLE = convert(bit,0),
DATA_TYPE = convert(smallint, 0), /*DBTYPE_EMPTY*/
CHARACTER_MAXIMUM_LENGTH= convert(int,
case
when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size,c.length/2)
else null
end),
CHARACTER_OCTET_LENGTH = convert(int,
case when d.oledb_data_type = 129 /*DBTYPE_STR*/
or d.oledb_data_type = 128 /*DBTYPE_BYTES*/
then coalesce(d.column_size,c.length)
when d.oledb_data_type = 130 /*DBTYPE_WSTR*/
then coalesce(d.column_size*2,c.length)
else null
end),
NUMERIC_PRECISION = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.prec
when (d.fixed_prec_scale =1 or d.oledb_data_type =5 or d.oledb_data_type =4)
then d.data_precision else null end),
NUMERIC_SCALE = convert(smallint,
case when d.oledb_data_type = 131 /*DBTYPE_NUMERIC*/ then c.scale else null end),
DESCRIPTION = convert(nvarchar(1),null),
TYPE_NAME = N'table',
LOCAL_TYPE_NAME = N'table'
from
sysobjects o,
syscolumns c,
master.dbo.spt_provider_types d
where
o.id = c.id
and c.number = 0
and c.colid = 1
and o.type in ('TF', 'IF') /* UDF table functions */
and c.xtype = d.ss_dtype
and c.length = case when d.fixlen > 0 then d.fixlen else c.length end
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and (@parameter_name is null or @parameter_name = '@TABLE_RETURN_VALUE')
order by 2, 3, 5
go
grant execute on sp_procedure_params_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_procedure_params_rowset' and type = 'P '))
begin
drop procedure sp_procedure_params_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_procedures_rowset'
go
/* pre 7.0 version */
create procedure sp_procedures_rowset
(
@procedure_name varchar(255),
@group_number int = 1,
@procedure_schema varchar(255) = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(varchar(1),null),
DESCRIPTION = convert(varchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from
sysobjects o,
syscomments p,
sysusers u
where
o.name = @procedure_name
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type = 'P' /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
and p.number = @group_number
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and ( suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_procedures_rowset;2
(
@procedure_schema varchar(255) = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(varchar(35),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(varchar(1),null),
DESCRIPTION = convert(varchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from
sysobjects o,
syscomments p,
sysusers u
where
(@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type = 'P' /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and ( suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_procedures_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 7.0 version */
create procedure sp_procedures_rowset
(
@procedure_name sysname,
@group_number int = 1,
@procedure_schema sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(nvarchar(1),null),
DESCRIPTION = convert(nvarchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from
sysobjects o,
syscomments p
where
permissions(o.id) <> 0
and o.name = @procedure_name
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type = 'P' /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
and p.number = @group_number
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_procedures_rowset;2
(
@procedure_schema sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(nvarchar(1),null),
DESCRIPTION = convert(nvarchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from sysobjects o, syscomments p
where
permissions(o.id) <> 0
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type = 'P' /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
order by 2, 3
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_procedures_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
create procedure sp_procedures_rowset
(
@procedure_name sysname,
@group_number int = 1,
@procedure_schema sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(nvarchar(1),null),
DESCRIPTION = convert(nvarchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from
sysobjects o,
syscomments p
where
permissions(o.id) <> 0
and o.name = @procedure_name
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
and p.number = @group_number
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_procedures_rowset;2
(
@procedure_schema sysname = null
)
as
select
PROCEDURE_CATALOG = db_name(),
PROCEDURE_SCHEMA = user_name(o.uid),
PROCEDURE_NAME = convert(nvarchar(134),o.name +';'+ ltrim(str(p.number,5))),
PROCEDURE_TYPE = convert(smallint, 3 /*DB_PT_FUNCTION*/),
PROCEDURE_DEFINITION = convert(nvarchar(1),null),
DESCRIPTION = convert(nvarchar(1),null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from sysobjects o, syscomments p
where
permissions(o.id) <> 0
and (@procedure_schema is null or @procedure_schema = user_name(o.uid))
and o.type in ('P', 'FN', 'TF', 'IF') /* Object type of Procedure */
and p.colid = 1
and p.id = o.id
order by 2, 3
go
grant execute on sp_procedures_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_procedures_rowset' and type = 'P '))
begin
drop procedure sp_procedures_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_schemata_rowset'
go
/* 6.0 and 6.5 and 7.0 version */
create procedure sp_schemata_rowset
(
@schema_name varchar(90) = null,
@schema_owner varchar(90) = null
)
as
select distinct
CATALOG_NAME = db_name(),
SCHEMA_NAME = user_name(o.uid),
SCHEMA_OWNER = user_name(o.uid),
DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,'master'),
DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,'dbo'),
DEFAULT_CHARACTER_SET_NAME = convert(sysname,a_cha.name)
from
sysobjects o,
master.dbo.sysconfigures cfg,
master.dbo.syscharsets a_cha, /* charset/1001, not sortorder */
master.dbo.syscharsets b_cha /* sortorder/2001, not charset */
where
(@schema_name is null or @schema_name = user_name(o.uid))
and (@schema_owner is null or @schema_owner = user_name(o.uid))
and a_cha.type = 1001 /* type is charset */
and b_cha.type = 2001 /* type is sortorder */
and a_cha.id = b_cha.csid
and b_cha.id = cfg.value
order by 2
go
dump tran master with no_log
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_schemata_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
create procedure sp_schemata_rowset
(
@schema_name sysname = null,
@schema_owner sysname = null
)
as
select distinct
CATALOG_NAME = db_name(),
SCHEMA_NAME = user_name(o.uid),
SCHEMA_OWNER = user_name(o.uid),
DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,N'master'),
DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,N'dbo'),
DEFAULT_CHARACTER_SET_NAME = convert(sysname,a_cha.name)
from
sysobjects o,
master.dbo.syscharsets a_cha /* charset/1001, not sortorder */
where
(@schema_name is null or @schema_name = user_name(o.uid))
and (@schema_owner is null or @schema_owner = user_name(o.uid))
and a_cha.type = 1001 /* type is charset */
and a_cha.id = convert(tinyint, DatabasePropertyEx(db_name(), 'sqlcharset')) /* what is charset of a table? */
order by 2
go
dump tran master with no_log
go
/* The following stored procedure is used for Sphinx and Hydra */
create procedure sp_schemata_rowset;3
as
select
CATALOG_NAME = convert(sysname,' '),
SCHEMA_NAME = convert(sysname,' '),
SCHEMA_OWNER = convert(sysname,' '),
DEFAULT_CHARACTER_SET_CATALOG = convert(sysname,' '),
DEFAULT_CHARACTER_SET_SCHEMA = convert(sysname,' '),
DEFAULT_CHARACTER_SET_NAME = convert(sysname,' ')
where 1=0
go
grant execute on sp_schemata_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_schemata_rowset' and type = 'P '))
begin
drop procedure sp_schemata_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_statistics_rowset'
go
/* 6.0 and 6.5 version */
create procedure sp_statistics_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null
)
as
select db_name() as TABLE_CATALOG,
user_name(o.uid) as TABLE_SCHEMA,
o.name as TABLE_NAME,
x.rows as CARDINALITY
from sysobjects o, sysindexes x, sysusers u
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and x.id = o.id
and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_statistics_rowset;2
(
@table_schema varchar(255) = null
)
as
select db_name() as TABLE_CATALOG,
user_name(o.uid) as TABLE_SCHEMA,
o.name as TABLE_NAME,
x.rows as CARDINALITY
from sysobjects o, sysindexes x, sysusers u
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and x.id = o.id
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 2, 3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_statistics_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* 8.0 version */
create procedure sp_statistics_rowset
(
@table_name sysname,
@table_schema sysname = null
)
as
select db_name() as TABLE_CATALOG,
user_name(o.uid) as TABLE_SCHEMA,
o.name as TABLE_NAME,
x.rows as CARDINALITY
from sysobjects o, sysindexes x
where o.type in ('U')
and o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and x.id = o.id
and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */
and permissions(o.id) <> 0
order by 2, 3
go
dump tran master with no_log
go
create procedure sp_statistics_rowset;2
(
@table_schema sysname = null
)
as
select db_name() as TABLE_CATALOG,
user_name(o.uid) as TABLE_SCHEMA,
o.name as TABLE_NAME,
x.rows as CARDINALITY
from sysobjects o, sysindexes x
where o.type in ('U')
and (@table_schema is null or @table_schema = user_name(o.uid))
and x.id = o.id
and x.indid in (0,1) /*If there are no indexes then table stats are in a row with indid =0 */
and permissions(o.id) <> 0
order by 2, 3
go
grant execute on sp_statistics_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_statistics_rowset' and type = 'P '))
begin
drop procedure sp_statistics_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_tables_rowset'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_tables_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int,null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from sysusers u, sysobjects o
where o.type in ('U','V','S')
and o.name = @table_name
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_rowset;2
(
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int,null),
DATE_CREATED = o.crdate,
DATE_MODIFIED = convert(datetime,null)
from sysusers u, sysobjects o
where o.type in ('U','V','S')
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_tables_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_tables_rowset
(
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(uid),
TABLE_NAME = name,
TABLE_TYPE = convert(nvarchar(30),
case type
when 'U' then
case when ObjectProperty(id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int,null),
DATE_CREATED = crdate,
DATE_MODIFIED = convert(datetime,null)
from sysobjects
where name = @table_name
and type in ('U','V','S')
and permissions(id) <> 0
) as o
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_rowset;2
(
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(uid),
TABLE_NAME = name,
TABLE_TYPE = convert(nvarchar(30),
case type
when 'U' then
case when ObjectProperty(id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int,null),
DATE_CREATED = crdate,
DATE_MODIFIED = convert(datetime,null)
from sysobjects
where type in ('U','V','S')
and permissions(id) <> 0
) as o
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null,
@table_type sysname = null
)
as
select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
TABLE_TYPE,
TABLE_GUID,
DESCRIPTION
-- TABLE_PROPID,
-- DATE_CREATED,
-- DATE_MODIFIED
from master.dbo.SYSREMOTE_TABLES <
@table_server,
@table_catalog,
@table_schema,
@table_name,
@table_type >
order by 4,1,2,3
go
grant execute on sp_tables_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_tables_rowset' and type = 'P '))
begin
drop procedure sp_tables_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_tables_info_rowset'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_tables_info_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int, null)
from sysusers u,
sysobjects o,
sysindexes x
where o.type in ('U','V','S')
and o.name = @table_name
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and o.id *= x.id
and x.indid in (0,1)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset;2
(
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int, null)
from sysusers u,
sysobjects o,
sysindexes x
where o.type in ('U','V','S')
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and o.id *= x.id
and x.indid in (0,1)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_tables_info_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 server */
create procedure sp_tables_info_rowset
(
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.name = @table_name
and o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset;2
(
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_tables_info_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_tables_info_rowset
(
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.name = @table_name
and o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset;2
(
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 19 /*DBTYPE_UI4 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 4),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
grant execute on sp_tables_info_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_tables_info_rowset' and type = 'P '))
begin
drop procedure sp_tables_info_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_tables_info_rowset_64'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_tables_info_rowset_64
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int, null)
from sysusers u,
sysobjects o,
sysindexes x
where o.type in ('U','V','S')
and o.name = @table_name
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and o.id *= x.id
and x.indid in (0,1)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset_64;2
(
@table_schema varchar(255) = null,
@table_type varchar(255) = null
)
as
select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(varchar(30),
case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end),
TABLE_GUID = convert(binary(16), null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(varchar(1), null),
TABLE_PROPID = convert(int, null)
from sysusers u,
sysobjects o,
sysindexes x
where o.type in ('U','V','S')
and ( @table_schema is null
or @table_schema = user_name(o.uid)
)
and (
@table_type is null
or @table_type = case o.type
when 'U' then 'TABLE'
when 'V' then 'VIEW'
when 'S' then 'SYSTEM TABLE'
end
)
and o.id *= x.id
and x.indid in (0,1)
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ( (select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* join to correlate with all rows in sysobjects */
where p.id = o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid = u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by 4, 2, 3
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_tables_info_rowset_64
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 7.0 server */
create procedure sp_tables_info_rowset_64
(
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.name = @table_name
and o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset_64;2
(
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(int, o.schema_ver),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
if (charindex('8.00', @@version) > 0)
drop procedure sp_tables_info_rowset_64
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_tables_info_rowset_64
(
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.name = @table_name
and o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
dump tran master with no_log
go
create procedure sp_tables_info_rowset_64;2
(
@table_schema sysname = null,
@table_type nvarchar(255) = null
)
as
select *
from (select TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
TABLE_TYPE = convert(nvarchar(30),
case o.type
when 'U' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'TABLE' else N'SYSTEM TABLE' end
when 'S' then N'SYSTEM TABLE'
when 'V' then
case when ObjectProperty(o.id, 'IsMSShipped') = 0
then N'VIEW' else N'SYSTEM VIEW' end
end),
TABLE_GUID = convert(uniqueidentifier, null),
BOOKMARKS = convert(bit, 1),
BOOKMARK_TYPE = convert(int, 1 /*DBPROPVAL_BMK_NUMERIC*/),
BOOKMARK_DATATYPE = convert(smallint, 21 /*DBTYPE_UI8 */),
BOOKMARK_MAXIMUM_LENGTH = convert(int, 8),
BOOKMARK_INFORMATION = convert(int, 0),
TABLE_VERSION = convert(bigint, ObjectPropertyEx(o.id, 'objectversion')),
CARDINALITY = x.rows,
DESCRIPTION = convert(nvarchar(1), null),
TABLE_PROPID = convert(int, null)
from sysobjects o left join sysindexes x on o.id = x.id and x.indid in (0,1)
where o.type in ('U','V','S')
and permissions(o.id) <> 0) as t
where (@table_schema is null or @table_schema = TABLE_SCHEMA)
and (@table_type is null or @table_type = TABLE_TYPE)
order by 4, 2, 3
go
grant execute on sp_tables_info_rowset_64 to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_tables_info_rowset_64' and type = 'P '))
begin
drop procedure sp_tables_info_rowset_64
dump tran master with no_log
end
end
go
print ''
print 'creating sp_table_constraints_rowset'
go
/* Procedure for 6.50 and earlier servers */
create procedure sp_table_constraints_rowset
(
@table_name varchar(255),
@table_schema varchar(255) = null,
@table_catalog varchar(255) = null,
@constraint_name varchar(255) = null,
@constraint_schema varchar(255) = null,
@constraint_catalog varchar(255) = null,
@constraint_type varchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_TYPE = case (c.status & 0xf)
when 1 then 'PRIMARY KEY'
when 2 then 'UNIQUE'
when 3 then 'FOREIGN KEY'
when 4 then 'CHECK'
end,
IS_DEFERRABLE = convert(tinyint, 0),
INITIALLY_DEFERRED = convert(tinyint, 0),
DESCRIPTION = convert(varchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c
where
t_obj.name = @table_name
and t_obj.type in ('U','S')
and (@table_catalog is null or @table_catalog = db_name())
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c.id = t_obj.id
and (c.status & 0xf) between 1 and 4
and c_obj.id = c.constid
and c_obj.uid = user_id()
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_catalog is null or @constraint_catalog = db_name())
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and (@constraint_type is null
or (c.status & 0xf)
= case @constraint_type
when 'PRIMARY KEY' then 1
when 'UNIQUE' then 2
when 'FOREIGN KEY' then 3
when 'CHECK' then 4
end)
order by 2,3,5,6,7
go
dump tran master with no_log
go
create procedure sp_table_constraints_rowset;2
(
@table_schema varchar(255) = null,
@table_catalog varchar(255) = null,
@constraint_name varchar(255) = null,
@constraint_schema varchar(255) = null,
@constraint_catalog varchar(255) = null,
@constraint_type varchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_TYPE = case (c.status & 0xf)
when 1 then 'PRIMARY KEY'
when 2 then 'UNIQUE'
when 3 then 'FOREIGN KEY'
when 4 then 'CHECK'
end,
IS_DEFERRABLE = convert(tinyint, 0),
INITIALLY_DEFERRED = convert(tinyint, 0),
DESCRIPTION = convert(varchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c
where
t_obj.type in ('U','S')
and (@table_catalog is null or @table_catalog = db_name())
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c.id = t_obj.id
and (c.status & 0xf) between 1 and 4
and c_obj.id = c.constid
and c_obj.uid = user_id()
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_catalog is null or @constraint_catalog = db_name())
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and (@constraint_type is null
or (c.status & 0xf)
= case @constraint_type
when 'PRIMARY KEY' then 1
when 'UNIQUE' then 2
when 'FOREIGN KEY' then 3
when 'CHECK' then 4
end)
order by 2,3,5,6,7
go
dump tran master with no_log
go
if (charindex('7.00', @@version) > 0 or
charindex('8.00', @@version) > 0)
drop procedure sp_table_constraints_rowset
else
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create procedure sp_table_constraints_rowset
(
@table_name sysname,
@table_schema sysname = null,
@table_catalog sysname = null,
@constraint_name sysname = null,
@constraint_schema sysname = null,
@constraint_catalog sysname = null,
@constraint_type nvarchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_TYPE = case (c.status & 0xf)
when 1 then N'PRIMARY KEY'
when 2 then N'UNIQUE'
when 3 then N'FOREIGN KEY'
when 4 then N'CHECK'
end,
IS_DEFERRABLE = convert(bit, 0),
INITIALLY_DEFERRED = convert(bit, 0),
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c
where
t_obj.name = @table_name
and t_obj.type in ('U','S')
and (@table_catalog is null or @table_catalog = db_name())
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c.id = t_obj.id
and (c.status & 0xf) between 1 and 4
and c_obj.id = c.constid
and c_obj.uid = user_id()
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_catalog is null or @constraint_catalog = db_name())
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and (@constraint_type is null
or (c.status & 0xf)
= case @constraint_type
when N'PRIMARY KEY' then 1
when N'UNIQUE' then 2
when N'FOREIGN KEY' then 3
when N'CHECK' then 4
end)
order by 2,3,5,6,7
go
dump tran master with no_log
go
create procedure sp_table_constraints_rowset;2
(
@table_schema sysname = null,
@table_catalog sysname = null,
@constraint_name sysname = null,
@constraint_schema sysname = null,
@constraint_catalog sysname = null,
@constraint_type nvarchar(255) = null
)
as
select
CONSTRAINT_CATALOG = db_name(),
CONSTRAINT_SCHEMA = user_name(c_obj.uid),
CONSTRAINT_NAME = c_obj.name,
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(t_obj.uid),
TABLE_NAME = t_obj.name,
CONSTRAINT_TYPE = case (c.status & 0xf)
when 1 then N'PRIMARY KEY'
when 2 then N'UNIQUE'
when 3 then N'FOREIGN KEY'
when 4 then N'CHECK'
end,
IS_DEFERRABLE = convert(bit, 0),
INITIALLY_DEFERRED = convert(bit, 0),
DESCRIPTION = convert(nvarchar(1), null)
from
sysobjects c_obj, sysobjects t_obj, sysconstraints c
where
t_obj.type in ('U','S')
and (@table_catalog is null or @table_catalog = db_name())
and (@table_schema is null or @table_schema = user_name(t_obj.uid))
and c.id = t_obj.id
and (c.status & 0xf) between 1 and 4
and c_obj.id = c.constid
and c_obj.uid = user_id()
and (@constraint_name is null or c_obj.name = @constraint_name)
and (@constraint_catalog is null or @constraint_catalog = db_name())
and (@constraint_schema is null or @constraint_schema = user_name(c_obj.uid))
and (@constraint_type is null
or (c.status & 0xf)
= case @constraint_type
when N'PRIMARY KEY' then 1
when N'UNIQUE' then 2
when N'FOREIGN KEY' then 3
when N'CHECK' then 4
end)
order by 2,3,5,6,7
go
dump tran master with no_log
grant execute on sp_table_constraints_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_table_constraints_rowset' and type = 'P '))
begin
drop procedure sp_table_constraints_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_table_privileges_rowset'
go
/* Procedure for 6.0 and 6.5 server */
CREATE PROCEDURE sp_table_privileges_rowset
(
@table_name varchar(255) = null,
@table_schema varchar(255) = null,
@grantor varchar(255) = null,
@grantee varchar(255) = null
)
as
IF @table_name is not null
BEGIN
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and o.type in ('U','V','S')
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and o.type in ('U','V','S')
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
END
ELSE
BEGIN
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
END
go
dump tran master with no_log
go
CREATE PROCEDURE sp_table_privileges_rowset;2
(
@handle int output,
@scrollopt int output,
@ccopt int output,
@rows int output,
@table_name varchar(255) = null,
@table_schema varchar(255) = null,
@grantor varchar(255) = null,
@grantee varchar(255) = null
)
as
declare @ret int
SET NOCOUNT ON
create table #sptprivsrowset1
(
GRANTOR sysname not null,
GRANTEE sysname not null,
TABLE_CATALOG sysname not null,
TABLE_SCHEMA sysname not null,
TABLE_NAME sysname not null,
PRIVILEGE_TYPE sysname not null,
IS_GRANTABLE bit not null
)
IF @table_name is not null
BEGIN
insert into #sptprivsrowset1
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and o.type in ('U','V','S')
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and o.type in ('U','V','S')
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
END
ELSE
BEGIN
insert into #sptprivsrowset1
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case p.action
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups */
and ((p.uid = u.uid and u.uid <> u.gid) or (p.uid = u.gid and u.uid <> u.gid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(varchar(30),
case v.number
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
else 'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
END
exec @ret = sp_cursoropen @handle output, 'select * from #sptprivsrowset1',
@scrollopt output, @ccopt output, @rows output
drop table #sptprivsrowset1
return isnull(@ret,0)
go
dump tran master with no_log
go
CREATE PROCEDURE sp_table_privileges_rowset;3
as
select
GRANTOR = convert(sysname, ' '),
GRANTEE = convert(sysname, ' '),
TABLE_CATALOG = convert(sysname, ' '),
TABLE_SCHEMA = convert(sysname, ' '),
TABLE_NAME = convert(sysname, ' '),
PRIVILEGE_TYPE = convert(varchar(30), ' '),
IS_GRANTABLE = convert(bit, 0)
where 1=0
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_table_privileges_rowset
go
/* Procedure for 8.0 server */
CREATE PROCEDURE sp_table_privileges_rowset
(
@table_name sysname,
@table_schema sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(nvarchar(30),
case p.action
when 193 then N'SELECT'
when 195 then N'INSERT'
when 196 then N'DELETE'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, sysmembers m
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and o.type in ('U','V','S')
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups - AKUNDONE: only 1 level of grp unrolling. */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(nvarchar(30),
case v.number
when 193 then N'SELECT'
when 195 then N'INSERT'
when 196 then N'DELETE'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.name = @table_name
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and o.type in ('U','V','S')
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
go
dump tran master with no_log
go
CREATE PROCEDURE sp_table_privileges_rowset;2
(
@table_schema sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR = user_name(p.grantor),
GRANTEE = user_name(u.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(nvarchar(30),
case p.action
when 193 then N'SELECT'
when 195 then N'INSERT'
when 196 then N'DELETE'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,case when p.protecttype = 205 then 0 else 1 end)
from
sysprotects p, sysobjects o, sysusers u, sysmembers m
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(u.uid))
and p.id = o.id
and (@grantor is null or @grantor = user_name(p.grantor))
/* expand groups - AKUNDONE: only 1 level of grp unrolling. */
and (u.uid > 0 and u.uid < 16384)
and ((p.uid = u.uid) or (p.uid = m.groupuid and u.uid = m.memberuid))
and p.protecttype <> 206 /* only grant rows */
and p.action in (26,193,195,196,197)
and o.uid <> u.uid /* no rows for owner */
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = p.action
and p1.id = p.id
and p1.uid = u.uid)
union
select /* Add rows for table owner */
GRANTOR = user_name(u.uid),
GRANTEE = user_name(o.uid),
TABLE_CATALOG = db_name(),
TABLE_SCHEMA = user_name(o.uid),
TABLE_NAME = o.name,
PRIVILEGE_TYPE = convert(nvarchar(30),
case v.number
when 193 then N'SELECT'
when 195 then N'INSERT'
when 196 then N'DELETE'
when 197 then N'UPDATE'
else N'REFERENCES'
end),
IS_GRANTABLE = convert(bit,1)
from
sysobjects o, master.dbo.spt_values v, sysusers u
where
o.type in ('U','V','S')
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@grantee is null or @grantee = user_name(o.uid))
and u.uid = 1 /* grantor is dbo of database */
and (@grantor is null or @grantor = user_name(u.uid))
and v.type = 'P' /* cross product to get all exposed privileges */
and v.number in (26,193,195,196,197)
and not exists ( /* exclude revoke'd privileges */
select *
from sysprotects p1
where p1.protecttype = 206
and p1.action = v.number
and p1.id = o.id
and p1.uid = o.uid)
order by 4,5,6,1,2
go
dump tran master with no_log
go
create procedure sp_table_privileges_rowset;5
(
@table_server sysname,
@table_catalog sysname = null,
@table_name sysname = null,
@table_schema sysname = null,
@grantor sysname = null,
@grantee sysname = null
)
as
select
GRANTOR,
GRANTEE,
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
PRIVILEGE_TYPE,
IS_GRANTABLE
from master.dbo.SYSREMOTE_TABLE_PRIVILEGES <
@table_server,
@table_catalog,
@table_schema,
@table_name,
@grantor,
@grantee >
order by 3,4,5,6,1,2
go
grant execute on sp_table_privileges_rowset to public
go
dump tran master with no_log
go
if (charindex('6.00', @@version) > 0)
begin
if (exists (select * from sysobjects
where name = 'sp_table_privileges_rowset' and type = 'P '))
begin
drop proc sp_table_privileges_rowset
dump tran master with no_log
end
end
go
print ''
print 'creating sp_linkedservers_rowset'
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.0 server */
create proc sp_linkedservers_rowset
(
@srvname sysname
)
as
select
SVR_NAME = srvname,
SVR_PRODUCT = srvproduct,
SVR_PROVIDERNAME = providername,
SVR_DATASOURCE = datasource,
SVR_PROVIDERSTRING = case when is_srvrolemember('sysadmin') = 1 then providerstring else NULL end,
SVR_LOCATION = location,
SVR_CATALOG = catalog
from master.dbo.sysservers
where srvname = @srvname and (srvstatus & 128) = 128
order by 1
go
create proc sp_linkedservers_rowset;2
as
select
SVR_NAME = srvname,
SVR_PRODUCT = srvproduct,
SVR_PROVIDERNAME = providername,
SVR_DATASOURCE = datasource,
SVR_PROVIDERSTRING = case when is_srvrolemember('sysadmin') = 1 then providerstring else NULL end,
SVR_LOCATION = location,
SVR_CATALOG = catalog
from master.dbo.sysservers
where (srvstatus & 128) = 128
order by 1
go
grant execute on sp_linkedservers_rowset to public
go
dump tran master with no_log
go
print ''
print 'creating sp_table_statistics_rowset'
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.00 SQL Server.'
print 'Ignore the following errors.'
end
go
/* Procedure for 8.00 server */
create proc sp_table_statistics_rowset
as
select
TABLE_CATALOG = convert(sysname, null),
TABLE_SCHEMA = convert(sysname, null),
TABLE_NAME = convert(sysname, null),
STATISTICS_CATALOG = convert(sysname, null),
STATISTICS_SCHEMA = convert(sysname, null),
STATISTICS_NAME = convert(sysname, null),
STATISTICS_TYPE = convert(smallint,0),
COLUMN_NAME = convert(sysname, null),
COLUMN_GUID = convert(uniqueidentifier, null),
COLUMN_PROPID = convert(int, null),
ORDINAL_POSITION = convert(int, null),
SAMPLE_PCT = convert(smallint, null),
LAST_UPDATE_TIME = convert(datetime, null),
NO_OF_RANGES = convert(int, null),
COLUMN_CARDINALITY = convert(bigint, null),
TUPLE_CARDINALITY = convert(bigint, null),
TABLE_CARDINALITY = convert(bigint, null),
AVG_COLUMN_LENGTH = convert(int, null)
where 1=0
go
dump tran master with no_log
go
create proc sp_table_statistics_rowset;2
(@table_catalog sysname = null,
@table_schema sysname = null,
@table_name sysname = null,
@stat_catalog sysname = null,
@stat_schema sysname = null,
@stat_name sysname = null)
as
begin
set nocount on
-- check in parameters
if ((@table_catalog is not null) and (db_name() <> @table_catalog)
or (@stat_catalog is not null) and (db_name() <> @stat_catalog))
begin /* If qualifier doesn't match current database */
raiserror 20001 '~~Rush_5~~'
return
end
--- create temp table
create table #spstattab(
tblcatalog sysname collate database_default not null,
tblschema sysname collate database_default not null,
tblname sysname collate database_default not null,
statname sysname collate database_default not null
)
insert into #spstattab
select
db_name(),
user_name(o.uid),
o.name,
x.name
from sysobjects o, sysindexes x
where o.type in ('U')
and (@table_name is null or o.name = @table_name)
and (@table_schema is null or @table_schema = user_name(o.uid))
and (@stat_name is null or @stat_name = x.name)
and (@stat_schema is null or @stat_schema = user_name(o.uid))
and x.id = o.id
and permissions(o.id) <> 0
and x.statblob is not null
order by 1,2,3,4
-- fast forward CURSOR OVER THE temp TABLE
declare ff_csr cursor fast_forward for
select tblcatalog, tblschema, tblname, statname from #spstattab
declare @tblcatalog sysname,
@tblschema sysname,
@tblname sysname,
@statname sysname,
@qtbl nvarchar(4000),
@rowsetcount int
set @rowsetcount = 0
open ff_csr
fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname
while @@fetch_status >= 0
begin
set @rowsetcount = @rowsetcount + 1
set @qtbl = @tblcatalog + '.' + @tblschema + '.' + @tblname
dbcc show_statistics(@qtbl, @statname) with stat_header join density_vector
fetch ff_csr into @tblcatalog, @tblschema, @tblname, @statname
end
close ff_csr
deallocate ff_csr
--- drop temp table
drop table #spstattab
if @rowsetcount = 0
begin
select
TABLE_CATALOG = convert(sysname, null),
TABLE_SCHEMA = convert(sysname, null),
TABLE_NAME = convert(sysname, null),
STATISTICS_CATALOG = convert(sysname, null),
STATISTICS_SCHEMA = convert(sysname, null),
STATISTICS_NAME = convert(sysname, null),
STATISTICS_TYPE = convert(smallint,0),
COLUMN_NAME = convert(sysname, null),
COLUMN_GUID = convert(uniqueidentifier, null),
COLUMN_PROPID = convert(int, null),
ORDINAL_POSITION = convert(int, null),
SAMPLE_PCT = convert(smallint, null),
LAST_UPDATE_TIME = convert(datetime, null),
NO_OF_RANGES = convert(int, null),
COLUMN_CARDINALITY = convert(bigint, null),
TUPLE_CARDINALITY = convert(bigint, null),
TABLE_CARDINALITY = convert(bigint, null),
AVG_COLUMN_LENGTH = convert(int, null)
where 1=0
end
set nocount off
end
go
grant execute on sp_table_statistics_rowset to public
go
dump tran master with no_log
go
print ''
print 'creating sp_oledb_column_constraints'
go
/* Procedure for 6.5 server */
create procedure sp_oledb_column_constraints
(@tblname varchar(225) -- the table to check for constraints
,@colname varchar(225) -- the column to check for constraints
,@dropcnst smallint)
as
begin
-- PRELIM
set nocount on
declare @tblid int -- the object id of the table
,@cnstname varchar(225) -- name of const. currently under consideration
,@cnstid int
,@cnstatus int
,@dbname varchar(30)
-- Create temp table
create table #spcnsttab
(cnst_name varchar(225) NOT NULL)
-- Check to see that the object names are local to the current database.
if @tblname like '%.%.%'
and substring(@tblname, 1, charindex('.', @tblname) - 1) <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end
-- Check to see if the table exists and initialize @objid.
select @tblid = object_id(@tblname)
if @tblid is NULL
begin
select @dbname=db_name()
raiserror(15009,-1,-1,@tblname,@dbname)
return (1)
end
-- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
declare cnst_csr insensitive cursor for
select c.constid, c.status, o.name
from sysconstraints c, sysobjects o
where c.id = @tblid and o.id = c.constid
and ((c.status & 0xf)=1 and (@dropcnst & 16)<> 0
or (c.status & 0xf)=2 and (@dropcnst & 32)<> 0
or (c.status & 0xf)=5 and (@dropcnst & 2)<> 0)
-- ONLY 6.5 sysconstraints objects
for read only
-- Now check out each constraint, figure out its type and keys and
-- save the info in a temporary table that we'll print out at the end.
open cnst_csr
fetch cnst_csr into @cnstid, @cnstatus, @cnstname
while @@fetch_status >= 0
begin
if ((@cnstatus & 0xf) in (1, 2)) ---- primary key, unique
begin
-- get indid
declare @indid smallint
select @indid = indid
from sysindexes
where name = object_name(@cnstid) and id = @tblid
if (@colname = index_col(@tblname, @indid, 1))
and (index_col(@tblname, @indid, 2) is null)
begin
-- ADD TO TABLE
insert into #spcnsttab
values (@cnstname)
end
end
else
if (@cnstatus & 0xf) = 5
begin
if (select col_name(id, colid) from sysconstraints where colid > 0 and constid=@cnstid) = @colname
begin
insert into #spcnsttab
values (@cnstname)
end
end
fetch cnst_csr into @cnstid ,@cnstatus ,@cnstname
end --of major loop
close cnst_csr
deallocate cnst_csr
-- Now print out the contents of the temporary index table.
select 'constraint_name' = cnst_name
from #spcnsttab
drop table #spcnsttab
set nocount off
return (0)
end
go
dump tran master with no_log
go
if (charindex('7.00', @@version) = 0 and
charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 7.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_oledb_column_constraints
go
/* Procedure for 7.0 server */
create procedure sp_oledb_column_constraints
(@tblname nvarchar(776) -- the table to check for constraints
,@colname nvarchar(776) -- the column to check for constraints
,@dropcnst smallint)
as
begin
-- PRELIM
set nocount on
declare @tblid int -- the object id of the table
,@cnstname sysname -- name of const. currently under consideration
,@cnstid int
,@cnsttype character(2)
,@dbname sysname
-- Create temp table
create table #spcnsttab
(cnst_name sysname NOT NULL)
-- Check to see that the object names are local to the current database.
select @dbname = parsename(@tblname,3)
if @dbname is not null and @dbname <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end
-- Check to see if the table exists and initialize @objid.
select @tblid = object_id(@tblname)
if @tblid is NULL
begin
select @dbname=db_name()
raiserror(15009,-1,-1,@tblname,@dbname)
return (1)
end
-- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
declare cnst_csr cursor fast_forward for
select id, xtype, name
from sysobjects
where parent_obj = @tblid
and ((xtype = 'PK' and (@dropcnst & 16)<> 0)
or (xtype = 'UQ' and (@dropcnst & 32)<> 0)
or (xtype = 'D ' and (@dropcnst & 2)<> 0))
-- ONLY 6.5 sysconstraints objects
for read only
-- Now check out each constraint, figure out its type and keys and
-- save the info in a temporary table that we'll print out at the end.
open cnst_csr
fetch cnst_csr into @cnstid, @cnsttype, @cnstname
while @@fetch_status >= 0
begin
if @cnsttype in ('PK','UQ')
begin
-- get indid
declare @indid smallint
select @indid = indid
from sysindexes
where name = object_name(@cnstid) and id = @tblid
if (@colname = index_col(@tblname, @indid, 1))
and (index_col(@tblname, @indid, 2) is null)
begin
-- ADD TO TABLE
insert into #spcnsttab
values (@cnstname)
end
end
else
if (@cnsttype = 'D ')
begin
if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname
begin
insert into #spcnsttab
values (@cnstname)
end
end
fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname
end --of major loop
close cnst_csr
deallocate cnst_csr
-- Now print out the contents of the temporary index table.
select 'constraint_name' = cnst_name
from #spcnsttab
drop table #spcnsttab
set nocount off
return (0)
end
go
if (charindex('8.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 8.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_oledb_column_constraints
go
/* Procedure for 8.0 server */
create procedure sp_oledb_column_constraints
(@tblname nvarchar(776) -- the table to check for constraints
,@colname nvarchar(776) -- the column to check for constraints
,@dropcnst smallint)
as
begin
-- PRELIM
set nocount on
declare @tblid int -- the object id of the table
,@cnstname sysname -- name of const. currently under consideration
,@cnstid int
,@cnsttype character(2)
,@dbname sysname
-- Create temp table
create table #spcnsttab
(cnst_name sysname collate database_default NOT NULL)
-- Check to see that the object names are local to the current database.
select @dbname = parsename(@tblname,3)
if @dbname is not null and @dbname <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end
-- Check to see if the table exists and initialize @objid.
select @tblid = object_id(@tblname)
if @tblid is NULL
begin
select @dbname=db_name()
raiserror(15009,-1,-1,@tblname,@dbname)
return (1)
end
-- STATIC CURSOR OVER THE TABLE'S CONSTRAINTS
declare cnst_csr cursor fast_forward for
select id, xtype, name
from sysobjects
where parent_obj = @tblid
and ((xtype = 'PK' and (@dropcnst & 16)<> 0)
or (xtype = 'UQ' and (@dropcnst & 32)<> 0)
or (xtype = 'D ' and (@dropcnst & 2)<> 0))
-- ONLY 6.5 sysconstraints objects
for read only
-- Now check out each constraint, figure out its type and keys and
-- save the info in a temporary table that we'll print out at the end.
open cnst_csr
fetch cnst_csr into @cnstid, @cnsttype, @cnstname
while @@fetch_status >= 0
begin
if @cnsttype in ('PK','UQ')
begin
-- get indid
declare @indid smallint
select @indid = indid
from sysindexes
where name = object_name(@cnstid) and id = @tblid
if (@colname = index_col(@tblname, @indid, 1))
and (index_col(@tblname, @indid, 2) is null)
begin
-- ADD TO TABLE
insert into #spcnsttab
values (@cnstname)
end
end
else
if (@cnsttype = 'D ')
begin
if (select col_name(@tblid, info) from sysobjects where id=@cnstid) = @colname
begin
insert into #spcnsttab
values (@cnstname)
end
end
fetch cnst_csr into @cnstid ,@cnsttype ,@cnstname
end --of major loop
close cnst_csr
deallocate cnst_csr
-- Now print out the contents of the temporary index table.
select 'constraint_name' = cnst_name
from #spcnsttab
drop table #spcnsttab
set nocount off
return (0)
end
go
grant execute on sp_oledb_column_constraints to public
go
dum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment