【问题标题】:SQL Server : error assigned name to a local variable [duplicate]SQL Server:错误为局部变量分配名称[重复]
【发布时间】:2020-07-03 08:16:55
【问题描述】:

我在将数据库名称分配给变量时遇到问题。当我这样做时,我会收到一条消息,指出没有这样的数据库。

我做错了什么,这个脚本不起作用?

DECLARE @db_name varchar(10) 
SET @db_name = 'xxx'

ALTER TABLE [@db_name].[dbo].[Table_Name] 
    DROP CONSTRAINT [Constraint_Name]
GO

ALTER TABLE [@db_name].[dbo].[Table_Name] WITH CHECK 
    ADD CONSTRAINT [Constraint_Name] CHECK (QUERY)
GO

ALTER TABLE [@db_name].[dbo].[Table_Name] CHECK CONSTRAINT [Constraint_Name]
GO

我收到此错误消息:

消息 2702,第 16 级,状态 2,第 5 行
数据库“@db_name”不存在。

消息 2702,第 16 级,状态 2,第 8 行
数据库“@db_name”不存在。

消息 2702,第 16 级,状态 2,第 11 行
数据库“@db_name”不存在。

【问题讨论】:

  • 你的表名是什么?
  • 表的名称为 BigBookEntry。不过,倒是像调用表一样,没关系。

标签: sql sql-server


【解决方案1】:

例如,假设您有一个这样创建的表:

create table xxx(id int
                 CONSTRAINT AK_TransactionID UNIQUE(id))

然后您需要创建两个变量(一个用于对象名称,一个用于要执行的查询...):

DECLARE @db_name varchar(10) ;
DECLARE @query nvarchar(500) ;

将它们设置为您需要的值:

SET @db_name = 'xxx';
set @query = 'ALTER TABLE ['+ @db_name +' ] DROP CONSTRAINT [AK_TransactionID]';

然后执行查询:

EXEC sp_executesql @query;

Here is a demo

【讨论】:

    【解决方案2】:

    查询 - 意思是每个 GO 命令之前的所有文本 - 在运行之前被编译

    查询中的数据库名称必须在编译时知道,因为查询编译器会检查数据库+您指定的任何表或列以查看它们是否有效。

    这意味着数据库名 + 表名 + 列名都不能来自@-变量,因为在编译时变量还不存在并且没有价值。

    解决方法是使用动态 SQL:

    DECLARE @db_name varchar(10) = 'xxx'
    DECLARE @sql varchar(1000) = 'ALTER TABLE [' + @db_name + '].[dbo].[Table_Name] DROP CONSTRAINT [Constraint_Name]'
    
    EXEC (@sql)
    

    【讨论】:

      【解决方案3】:

      不幸的是,在 SQL Server 中,您不能将架构、数据库、表或列名作为参数传递 - 如果您想这样做,您必须使用动态 SQL。您可以执行以下操作来实现此目的:

      DECLARE @db_name VARCHAR(MAX)
      DECLARE @SQL VARCHAR(MAX)
      SET @db_name = [xxx]
      
      SET @SQL = 'ALTER TABLE' + @db_name+ '.[dbo].[Table_Name] DROP CONSTRAINT [Constraint_Name]'
      EXEC (@SQL)
      
      SET @SQL = 'ALTER TABLE' + @db_name + '.[dbo].[Table_Name]  WITH CHECK ADD  CONSTRAINT [Constraint_Name] CHECK  (QUERY)'
      EXEC (@SQL)
      
      SET @SQL = 'ALTER TABLE' + @db_name + '.[dbo].[Table_Name] CHECK CONSTRAINT [Constraint_Name]'
      EXEC (@SQL)
      

      【讨论】:

        猜你喜欢
        • 2016-10-09
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        相关资源
        最近更新 更多