我正在根据该列名传递动态列名,以更新值并在我的表下面
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
答案 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
启用包含空格,点或保留关键字的列名。