检查来自另一个数据库的 table 是否存在
check existence of a table from a another database
我需要检查来自不同 database.I 的 table 是否存在,知道如何静态执行此操作。但我想动态传递 table 名称和数据库名称。
所以这是预期,
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'
尝试动态查询:
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)
如果您需要 return 来自动态查询的一些值,那么您可以使用 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
您可以通过 sp_executesql
存储过程执行动态 SQL 查询。
它有两个 'main' 输入:@stmt
是存储在 NVARCHAR string
中的查询,@params
是 NVARCHAR string
并定义了附加变量(就像在任何 SP 中一样)。
因此,要检查 return 结果,您应该这样做:
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
我应该在输入所有这些内容之前阅读答案...
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
我需要检查来自不同 database.I 的 table 是否存在,知道如何静态执行此操作。但我想动态传递 table 名称和数据库名称。
所以这是预期,
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'
尝试动态查询:
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)
如果您需要 return 来自动态查询的一些值,那么您可以使用 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
您可以通过 sp_executesql
存储过程执行动态 SQL 查询。
它有两个 'main' 输入:@stmt
是存储在 NVARCHAR string
中的查询,@params
是 NVARCHAR string
并定义了附加变量(就像在任何 SP 中一样)。
因此,要检查 return 结果,您应该这样做:
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
我应该在输入所有这些内容之前阅读答案...
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