如何使用SQL Select查询通过动态字段名称更新值

时间:2019-05-28 05:52:46

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我正在根据该列名传递动态列名,以更新值并在我的表下面

Table_CandidateInfo

Id     Name        Age    City 

1      Mazhar      30     Gulbarga

20     Khan        29     Bidar

Example1

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',因此名称值应更新

昨天我要求获取可以正常工作的列值的数据库,但现在我需要更新

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

1 个答案:

答案 0 :(得分:1)

好吧,由于您无法在SQL中参数化标识符,因此您唯一的选择就是将动态SQL用于此类操作。
但是,请注意,创建和执行动态SQL语句的代码必须以防止SQL注入攻击的方式编写。
规则很简单-您无法参数化的内容必须列入白名单。

因此,基本上,您可以执行以下操作:

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 Server将其用于所有标识符。基本上,它是nvarchar(128)的别名,但它不能为空。

sql_variant是一种特殊的数据类型,可用于保存内部的不同数据类型。

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