8

渡されたテーブル名を参照するために、プロシージャ内で SQL ステートメントを動的に構築する必要があるストアド プロシージャを作成しています。

この SQL ステートメントで結果を返す必要があり、それを残りの手順全体で使用できます。

一時テーブルとすべてを使用してみましたが、変数を宣言する必要があるなどのメッセージが表示され続けます。

例えば:

DECLARE @FiscalYear INT    
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
DECLARE @tempFiscalYear TABLE ( FiscalYear INT ) 
SELECT @SQL = 'INSERT INTO @tempFiscalYear SELECT DISTINCT FiscalYear FROM ' + @DataSource
EXEC(@SQL)
SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear

または...

DECLARE @FiscalYear INT  
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
SELECT @SQL = 'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource
EXEC(@SQL)

実際のテーブルを使用せずにこれを行う方法はありますか?

ありがとう。

4

2 に答える 2

8

次のようなことを試しましたか:

DECLARE @FiscalYear INT, @DataSource NVARCHAR(25), @SQL NVARCHAR(250);
SET @DataSource = N'CustomerCosts20120328';
SET @SQL = N'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource;
EXEC sp_executesql @SQL, N'@FiscalYear INT OUTPUT', @FiscalYear OUTPUT;

PRINT @FiscalYear;

nvarchar 文字列の前に N を付けるようにしてくださいSELECT @SQL = N'SELECT ...

また、クエリが複数の行を返す場合、割り当てられる値@FiscalYearは完全に任意ですよね? そのテーブルから単一の値を期待するかもしれませんが、単一の予測可能な値のみが割り当てられることを使用MAX()または保証することは問題ありません。TOP 1 ... ORDER BY

于 2012-04-24T13:21:46.483 に答える
6

まず第一に、動的 SQL を使用すると SQL インジェクション攻撃を受ける危険性があることを知っておく必要があります。使用する前に、まずこのリンクを確認してください。その後、最初のクエリを次のように変更できます。

DECLARE @FiscalYear INT    
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
DECLARE @tempFiscalYear TABLE ( FiscalYear INT ) 
SELECT @SQL = 'SELECT DISTINCT FiscalYear FROM ' + @DataSource

INSERT INTO @tempFiscalYear
EXEC(@SQL)

SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear

パラメータの割り当てに関する @AaronBertrand コメントも考慮する必要があり@FiscalYearます。

于 2012-04-24T13:25:25.613 に答える