【问题标题】:How to Update value by dynamic field Name using sql select query如何使用 sql 选择查询通过动态字段名称更新值
【发布时间】:2019-10-13 14:28:26
【问题描述】:

我将动态列名基于该列名传递给更新值并在我的表下方

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' 所以名称值应该更新

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

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

【问题讨论】:

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


【解决方案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 允许使用包含空格、点或保留关键字的列名。

【讨论】:

  • 很高兴为您提供帮助 :-)
猜你喜欢
  • 2019-10-12
  • 1970-01-01
  • 2018-03-24
  • 2021-07-27
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多