1

我在执行以下代码时遇到问题:

DECLARE @CUTOFFDAYS_i INT
DECLARE @SQL NVARCHAR(MAX)
DECLARE @SQL1 NVARCHAR(MAX)

SET @CUTOFFDAYS_i = 750

CREATE TABLE #TMP(
EMPID INT,
EMPNAME VARCHAR(35)
)

SET @SQL = 'SELECT EMPID, EMPNAME INTO #TMP FROM EMPDB..EMPTABLE 
WHERE DATEDIFF(DAY, CREATEDDATE, GETDATE()) > @CUTOFFDAYS_i
AND ERRORMESSAGE = '''''

 SET @SQL1 = 'SELECT * FROM #TMP'

 EXEC SP_EXECUTESQL @SQL
 EXEC SP_EXECUTESQL @SQL1

即使那样我也没有得到任何结果

SELECT * FROM #TMP
4

2 回答 2

2

您对 # 的使用是错误的。#TMP是一个临时表,仅对建立它的连接可用。我想你要找的是##TMP.

但是,如果您需要这样一个临时表,我建议您制作一个合适的表,因为它更容易管理和跟踪,并且对 tempdb 的压力较小。

于 2013-11-06T06:40:28.877 回答
0

首先,您应该将@SQL 和@SQL1 声明为不超过8000 的固定最大长度varchar(我猜这不是当前MS SQL 版本的限制???):

DECLARE @SQL NVARCHAR(1000)
DECLARE @SQL1 NVARCHAR(1000)

那么你不应该()在调用时使用SP_EXECUTESQL

 EXEC SP_EXECUTESQL @SQL
 EXEC SP_EXECUTESQL @SQL1

最后你应该使用全局临时表##TMP in SP_EXECUTESQLfor INSERT 然后选择,或者你应该在第一次调用之前声明本地#Tmp 表SP_EXECUTESQL

DECLARE @CUTOFFDAYS_i INT
DECLARE @SQL NVARCHAR(1000)
DECLARE @SQL1 NVARCHAR(1000)

SET @CUTOFFDAYS_i = 750

SET @SQL = 'SELECT EMPID, EMPNAME INTO ##TMP FROM EMPDB..EMPTABLE 
WHERE DATEDIFF(DAY, CREATEDDATE, GETDATE()) > @CUTOFFDAYS_i
AND ERRORMESSAGE = '''''

 SET @SQL1 = 'SELECT * FROM ##TMP'

 EXEC SP_EXECUTESQL @SQL
 EXEC SP_EXECUTESQL @SQL1
于 2013-11-06T06:42:32.600 回答