0

这是我尝试在 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'附近的语法不正确”

我取出这段代码并单独执行它并没有出错。我在这里错过了什么吗?

4

3 回答 3

1

看起来像在过程参数周围缺少括号。

您可以使用的一个技巧是打印出 sql 语句,然后尝试运行它 - 错误消息可能会为您提供更多信息

print @STRING
于 2012-02-23T20:18:46.453 回答
0

PIVOT 和 UNPIVOT 子句都需要两个右括号。

UNPIVOT (... FOR ... IN (...) ) AS ...

PIVOT (... FOR ... IN (...) ) AS ...

于 2012-02-23T20:28:55.163 回答
0
where...conditions 

这不会通过语法检查。如果您已删除实际条件,则可能这就是您的错误所在。和:

dbo.Table1 join dbo.Table2 

没有 ON 子句

我通过对 print @string 的结果进行语法检查看到了这两种情况,这是您应该采取的第一步来找到问题。我仍然说,根据您给我们的内容,根本没有理由使用动态 SQl,如果您不需要动态 SQL,则使用动态 SQL 是一种不好的做法。

于 2012-02-23T21:54:19.283 回答