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

Msg 1087, Level 16, State 1, Line 25 Must declare the table variable

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

我试过下面的脚本,但出现了这个错误: 消息 1087,级别 16,状态 1,第 25 行 必须声明 table 变量“@TABLENAME”。

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

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

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

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

或者我的建议是使用 select 将其重写为如下查询,但根据您的 needs/restrictions 这可能不是一个好主意。

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 来完成.