Переменная, использующая ошибку в сводной таблице SQL, дает синтаксическую ошибку - PullRequest
4 голосов
/ 07 мая 2010

Привет, мой коллега пришел ко мне с этой ошибкой, и теперь я подключен и пытаюсь выяснить это, надеюсь, что некоторые эксперты могут помочь нам! Спасибо! Когда я выполняю Шаг 6, мы получаем эту ошибку:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '@cols'.

--Sample of pivot query

--Creating Test Table Step1
CREATE TABLE Product(Cust VARCHAR(25), Product VARCHAR(20), QTY INT)
GO
-- Inserting Data into Table Step2
INSERT INTO Product(Cust, Product, QTY)
VALUES('KATE','VEG',2)
INSERT INTO Product(Cust, Product, QTY)
VALUES('KATE','SODA',6)
INSERT INTO Product(Cust, Product, QTY)
VALUES('KATE','MILK',1)
INSERT INTO Product(Cust, Product, QTY)
VALUES('KATE','BEER',12)
INSERT INTO Product(Cust, Product, QTY)
VALUES('FRED','MILK',3)
INSERT INTO Product(Cust, Product, QTY)
VALUES('FRED','BEER',24)
INSERT INTO Product(Cust, Product, QTY)
VALUES('KATE','VEG',3)
GO
-- Selecting and checking entires in table Step3
SELECT *
FROM Product
GO
-- Pivot Table ordered by PRODUCT Step4

select *
FROM (
SELECT *
FROM Product) up
PIVOT (SUM(QTY) FOR CUST IN ([FRED], [KATE])) AS pvt
ORDER BY PRODUCT
GO

--dynamic pivot???? Step5

DECLARE @cols NVARCHAR(2000)
select @cols =   STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + b.Cust
                        FROM    (select top 100 Cust
        from tblProduct)b
                        ORDER BY '],[' + b.Cust
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

--Show Step6

SELECT *
FROM (SELECT *
FROM tblProduct) p
PIVOT (SUM(QTY) FOR CUST IN (@cols)) as pvt
Order by Product

Ответы [ 2 ]

1 голос
/ 07 мая 2010

К сожалению, для этого вам понадобится динамический SQL.

declare @dyn nvarchar(max)
set @dyn = 'SELECT *
FROM (SELECT *
FROM Product) p
PIVOT (SUM(QTY) FOR CUST IN ('  +  @cols +')) as pvt
Order by Product
'
exec sp_executesql @dyn
0 голосов
/ 04 августа 2010

@ Мартин Смит будет прав ... когда вы перейдете к следующей ошибке. : -)

Что касается ошибки около @cols, я думаю, вы можете просто заключить все это в скобки. E.g.:

select @cols = (
                   STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + b.Cust
                           FROM    (select top 100 Cust
                                    from tblProduct)b
                           ORDER BY '],[' + b.Cust
                           FOR XML PATH('')
                        ), 1, 2, '') + ']'
               )
...