下面是我试图在SQL Server上执行的一段代码。
DECLARE @string NVARCHAR(MAX) = '
CREATE PROC [dbo].[Trend]
@slsID NVARCHAR(20)
AS
BEGIN
SET NOCOUNT ON
DECLARE @BeginningRange varchar(20),
@EndingRange varchar(20)
SET @EndingRange = ''12*13''
SET @BeginningRange = ''12*02''
;WITH CTE1 AS(
SELECT
dbo.Field1,dbo.Field2,dbo.Field3
FROM dbo.Table1 join dbo.Table2 where...conditions
weekNum BETWEEN (@BeginningRange) AND (@EndingRange)
)
SELECT * FROM CTE1
UNPIVOT
( numbers for type in (Field1, Field2, Field3, Field4)
) as p PIVOT
(
Sum(numbers) for
WeekNum in ([12*02],[12*03],[12*04],[12*05],[12*06],[12*07],[12*08],[12*09],[12*10], [12*11],[12*12],[12*13])
) as q
END
'
EXECUTE SP_EXECUTESQL @STRING
当我尝试运行这个时,它错误地说
"关键字"as"附近的语法不正确"
我把这个代码拿出来单独执行,它没有出错。我是不是遗漏了什么?
过程的参数周围看起来缺少括号。
你可以使用的一个技巧是打印出sql语句,然后尝试运行它——错误消息可能会给你更多的信息
print @STRING
PIVOT和UNPIVOT子句都需要两个右括号。
UNPIVOT (... FOR ... IN (...)
)
AS ...
PIVOT (... FOR ... IN (...)
)
AS ...
where...conditions
这不会通过语法检查。如果你已经删除了实际情况,这可能是你的错误所在
dbo.Table1 join dbo.Table2
没有ON条款
我通过对print@string的结果进行语法检查看到了这两种情况,这是您应该采取的第一步来发现问题。我仍然认为,根据您给我们的信息,根本没有理由使用动态SQl,如果您不需要,使用动态SQl是一种糟糕的做法。