1

以下のコードをストアドプロシージャ(SQL Server 2008)に配置しています。パラメータの1つに複数の値を設定できるようにするために、コードは文字列に配置されています。私が抱えている問題は、SQL Server Management StudioでSQLをテストすると、文字列が有効な識別子ではないと表示され、double**を付けた行を指していることです。

何が間違っているのかわからないので、何かを見逃したのか、この種のクエリを動的に実行できるのかを尋ねたいと思います。後者が不可能な場合、この種のクエリにいくつかのパラメータをどのように渡すのでしょうか。

ありがとう

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
4

2 に答える 2

0

に変更EXECUTE @SQLEXECUTE (@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)
于 2012-11-20T13:40:38.577 に答える
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)
于 2012-11-20T15:02:40.543 に答える