我在下面的代码中执行了一个问题:
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
答案 0 :(得分:2)
你对#的使用是错误的。 #TMP
是一个临时表,只能用于建立它的连接。我认为你要找的是##TMP
。
但是如果你需要这样一个临时表,我会建议你做一个合适的表,因为它更容易管理和跟踪,并减少你的tempdb压力。
答案 1 :(得分:0)
首先,您应该将@SQL和@ SQL1声明为固定的最大长度varchar不超过8000(我猜这不是当前MS SQL版本的限制???):
DECLARE @SQL NVARCHAR(1000)
DECLARE @SQL1 NVARCHAR(1000)
然后,在致电()
SP_EXECUTESQL
EXEC SP_EXECUTESQL @SQL
EXEC SP_EXECUTESQL @SQL1
最后你应该在SP_EXECUTESQL
中使用全局临时表## TMP进行INSERT,然后在第一次SP_EXECUTESQL
调用之前使用SELECT or you should declare local #Tmp table
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