如何使用 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
启用包含空格、点或保留关键字的列名。
我正在将基于该列名称的动态列名称传递给更新值,低于我的 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
启用包含空格、点或保留关键字的列名。