2016-08-29 5 views
-1

SQL Serverでいくつかの変数を設定するためにexec句でdinamicクエリを使用したいが、正しく機能しません。SQL ServerでEXEC combineとSET句を使用する方法

私のコードは次のようである:

DECLARE 
    @ProjectCode varchar(25), 
    @TypeCode  varchar(25), 
    @BomDate  varchar(25), 
    @TbNameBom  varchar(25), 
    @BomProgressCal int 

SET @ProjectCode = 'PRO160604' 
SET @TypeCode  = 'PS-BPRG15AGW' 
SET @BomDate  = '8/19/2016' 
SET @TbNameBom  = 'z'[email protected] 

EXEC(' 
SET @BomProgressCal  = (SELECT AVG([Bod Progress]) FROM [PMLite].[dbo]. ['[email protected]+'] 
           WHERE ([Project Code] = @ProjectCode) AND 
            ([Type Code]  = @TypeCode) AND 
            ([Bom Date]  = @BomDate)) 
') 

PRINT @BomProgressCal 

このエラーが表示されます:

メッセージ137、レベル15、状態2、行3
はスカラー変数 "@ProjectCode" を宣言する必要があります。

答えて

1

@BomProgressCalをEXEC機能のコンテキスト内で設定しようとしているため、表示されないため直接更新することはできません。

動的SQLクエリから任意のデータを取得するために、INSERT INTO "temp table" EXEC(sql_code)メソッドを実装できます。次に、そのテンポラリテーブルをクエリします。

動的クエリにパラメータを渡すには、sp_execute_sqlを使用するか、REPLACE関数を使用してトークン(実際の値で '@TypeCode'など)を置き換えることができます。varchar/char/nvarchar値。

1

ダイナミックSQL(これはとにかくこの例では必要ない)と外側のコードとの間に変数を無制限に渡すことはできません...ダイナミックSQLが実行されると@BomProgressCalが何であるか分かりませんそれは別の文脈です。

EXECコマンドではなく、ダイナミックSQLを使用する必要がある場合は、sp_executesqlを使用して、可変値を通常および出力パラメータに渡すことをお勧めします。

一般的に、私は動的SQLを使用しないことをお勧めします。これは、ほとんどの場合(この例のように)その使用が不当であるためです。

関連する問題