2010-05-06 87 views
4

嗨我的同事来找我这个错误,现在我迷上了,并试图找出它,希望有些专家可以帮助我们! 非常感谢! 当我执行第六步:我们得到这个错误:SQL数据透视表错误使用变量给出语法错误

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! – 2010-05-06 21:35:33

+0

+1耶!我同意马丁! – Claudia 2010-05-07 17:21:40

回答

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

@马丁·史密斯将是正确的......当你到你的下一个错误。 :-)

至于@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, '') + ']' 
       )