Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 在SQL Server的存储过程中从另一个数据库获取元数据?_Tsql_Sql Server 2008_Stored Procedures_Metadata - Fatal编程技术网

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,或者如果调用方 没有查看该文件的权限 反对