使用局部变量在SQL中设置表字段

使用局部变量在SQL中设置表字段,sql,sql-server,Sql,Sql Server,我试图用源表中的值更新目标表中的不同字段。更新可能针对不同的表列,我希望动态设置 似乎我无法使用“dest.[@FieldName]”动态设置值。我有办法做到这一点吗 DECLARE @FieldName VARCHAR(50) = '' SET @FieldName = CASE WHEN @FieldCode = 0 THEN 'type' WHEN @FieldCode = 1 THEN 'name' WHEN @FieldCode =

我试图用源表中的值更新目标表中的不同字段。更新可能针对不同的表列,我希望动态设置

似乎我无法使用“dest.[@FieldName]”动态设置值。我有办法做到这一点吗

DECLARE @FieldName VARCHAR(50) = ''

SET @FieldName = 
   CASE
       WHEN @FieldCode = 0 THEN 'type'
       WHEN @FieldCode = 1 THEN 'name'
       WHEN @FieldCode = 2 THEN 'age'
   END

MERGE INTO DestTable dest
USING #tempTable src 
    ON dest.record_id = src.record_id
        WHEN MATCHED
            THEN UPDATE SET
                ***dest.[@FieldName]*** = src.value END;

您始终可以使用动态查询。在这种情况下,您还可以按条件更新所有字段:

MERGE INTO DestTable dest
USING #tempTable src 
ON dest.record_id = src.record_id
    WHEN MATCHED
        THEN UPDATE SET type = IIF(@FieldCode = 0, src.value, type),
                        name = IIF(@FieldCode = 1, src.value, name),
                        age = IIF(@FieldCode = 2, src.value, age)
您还可以使用动态查询:

DECLARE @Statement NVARCHAR(MAX) = N'MERGE INTO DestTable dest
USING #tempTable src 
ON dest.record_id = src.record_id
    WHEN MATCHED
        THEN UPDATE SET ' + IIF(@FieldCode = 0, 'type', IIF(@FieldCode = 1, 'name', 'age')) + ' = src.value'
EXEC(@Statement)

您可以通过IF-ELSE逻辑进行静态查询

如果@FieldCode=0
开始
更新目的地
设置
类型=src.value
从dest表dest
内连接#可诱惑src
在dest.record\u id=src.record\u id上
结束
如果@FieldCode=1,则为ELSE
开始
更新目的地
设置
name=src.value
从dest表dest
内连接#可诱惑src
在dest.record\u id=src.record\u id上
结束
如果@FieldCode=2,则为ELSE
开始
更新目的地
设置
年龄=src.value
从dest表dest
内连接#可诱惑src
在dest.record\u id=src.record\u id上
结束
也可以使用单个UPDATE语句。根据
@fieldcode
,您正在更新src.value,如果不同的字段代码,那么您将使用相同的值进行更新

更新dest
设置
type=当@FieldCode=0时的情况,然后src.value ELSE dest.type END,
name=当@FieldCode=1时的情况,然后src.value ELSE dest.name END,
年龄=当@FieldCode=2时的情况,然后src.value ELSE dest.age结束
从dest表dest
内连接#可诱惑src
在dest.record\u id=src.record\u id上

在SQL中,不能参数化标识符。另外,您使用
merge
而不是简单的
update
有什么原因吗?是的,我可能不需要合并,因为我没有向dest表中添加任何新记录。您拥有的是我现在编写的代码,但当我只需要更新一个字段时,设置所有字段感觉有点浪费。有没有办法只对一个@FieldCode执行操作并退出?您可以使用动态查询。