我将以下代码放在存储过程中(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
答案 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)