SQL Server数据透视表作为动态SQL

时间:2012-11-20 12:52:14

标签: sql-server-2008

我将以下代码放在存储过程中(SQL Server 2008)。代码已放置在一个字符串中,以允许其中一个参数具有多个值。我遇到的问题是当我在SQL Server Management Studio中测试SQL时,它说我的字符串不是有效的标识符,并且指向我放置了两倍的行。

我看不出自己做错了什么,想知道我是否遗漏了某些内容,或者是否可以动态执行此类查询。如果后者不可能,那么如何将一些参数传递给这种类型的查询呢?

由于

DECLARE @SQL AS VARCHAR(MAX)

SELECT @SQL = 'select Production_Site, [Target],[Action],[Fail]'
SELECT @SQL = @SQL + ' from'
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' select Production_Site, value, Period, YEAR, week'
SELECT @SQL = @SQL + ' from t_Pqe_Grocery'
SELECT @SQL = @SQL + ' unpivot ('
SELECT @SQL = @SQL + ' value'
SELECT @SQL = @SQL + ' for col in (Grocery_Packaging_And_Coding, Grocery_Measurable,'
SELECT @SQL = @SQL + ' Grocery_Appearance, Grocery_Aroma,'
**SELECT @SQL = @SQL + ' Grocery_Flavour, Grocery_Texture)) unp'**
SELECT @SQL = @SQL + ' ) src '
SELECT @SQL = @SQL + ' pivot '
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' count(value)'
SELECT @SQL = @SQL + ' for value in ([Target], [Action], [Fail])'
SELECT @SQL = @SQL + ' ) piv'
SELECT @SQL = @SQL + ' where Production_Site IN (' + @Site + ') AND YEAR = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Year)) + ' AND Period = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Period)) + ' and Week = ' +   
                     CONVERT(varchar(50), CONVERT(BIGINT, @Week)) 
EXECUTE @SQL

2 个答案:

答案 0 :(得分:0)

EXECUTE @SQL更改为EXECUTE (@SQL)。我相信这是语法问题。

尝试将其粘贴到SSMS并运行它,它运行时没有引号问题:

DECLARE @Site VARCHAR(1000) = '''Avonmouth'',''Lifton'''
DECLARE @Year VARCHAR(50) = '12'
DECLARE @Period VARCHAR(50) = '10'
DECLARE @Week VARCHAR(50) ='41'

DECLARE @SQL AS VARCHAR(MAX)

SELECT @SQL = 'select Production_Site, [Target],[Action],[Fail]'
SELECT @SQL = @SQL + ' from'
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' select Production_Site, value, Period, YEAR, week'
SELECT @SQL = @SQL + ' from t_Pqe_Grocery'
SELECT @SQL = @SQL + ' unpivot ('
SELECT @SQL = @SQL + ' value'
SELECT @SQL = @SQL + ' for col in (Grocery_Packaging_And_Coding, Grocery_Measurable,'
SELECT @SQL = @SQL + ' Grocery_Appearance, Grocery_Aroma,'
SELECT @SQL = @SQL + ' Grocery_Flavour, Grocery_Texture)) unp'
SELECT @SQL = @SQL + ' ) src '
SELECT @SQL = @SQL + ' pivot '
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' count(value)'
SELECT @SQL = @SQL + ' for value in ([Target], [Action], [Fail])'
SELECT @SQL = @SQL + ' ) piv'
SELECT @SQL = @SQL + ' where Production_Site IN (' + @Site + ') AND YEAR = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Year)) + ' AND Period = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Period)) + ' and Week = ' +   
                     CONVERT(varchar(50), CONVERT(BIGINT, @Week)) 
PRINT @SQL
EXECUTE (@SQL)

答案 1 :(得分:0)

我猜你在@site参数周围没有足够的单引号而不是传入。添加以下内容:

Production_Site IN (''' + @Site + ''') 

如果@site是一个字符串值,那么你需要在它周围加上单引号。您当前的查询缺少它们。

所以你的最终查询是:

DECLARE @SQL AS VARCHAR(MAX)

SELECT @SQL = 'select Production_Site, [Target],[Action],[Fail]'
SELECT @SQL = @SQL + ' from'
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' select Production_Site, value, Period, YEAR, week'
SELECT @SQL = @SQL + ' from t_Pqe_Grocery'
SELECT @SQL = @SQL + ' unpivot ('
SELECT @SQL = @SQL + ' value'
SELECT @SQL = @SQL + ' for col in (Grocery_Packaging_And_Coding, Grocery_Measurable,'
SELECT @SQL = @SQL + ' Grocery_Appearance, Grocery_Aroma,'
SELECT @SQL = @SQL + ' Grocery_Flavour, Grocery_Texture)) unp'
SELECT @SQL = @SQL + ' ) src '
SELECT @SQL = @SQL + ' pivot '
SELECT @SQL = @SQL + ' ('
SELECT @SQL = @SQL + ' count(value)'
SELECT @SQL = @SQL + ' for value in ([Target], [Action], [Fail])'
SELECT @SQL = @SQL + ' ) piv'
SELECT @SQL = @SQL + ' where Production_Site IN (''' + @Site + ''') AND YEAR = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Year)) + ' AND Period = ' + 
                     CONVERT(varchar(50), CONVERT(BIGINT, @Period)) + ' and Week = ' +   
                     CONVERT(varchar(50), CONVERT(BIGINT, @Week)) 

EXECUTE (@SQL)