2010-05-06 2 views
4

Привет, мой коллега пришел ко мне с этой ошибкой, и теперь я подключен и пытается понять это, надеюсь, что некоторые из экспертов могут нам помочь! Большое спасибо! Когда я исполняю step6 мы получаем эту ошибку:Ошибка таблицы с использованием таблицы SQL Pivot дает ошибку синтаксиса

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 
+0

+1 Для публикации полезного DDL! –

+0

+1 да! Я согласен с Мартином! – Claudia

ответ

1

Вам нужно будет динамический 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

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

Что касается ошибки рядом с @cols, я думаю, вы можете просто обернуть все это в скобках. Например:

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, '') + ']' 
       ) 
Смежные вопросы