2010-07-04 76 views
1

如何创建存在于一个数据库中的存储过程,但是针对另一个(任何)数据库运行下面的代码?从SQL Server中的sproc中的另一个数据库获取元数据?

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) 

我得到TABLE_NAME和SCHEMA_NAME成功,但主要的问题是,OBJECTPROPERTY()运行存储过程的数据库的情况下,而不是在@TargetDBName的情况下。所以,OBJECTPROPERTY()将始终返回null,除非@TargetDBName是一样的数据库存储过程的是英寸

我目前使用SQL Server 2008的

回答

1

查询的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 
0

你也可以使用OPENQUERY(see here)?

0

你有没有在你的动态查询使用IDENT_SEED考虑?

这将返回表的标识列的种子值或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 

一个需要注意的考虑查看 对象。

相关问题