我正在创建一个存储过程,在其中我创建了一个新表,它在创建时将两个变量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
答案 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来完成。