【问题标题】:Msg 1087, Level 16, State 1, Line 25 Must declare the table variableMsg 1087, Level 16, State 1, Line 25 必须声明表变量
【发布时间】:2015-04-09 16:34:41
【问题描述】:

我正在创建一个存储过程,并在其中创建一个新表,该表在创建时将两个变量、一个 ID 和 getdate() 附加到表名。即表名_@id_getdate()。所以表名将根据哪个 id 和它运行的日期而改变。我正在使用动态 SQL 执行此操作。然后在创建表之后,我需要从该过程之前创建的临时表中插入记录。(未显示)。由于在创建表之前我不会知道表的名称,因此我尝试使用 @tablename 变量插入。

我尝试了以下脚本并收到此错误: 消息 1087,第 16 层,状态 1,第 25 行 必须声明表变量“@TABLENAME”。

此过程将每隔一天左右运行一次,运行的受影响记录将存储在存储过程执行期间创建的 tablename_@id_getdate() 表中。

还有其他方法可以做到这一点,还是我的语法错误?谢谢你的帮助。

IF EXISTS (SELECT 1 FROM #DUPS2)
BEGIN

DECLARE @TableName NVARCHAR(128)
DECLARE @SQLString NVARCHAR(MAX)
    ,@DATE VARCHAR (10)
    ,@BN SMALLINT

SET @BN = 108       
SET @DATE = CONVERT(VARCHAR(10),GETDATE(),112)

SET @TABLENAME = 'schema.dbo.tableName_' + CAST (@BN AS VARCHAR) +'_'+ @DATE 

SET @SQLString = 'CREATE TABLE '+' '+@TABLENAME+ ' '
        + '( ' + 'BUSINESS_NAME' + ' ' +'VARCHAR(120)' +' '+'NULL,' +
             'CLAIM_ID' + ' ' +'NVARCHAR(120)' +' '+'NULL,' + 
             'CONTACT_ID' + ' ' +'INT' +' '+'NULL,' +
             'COUNT_OF_DUPES' + ' ' +'NVARCHAR(5)' +' '+'NULL' +') ON     [PRIMARY] '


EXEC @SQLString

---TABLE IS CREATED AND NOW WE INSERT RECORDS TO IT

INSERT INTO @TABLENAME  --the table name just created.
SELECT D.*  
FROM #DUPS2 D     --contains duplicate contact records found
 JOIN TABLE1  T1 WITH (NOLOCK)
 ON D.CONTACT_ID = T1.CONTACT_ID
WHERE T1. active_ind = 1 

END

【问题讨论】:

  • 您不能在insert 中使用变量作为表名。您也必须动态构建该查询。

标签: sql sql-server-2008 stored-procedures


【解决方案1】:

正如 Guffa 所说,为了使您的工作正常,您需要将最后一个插入查询更改为与第一个查询一样的动态查询。

或者我的建议是使用 select into 查询重写它,如下所示,但取决于您的需求/限制,这可能不是一个好主意。

SET @SQLString = 'SELECT D.* ' +
                 ' INTO ' + @TABLENAME +  --the table name just created.
                 ' FROM #DUPS2 D ' +    --contains duplicate contact records found
                 ' JOIN TABLE1  T1 WITH (NOLOCK) ' +
                 ' ON D.CONTACT_ID = T1.CONTACT_ID ' +
                 ' WHERE T1. active_ind = 1 '

这确实存在无法获得所需的正确列值类型的风险,但这可以通过在语句的选择部分中的列上使用 CAST 或 CONVERT 来完成。

【讨论】:

  • 感谢 Guffa 和 Zoldren!这行得通!请注意,在我第一次执行时,我收到错误消息 203,级别 16,状态 2,第 73 行(动态 sql....)不是无效标识符。我需要通过 EXEC (@SQLString) 而不是 EXEC @SQLString 不带括号执行。 :)
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多