我正在传递动态列名库,该列名称更新值,下面是我的表
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_candidaterInfo,海得拉巴城市更新了ID和列名称的基础
Table_CandidateInfo
Id Name Age City
1 Mazhar 30 Gulbarga
20 Khan 29 Hyderabad
列名是动态的某个时间 @columnname ='name',所以名称值应更新
昨天我要求获得列值的数据基础,但是现在我需要更新
如何使用SQL选择查询
好吧,由于您无法在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
启用包含空格,点或保留关键字的列名。