我试图通过使用参数动态删除表。我正在编写下面的代码,代码运行成功,但它没有删除表。有人可以帮我这个。
见解是这里的数据库名称。
DECLARE @DQ VARCHAR( MAX )
Declare @DB varchar(256)
SET @db = @Insights
SELECT @DQ='
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'''+ @db + '[tablename]'',N''U''))
DROP TABLE ' + @db + '[tablename]'
EXEC(@DQ)
SELECT @db
此致 拉坦
答案 0 :(得分:2)
DECLARE @TableName SYSNAME;
DECLARE @DBname SYSNAME;
DECLARE @Schema SYSNAME; --<-- I would add this too
DECLARE @Sql NVARCHAR(MAX);
SET @DBname = N'Test_DB';
SET @TableName = N'Test_Table';
SET @Schema = N'dbo';
SET @Sql = N'Use [master]'
+ N'IF OBJECT_ID('''+ QUOTENAME(@DBname)+ '.'+ QUOTENAME(@Schema) +'.' + QUOTENAME(@TableName)+ ''') IS NOT NULL '
+ N'DROP TABLE ' + QUOTENAME(@DBname)+ '.'+ QUOTENAME(@Schema) +'.' + QUOTENAME(@TableName)
PRINT @Sql
-- exec sp_executesql @Sql
答案 1 :(得分:1)
如果在除INSIGHTS之外的其他数据库中运行此代码,则sysobjects查找将无法找到匹配的表名,因此无法删除。 Sysobjects在当前数据库中保存对象......
尝试调整代码以查看INSIGHTS Sysobjects表或确保在INSIGHTS db中运行此代码
看起来您还没有正确构建SQL语句。添加PRINT @DQ语句并将结果包含在上面的问题文本中
答案 2 :(得分:1)
似乎你错过了数据库对象
SELECT @DQ='
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'''+ @db + '.dbo.[TableName] '',N''U''))
BEGIN DROP TABLE ' + @db + '.dbo.[TableName] END'
答案 3 :(得分:0)
你可以这样做:
DECLARE @dq VARCHAR(MAX)
DECLARE @db VARCHAR(256) = 'Databasename'
DECLARE @schema VARCHAR(256) = 'dbo'
DECLARE @tb VARCHAR(256) = 'TableName'
SELECT @dq = '
IF EXISTS (SELECT * FROM ' + @db + '.sys.objects
WHERE object_id = OBJECT_ID(N''' + @db + '.' + @schema + '.' + @tb
+ ''',N''U''))
DROP TABLE ' + @db + '.' + @schema + '.' + @tb
PRINT @dq
EXEC(@dq)
看看我如何检查对象IF EXISTS (SELECT * FROM ' + @db + '.sys.objects
是否存在。同样在drop中,您应该指定模式名称,如果该表在默认模式中,则只需指定双点。 DROP TABLE ' + @db + '..[TableName]'
答案 4 :(得分:0)
尝试这一个,在sys.objects中查找名称下的表名。您可以只使用@db而不是将+ @db放在任何地方,以便SQL知道我们首先要说的是哪个数据库。
DECLARE @DQ VARCHAR( MAX )
Declare @DB varchar(256)
SET @db = @Insights
SELECT @DQ='
USE ' + @db + '
IF EXISTS (SELECT * FROM sys.objects
WHERE name = ''[tablename]'')
DROP TABLE [tablename]'
EXEC(@DQ)
SELECT @db
答案 5 :(得分:0)
我认为您在数据库名称和表名称之间缺少。(点)
尝试下面可能适用的代码
DECLARE @DQ VARCHAR( MAX )
Declare @DB varchar(256)
SET @db = @Insights
SELECT @DQ='
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'''+ @db + '[tablename]'',N''U''))
DROP TABLE ' + @db + '.[tablename]'
EXEC(@DQ)