Sql 使用参数动态删除表

Sql 使用参数动态删除表,sql,sql-server,Sql,Sql Server,我正在尝试使用参数动态删除该表。我正在编写下面的代码,代码正在成功运行,但没有删除表。有人能帮我一下吗 Insights是此处的数据库名称 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''

我正在尝试使用参数动态删除该表。我正在编写下面的代码,代码正在成功运行,但没有删除表。有人能帮我一下吗

Insights是此处的数据库名称

    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 
问候,,
Ratan

如果在INSIGHTS以外的其他数据库中运行此代码,sysobjects查找将无法找到匹配的表名,因此不会删除。Sysobjects保存当前数据库中的对象

尝试调整代码以查看INSIGHTS Sysobjects表,或者确保在INSIGHTS db中运行此代码


看起来您没有正确构造SQL语句。添加PRINT@DQ语句并将结果包含在上面的问题文本中

如果在INSIGHTS以外的其他数据库中运行此代码,sysobjects查找将无法找到匹配的表名,因此不会删除。Sysobjects保存当前数据库中的对象

尝试调整代码以查看INSIGHTS Sysobjects表,或者确保在INSIGHTS db中运行此代码


看起来您没有正确构造SQL语句。添加PRINT@DQ语句,并将结果包含在上面的问题文本中

似乎缺少数据库对象

 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'

似乎缺少数据库对象

 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'
你可以这样做:

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)
看看我是如何检查对象是否存在的,如果存在,请从'+@db+'.sys.objects中选择*。同样,在drop中,您应该指定模式名,或者如果该表处于默认模式中,则只指定双点。删除表格“++@db+”…[TableName]”

您可以像这样做:

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)

看看我是如何检查对象是否存在的,如果存在,请从'+@db+'.sys.objects中选择*。同样,在drop中,您应该指定模式名,或者如果该表处于默认模式中,则只指定双点。删除表“++@db++”…[TableName]”

试试这个,在sys.objects中的name下查找表名。您可以使用@db,而不是将+@db放在任何地方,这样SQL就可以知道我们首先讨论的是哪个db

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 

试试这个,在sys.objects中的name下查找表名。您可以使用@db,而不是将+@db放在任何地方,这样SQL就可以知道我们首先讨论的是哪个db

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 

我想您丢失了。在数据库名和表名之间有一个点

试试下面的代码,它可能适合你

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)

我想您丢失了。在数据库名和表名之间有一个点

试试下面的代码,它可能适合你

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)

此代码假定所有者是dbo。可能是一个安全的假设,但只是一个警告。此代码假设所有者是dbo。可能是一个安全的假设,但只是一个警告。我在表中维护了数据库名称,即Databasename.Dbo.,我只在表中给出了点。请建议。关于,RatanI在表中维护了数据库名称,即Databasename.Dbo.,我只在表中给出了点。请建议。关于这一点,RatanI建议,如果您必须传入一个表名才能删除,那么该过程可能有问题。如果你还想做这样一件危险的事,我会从阿里先生发布的答案开始。这是迄今为止唯一一个不受sql注入影响的答案。我会考虑添加一个不允许被丢弃的表名来保护您的数据,因为这种类型是非常危险的。快速提示-您总是可以做一些像Prime@ DQ之类的事情,看看到底是怎么回事。如果您必须通过一个表名来删除,那么我建议这个过程有问题。如果你还想做这样一件危险的事,我会从阿里先生发布的答案开始。这是迄今为止唯一一个不受sql注入影响的答案。我会考虑添加一个不允许被丢弃的表名来保护您的数据,因为这种类型是非常危险的。快速提示-您总是可以做一些像Prime@ DQ之类的事情,看看什么是真正的错误。嗨,我得到下面的错误,找不到服务器SysServer中的“数据库数据名”。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver将服务器添加到sys.servers。请帮助。@Insights看起来怎么样?它看起来像Databasename.dbo.Hi,我收到以下错误消息:在sys.servers中找不到服务器“Databasename”。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver将服务器添加到sys.servers。请帮忙,@Insights看起来怎么样?它看起来像Databasename.dbo。