2016-12-02 11 views
0

動的SQL文の列名の一部として変数を使用しようとしています。動的SQLの列名の一部として変数を使用

私はPlayer1Action,Player2Action,Player3ActionおよびPlayer4Actionと呼ばれる4つの列を持っています。

可能性のある@CurrentPlayerIdに応じて、関連するプレーヤーの列をいくつかのデータで更新したいと考えています。

たとえば、CurrentPlayerIdに1が含まれている場合は、列Player1Actionを更新します。

私はこれを一連のIF文で実現できることを認識していますが、よりクリーンな方法でやりたいと思います。

私は次のコードを持っていますが、私はエスケープして問題を引き起こしていると思います。私はこれをビュータイムに書き直しましたが、私はそれを動作させることができないようです。

DECLARE 
@CurrentPlayerId INT, 
@CurrentPlayerBetAmount nvarchar(MAX), 
@stmt nvarchar(MAX); 

SET @CurrentPlayerId = 1 
SET @CurrentPlayerBetAmount = 100 

SET @stmt = N'UPDATE HandCurrent SET ''Player'' ''+'' @CurrentPlayerId ''+'' ''Action'' = 1 '','' ''Player'' ''+'' @CurrentPlayerId ''+'' ''ActionSize'' = @CurrentPlayerBetAmount' 

EXECUTE sp_executesql @stmt 

これを選択として実行すると、次の結果が返されます。

UPDATE HandCurrent SET 'Player' '+' @CurrentPlayerId '+' 'Action' = 1 ',' 'Player' '+' @CurrentPlayerId '+' 'ActionSize' = @CurrentPlayerBetAmount 
+0

あなたがしているRDBMSとの質問にタグを付けてください。 – Kacper

+0

を使用してなぜ結果sqlを見るために 'SELECT @ stmt'をしないのですか? –

+0

@Kacper done、thanks! – AntonZ

答えて

2
DECLARE 
@CurrentPlayerId INT, 
@CurrentPlayerBetAmount INT, 
@stmt nvarchar(MAX); 

SET @CurrentPlayerId = 1 
SET @CurrentPlayerBetAmount = 100 

SET @stmt = N'UPDATE HandCurrent SET 
      Player' + CAST(@CurrentPlayerId AS NVARCHAR(10)) + 'Action = 1, 
      Player' + CAST(@CurrentPlayerId AS NVARCHAR(10)) + 'ActionSize = ' 
      + CAST(@CurrentPlayerBetAmount AS NVARCHAR(10)) 

EXECUTE sp_executesql @stmt 

フアン・カルロスは、それが右の唯一の問題あなたはNVARCHAR()https://www.mssqltips.com/sqlservertip/3014/concatenation-of-different-sql-server-data-types/にキャストする必要がありますので、変数@CurrentPlayerIdのデータ型はINTである持っていました。

@CurrentPlayerBetAmountINTと同様に宣言する必要があります。あなたがそれをしたら、それもキャストする必要があります。ただやることであろうあなたが、とにかくレコードを変更しようとしている場合

DECLARE 
@CurrentPlayerId NVARCHAR(MAX), 
@CurrentPlayerBetAmount NVARCHAR(MAX), 
@stmt nvarchar(MAX); 

SET @CurrentPlayerId = '1' 
SET @CurrentPlayerBetAmount = '100' 

SET @stmt = N'UPDATE HandCurrent SET 
      Player' + @CurrentPlayerId + 'Action = 1, 
      Player' + @CurrentPlayerId + 'ActionSize = ' + @CurrentPlayerBetAmount 

EXECUTE sp_executesql @stmt 

それとも私の好み:そのように設定するとき

しかし、あなたはまた、単に値NVARCAHR(MAX)として、その後、単一引用符の両方を宣言することができ4つの列がある場合は、更新ステートメント。また、n番目の正規化と列の行を考えることもできます....

DECLARE @CurrentPlayerId INT = 1 
DECLARE @CurrentPlayerBetAmount INT = 100 

UPDATE HandCurrent 
    Player1Action = CASE WHEN @CurrentPlayerId = 1 THEN 1 ELSE PlayerAction1 END 
    ,Player1ActionSize = CASE WHEN @CurrentPlayerId = 1 THEN @CurrentPlayerBetAmount ELSE Player1ActionSize END 
    ,Player2Action = CASE WHEN @CurrentPlayerId = 2 THEN 1 ELSE PlayerAction2 END 
    ,Player2ActionSize = CASE WHEN @CurrentPlayerId = 2 THEN @CurrentPlayerBetAmount ELSE Player2ActionSize END 
    ,Player3Action = CASE WHEN @CurrentPlayerId = 3 THEN 1 ELSE PlayerAction3 END 
    ,Player3ActionSize = CASE WHEN @CurrentPlayerId = 3 THEN @CurrentPlayerBetAmount ELSE Player3ActionSize END 
    ,Player4Action = CASE WHEN @CurrentPlayerId = 4 THEN 1 ELSE PlayerAction4 END 
    ,Player4ActionSize = CASE WHEN @CurrentPlayerId = 4 THEN @CurrentPlayerBetAmount ELSE Player4ActionSize END 
WHERE 
    ???? 

実際にテーブル全体を更新するのは、あなたが望むものですか?

+0

ですこれは完璧です!ありがとう – AntonZ

2

変数を引用しないでください。

SET @stmt = N'UPDATE HandCurrent SET 
      Player' + @CurrentPlayerId + 'Action = 1, 
      Player' + @CurrentPlayerId + 'ActionSize = ' + @CurrentPlayerBetAmount 
+1

演算子のいずれかを引用しないでください。 OPは彼らに二重引用符を二重に与えました。 –

+0

提案してくれてありがとう、これは私にとってはうまくいきません。qouteが見つからないと思われます。 – AntonZ

+0

stmtの結果を表示できますか? –

0

これを行うためのクリーンな方法といえばは、最善のアプローチ私見@CurrentPlayerIdを暗示し、パラメータでsp_executesqlを使用することで、@CurrentPlayerBetAmountは、与えられたコードの入力パラメータです:

Declare @sql nvarchar(256) 
    , @sql1 nvarchar(256) = N'update HandCurrent 
    Set Player1Action [email protected], 
    Player1ActionSize [email protected]' 
    , @sql2 nvarchar(256) = N'update HandCurrent 
    Set Player2Action [email protected], 
    Player2ActionSize [email protected]' 
    , @params nvarchar (128) 
    , @CurrentPlayerId int 
    ; 

Select @sql = case @CurrentPlayerId when 1 then @sql1 when 2 then @sql2 else '' end; 
If @sql <> '' begin 
    set @params = N'@value int, @size int'; 
    execute sp_executesql @sql, @params, 
     @value =1, 
     @size = @CurrentPlayerBetAmount 
     ; 
End 
+0

私はパラメータが動的に更新される列名を識別するために使用されている場合、動的SQLをparaemterizingに同意しますが。だから、このような場合のために動作しないでしょうが、それははい、この特定のケースでパラメータ化 – Matt

+0

になる可能性があるので、それはBetAmountのために働くだろうが、 '@のCurrentPlayerId'は、入力パラメータがある場合は、その後、中ずっとロジック可能がありますこれに依存するUDF。この場合、値を '@sql'に代入して別のアクションを実行できます –

関連する問題