执行SQL过程的问题

时间:2013-11-06 05:15:03

标签: sql-server-2008 syntax-error procedure

我在下面的代码中执行了一个问题:

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

2 个答案:

答案 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