如何使用 sql select 查询按动态字段名称更新值

How to Update value by dynamic field Name using sql select query

我正在将基于该列名称的动态列名称传递给更新值,低于我的 table

Table_CandidateInfo

Id     Name        Age    City 

1      Mazhar      30     Gulbarga

20     Khan        29     Bidar

示例 1

Declare @ColumnName varchar(100), @Id int

set @ColumnName='City' 
set @Id=20
set @value='Hyderabad'

update set ____ Table_CandidateInfo where ID=@Id 

我的输出应该如下所示 Table_CandidateInfo,海得拉巴市根据 ID 和列名更新

Table_CandidateInfo

Id     Name        Age    City 

1      Mazhar      30     Gulbarga

20     Khan        29     Hyderabad

列名有时是动态的@ColumnName='Name' 所以名称值应该更新

昨天我要求获取基于列值的数据库,但现在我需要更新

好吧,因为你不能在 SQL 中参数化标识符,你唯一的选择是使用动态 SQL 来处理这些事情。
但是,请注意创建和执行动态 SQL 语句的代码需要以防止 SQL 注入攻击的方式编写。
规则很简单 - 你不能参数化的必须是 white-listed.

基本上,您可以这样做:

CREATE PROCEDURE UpdateCandidateInfo
(
     @ColumnName sysname, 
     @Id int,
     @value sql_Variant
)

AS

IF EXISTS
(
    SELECT 1
    FROM information_schema.columns
    WHERE Table_Name = 'Table_CandidateInfo'
    AND Column_Name = @ColumnName
)

BEGIN

    DECLARE @Sql nvarchar(4000) = N'Update Table_CandidateInfo SET '+ QUOTENAME(@ColumnName) + N' = @Value WHERE Id = @Id';

    DECLARE @Params nvarchar(4000) = N'@Value sql_Variant, @Id int'

    EXEC sp_ExecuteSql @Sql, @Params, @Value, @Id
END

GO

请注意,代码直接写在这里,因此未经测试 - 可能有错误,但这是一般的想法。

sysname 是一种系统数据类型,SQL 服务器将其用于所有标识符。它基本上是 nvarchar(128) 的别名,除了它是 non-nullable.

sql_variant是一种特殊的数据类型,可以用来在里面存放不同的数据类型。

使用 QUOTENAME 启用包含空格、点或保留关键字的列名。