消息1087,级别16,状态1,行25必须声明表变量

时间:2015-04-09 16:34:42

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

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

我已经尝试了以下脚本并收到此错误: Msg 1087,Level 16,State 1,Line 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

1 个答案:

答案 0 :(得分:0)

正如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 '

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