Sql server 2008 EXECUTESQL错误
下面是我试图在SQL Server上执行的代码Sql server 2008 EXECUTESQL错误,sql-server-2008,sp-executesql,Sql Server 2008,Sp Executesql,下面是我试图在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''
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
当我试着运行这个时,它错误地说
“keywor'as'附近的语法不正确”
我取出这段代码并单独执行,它没有出错。我在这里遗漏了什么吗?看起来像是在过程的参数周围遗漏了括号 您可以使用的一个技巧是打印sql语句,然后尝试运行该语句-错误消息可能会提供更多信息
print @STRING
PIVOT和UNPIVOT子句都需要两个右括号
UNPIVOT(…FOR…IN(…)
)
作为…
where...conditions
PIVOT(…FOR…IN(…)
)
作为…
where...conditions
这不会通过语法检查。如果您已经删除了实际情况,则可能是这就是您的错误所在。以及:
dbo.Table1 join dbo.Table2
没有ON条款
我通过对print@string的结果进行语法检查看到了这两个问题,这是找到问题的第一步。我仍然说,根据您给我们的信息,根本没有理由使用动态SQl,如果您不需要动态SQl,那么使用动态SQl是一种糟糕的做法 我已经这么做了,我找不到任何地方可能会漏掉括号……否则,如果没有SP_EXECUTESQL,这根本不会执行。参数列表中不需要括号。哦-我总是使用括号-我猜我把编码标准误认为是语法要求:)当您在没有SP_EXECUTESQL的情况下运行文本时,它会给您错误的行号吗?就像我说的,当我在没有单引号和SP_EXECUTESQL的情况下运行该过程时,它不会出错并成功完成。只有当我试图通过EXECUTESQL创建proc时,它才会出错。您正在运行的代码中是否仍有…条件,或者您是否更改了这些条件以在此处发布?另外,如果您想将@EndingRange
计算为12*13,则不应将其放在引号中。我已经考虑了引号。这是我试图运行的直接复制粘贴,是的,…条件是为了发布而故意设置的。为什么你不只是运行代码?我看不出为什么需要使用动态SQL。我已经更新了答案,以显示需要结束段落的两个位置。我添加了结束段落,现在它在另一行上给了我一个错误。我会尽可能地调试它。