在动态SQL中使用变量作为列名的一部分

时间:2016-12-02 15:26:37

标签: sql sql-server dynamic-sql

我试图在动态SQL语句中将变量用作列名的一部分。

我有4列名为Player1ActionPlayer2ActionPlayer3ActionPlayer4Action

根据变量@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

1 个答案:

答案 0 :(得分:0)

说到最干净的方法,恕我直言,最好的方法是使用带有参数的sp_executesql,这意味着@CurrentPlayerId@CurrentPlayerBetAmount是给定代码的输入参数:

Declare @sql nvarchar(256)
    , @sql1 nvarchar(256) = N'update HandCurrent
    Set Player1Action =@value,
    Player1ActionSize =@size'
    , @sql2 nvarchar(256) = N'update HandCurrent
    Set Player2Action =@value,
    Player2ActionSize =@size'
    , @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