SQL Server中关键字“DECLARE”附近的语法不正确

时间:2013-11-20 13:06:15

标签: sql-server tsql

我正在使用这个SQL代码:

DECLARE
@vals AS varchar(MAX),
@q  AS varchar(MAX)

select @vals = STUFF((SELECT distinct ',' + QUOTENAME(chgnum) 
        from pppview_nl
        FOR XML PATH(''), TYPE
    ).value('.', 'varchar(MAX)'),1,1,'')

set @q = 'SELECT lotdetid,' + @vals + ' FROM 
                        (
                SELECT TOP 50 lotdetid, LineValue as val,chgnum FROM pppview_nl ORDER BY lotdetid DESC
                        ) a
                        pivot 
                        (
                            max(val)
                            for chgnum in (' + @vals + ')
                        ) b'
execute(@q)

哪种方法正常,并且有所改变:

http://i.stack.imgur.com/yPd9a.png

INTO:

http://i.stack.imgur.com/vDOgI.png

它在Navicat和SQL Fiddle上运行良好,但是当我尝试保存它时, 我得到这个问题: [SQL Server]关键字'DECLARE'

附近的语法不正确

我已经完成了相当多的阅读并且远未重做整个事情,如何解决这个问题?我读了一些关于需要的内容,但所有人都在内部声明~~不管它是什么~~但是其他人似乎都说它没有什么区别。

希望有人可以在这方面为我提供帮助,因为它有点令人头疼,它如何正常工作但不能保存。

问候,奥斯卡。


修改

ALTER PROCEDURE [dbo].[o_getvals]
    @lotdetit varchar(6)
AS
BEGIN
    DECLARE
    @vals AS varchar(MAX),
    @q  AS varchar(MAX)
    select @vals = STUFF((SELECT distinct ',' + QUOTENAME(chgnum) 
            from pppview_nl
            ORDER BY chgnum desc
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(MAX)'),1,1,'')

    set @q = 'SELECT lotdetid,' + @vals + ' FROM 
                            (
                                    SELECT TOP 50 lotdetid, LineValue as val,chgnum FROM pppview_nl WHERE lotdetid = ' + @lotdetit + ' ORDER BY lotdetid DESC
                            ) a
                            pivot 
                            (
                                max(val)
                                for chgnum in (' + @vals + ')
                            ) b'
    execute(@q)
END

存储过程完成了这个技巧,感谢jyparask和其他所有人。 :)

2 个答案:

答案 0 :(得分:1)

对于这项工作,您应该创建一个stored procedure

答案 1 :(得分:0)

我突然发现这个问题'附近的语法无效'。经过简短的调查后,我发现它是由于函数声明参数与我的查询中的参数的使用之间的冲突,即在我的函数签名中将int变量声明为varchar。

如果这解决了问题,请告诉我.......