Tsql 在SQL Server的存储过程中从另一个数据库获取元数据?
如何创建一个存储过程,该存储过程存在于一个数据库中,但对另一个(任何)数据库运行以下代码Tsql 在SQL Server的存储过程中从另一个数据库获取元数据?,tsql,sql-server-2008,stored-procedures,metadata,Tsql,Sql Server 2008,Stored Procedures,Metadata,如何创建一个存储过程,该存储过程存在于一个数据库中,但对另一个(任何)数据库运行以下代码 SET @sql1 = N'INSERT INTO #Tables SELECT' + N' t.TABLE_NAME as TableName' + N',t.TABLE_SCHEMA as SchemaName' + N',(SELECT OBJECTPROPERTY(OBJECT_ID(t.TABLE_SCHEMA + ''.'' + t.T
SET @sql1 = N'INSERT INTO #Tables SELECT'
+ N' t.TABLE_NAME as TableName'
+ N',t.TABLE_SCHEMA as SchemaName'
+ N',(SELECT OBJECTPROPERTY(OBJECT_ID(t.TABLE_SCHEMA + ''.'' + t.TABLE_NAME),''TableHasIdentity'')) '
+ N'FROM ' + QUOTENAME(@TargetDBName)
+ N'.INFORMATION_SCHEMA.TABLES t'
IF @Verbose = 1
PRINT @sql1
EXEC(@sql1)
我成功地获得了表名和模式名,但主要问题是OBJECTPROPERTY()在存储过程数据库的上下文中运行,而不是在@TargetDBName的上下文中运行。因此,OBJECTPROPERTY()将始终返回null,除非@TargetDBName与存储过程所在的数据库相同
我目前使用的是SQL Server 2008。您是否可以改用OPENQUERY()?您是否可以改用OPENQUERY()?像这样直接查询系统视图
SELECT Tbl.name AS TableName, sch.name AS SchemaName,
HasIdentity = CASE WHEN EXISTS (SELECT * FROM your_target_db.sys.columns AS cols WHERE Tbl.object_id = cols.object_id and is_identity = 1) THEN 1 ELSE 0 END
FROM your_target_db.sys.tables AS Tbl INNER JOIN your_target_db.sys.schemas AS SCH ON Tbl.schema_id = Sch.schema_id
像这样直接查询sys视图
SELECT Tbl.name AS TableName, sch.name AS SchemaName,
HasIdentity = CASE WHEN EXISTS (SELECT * FROM your_target_db.sys.columns AS cols WHERE Tbl.object_id = cols.object_id and is_identity = 1) THEN 1 ELSE 0 END
FROM your_target_db.sys.tables AS Tbl INNER JOIN your_target_db.sys.schemas AS SCH ON Tbl.schema_id = Sch.schema_id
您是否考虑过在动态查询中使用
这将返回表标识列的种子值,如果不存在,则返回NULL
例如:
USE master
GO
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE Test1 (ColA INT IDENTITY(100,1))
CREATE TABLE Test2 (ColA INT)
GO
USE master
GO
DECLARE @TargetDBName NVARCHAR(MAX), @sql1 NVARCHAR(MAX)
SET @TargetDBName = 'Test'
SET @sql1 = N'SELECT'
+ N' t.TABLE_NAME as TableName'
+ N',t.TABLE_SCHEMA as SchemaName'
+ N',(SELECT CASE WHEN IDENT_SEED('''
+ QUOTENAME(@TargetDBName) + '.''
+ t.TABLE_SCHEMA + ''.''
+ t.TABLE_NAME) IS NOT NULL THEN 1 ELSE 0 END) as HasIdentity '
+ N'FROM ' + QUOTENAME(@TargetDBName)
+ N'.INFORMATION_SCHEMA.TABLES t'
EXEC(@sql1)
GO
DROP DATABASE Test
GO
结果是:
TableName SchemaName HasIdentity
---------- ----------- -----------
Test1 dbo 1
Test2 dbo 0
您可能需要考虑一个警告:
错误时返回NULL,或者如果调用方
没有查看该文件的权限
反对
您是否考虑过在动态查询中使用
这将返回表标识列的种子值,如果不存在,则返回NULL
例如:
USE master
GO
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE Test1 (ColA INT IDENTITY(100,1))
CREATE TABLE Test2 (ColA INT)
GO
USE master
GO
DECLARE @TargetDBName NVARCHAR(MAX), @sql1 NVARCHAR(MAX)
SET @TargetDBName = 'Test'
SET @sql1 = N'SELECT'
+ N' t.TABLE_NAME as TableName'
+ N',t.TABLE_SCHEMA as SchemaName'
+ N',(SELECT CASE WHEN IDENT_SEED('''
+ QUOTENAME(@TargetDBName) + '.''
+ t.TABLE_SCHEMA + ''.''
+ t.TABLE_NAME) IS NOT NULL THEN 1 ELSE 0 END) as HasIdentity '
+ N'FROM ' + QUOTENAME(@TargetDBName)
+ N'.INFORMATION_SCHEMA.TABLES t'
EXEC(@sql1)
GO
DROP DATABASE Test
GO
结果是:
TableName SchemaName HasIdentity
---------- ----------- -----------
Test1 dbo 1
Test2 dbo 0
您可能需要考虑一个警告:
错误时返回NULL,或者如果调用方
没有查看该文件的权限
反对