0

我正在尝试通过使用临时表 (##TMP) 作为参考从生产表 (EMPTAB) 中删除数据来将数据归档到表 (EMPTAB_Archive) 中。

请注意,临时表包含两个字段:empcode 和 empname,这是来自不工作的存储过程的代码的一部分:

SELECT @SQL =          'DELETE ET1
                        FROM EMPDB..EMPTAB ET1 DELETED.*
                        INTO [EMPDB_ARCHIVE]..EMPTAB_Archive
                        INNER JOIN ##TMP TMP1
                        WHERE EMPID IN ##TMP
                        AND TMP1.DOCUMENTID = ET1 .EMPID'
         EXEC(@SQL)

但我收到以下错误消息

消息 102,级别 15,状态 1,第 2 行“已删除”附近的语法不正确。消息 102,级别 15,状态 1,第 1 行 '##TMP' 附近的语法不正确。

4

2 回答 2

1

问题出在WHERE EMPID IN ##TMP. 你必须使用加入。也删除到也不正确。

WHERE EMPID IN ##TMP必须通过加入来完成。

我认为正确的 SQL 应该如下所示:

SELECT @SQL = 'DELETE ET1 OUTPUT DELETED.* 
INTO [EMPDB_ARCHIVE]..EMPTAB_Archive
FROM EMPDB..EMPTAB ET1 
INNER JOIN ##TMP TMP1 ON 
TMP1.DOCUMENTID = ET1 .EMPID'
EXEC(@SQL)
于 2013-11-06T12:35:55.360 回答
0

此外,您不需要动态 SQL,在这种情况下,动态 SQL 会受到 SQL 注入的影响。只需使用静态 SQL

于 2013-11-06T12:56:34.083 回答