使用参数动态删除表

时间:2015-02-06 13:48:14

标签: sql sql-server

我试图通过使用参数动态删除表。我正在编写下面的代码,代码运行成功,但它没有删除表。有人可以帮我这个。

见解是这里的数据库名称。

    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 

此致 拉坦

6 个答案:

答案 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)