【问题标题】:check existence of a table from a another database检查另一个数据库中的表是否存在
【发布时间】:2015-04-01 01:02:19
【问题描述】:

我需要检查来自不同数据库的表是否存在。我知道如何静态地执行此操作。但是我想动态传递表名和数据库名。

所以这是期望,

Declare @tablename varchar(100) = 'testtable', @dbName Varchar(100) = 'TestDB',@isexist varchar(100)
If exists (select 1 from @dbName..sysobjects where name = @tablename)
Set @isexists = 'Table Exists' 
Else set @isexists = 'Table do not exist'

【问题讨论】:

  • 您看到任何错误吗?
  • 是的,我遇到了错误。这是我期望的模型。

标签: tsql sql-server-2012 dynamic-sql


【解决方案1】:

尝试动态查询:

Declare @tablename varchar(100) = 'testtable', @dbName Varchar(100) = 'TestDB'

DECLARE @statement NVARCHAR(MAX) = 'If exists (select * from ' + @dbName + '..sysobjects where name = ''' + @tablename + ''')'
+ 'Print ''Table Exists''' +
'Else Print ''Table do not exist'''

EXEC(@statement)

如果您需要从动态查询中返回一些值,那么您可以使用 sp_executesql 和一些输出参数,例如:

Declare @tablename varchar(100) = 'testtable', @dbName Varchar(100) = 'TestDB', @b bit
DECLARE @ParamDefs NVARCHAR(MAX) = '@b BIT OUTPUT'

DECLARE @statement NVARCHAR(MAX) = 'If exists (select * from ' + @dbName + '..sysobjects where name = ''' + @tablename + ''')'
+ 'Set @b = 1' +
' Else Set @b = 0'

EXEC sp_executesql @statement, @ParamDefs, @b OUTPUT

SELECT @b

【讨论】:

  • 它检查.. 但我需要将 ans 存储在一些变量中
【解决方案2】:

您可以通过sp_executesql 存储过程执行动态SQL 查询。

它有两个“主要”输入:@stmt 是存储在 NVARCHAR string@params 中的查询,后者是 NVARCHAR string 并定义了附加变量(就像在任何 SP 中一样)。

所以要检查并返回结果,你应该这样做:

DECLARE
    @DbName sys.sysname = N'YourDatabaseName';

DECLARE
    @TableIsExist BIT = 0
  , @DynamicQuery = N'USE ' + QUOTENAME(@DbName) + '; SET @IsExist CASE WHEN OBJECT_ID(@TableName) IS NULL THEN 0 ELSE 1 END;'


EXEC sp_executesql
    @stmt = @DynamicQuery
  , @params = N' @TableName sys.sysname, @IsExist BIT OUTPUT'
  , @TableName = N'YourTableName', @IsExists = @TableIsExists OUTPUT

【讨论】:

  • 你不需要一辆法拉利去商店买牛奶。 :)
  • @SubqueryCrunch 没错,但如果你想动态地做(如果你不能硬编码数据库名称),你必须使用 ferrari :) 你知道.. 如果你不知道哪个汽车打开小鸡,你必须选择你最好的:)
【解决方案3】:

我应该在输入所有这些内容之前阅读答案...

DECLARE @TableName VARCHAR(100) , 
        @DBName VARCHAR(100) , 
        @Bit BIT ,
        @Parameter NVARCHAR(MAX) = '@Bit BIT OUTPUT'  

DECLARE @SQL NVARCHAR(MAX) =  'IF  EXISTS (SELECT * 
                                             FROM ' + @DBName + '  ..sys.objects 
                                            WHERE object_id = OBJECT_ID ''' + @TableName + ''')'


EXECUTE sp_executesql @SQL, @Parameter, @bit OUTPUT


 SELECT @Bit

【讨论】:

  • 这个检查表中是否有行,而不是表是否存在,这是OP的请求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多