使用参数更新表

Jon*_*han 1 sql t-sql sql-server

我有一个存储过程来获取这些参数:

@TaskId        UNIQUEIDENTIFIER,
@ColumnName    VARCHAR(255) = NULL,
@CheckBoxValue VARCHAR(255) = NULL
Run Code Online (Sandbox Code Playgroud)

然后我有这样的UPDATE声明:

UPDATE [RedMarkItems]
SET @ColumnName = @CheckBoxValue
WHERE [TaskId] = @TaskId
Run Code Online (Sandbox Code Playgroud)

如果我运行我的存储过程,如:

exec usp_RedMarkItem_Insert 
         @TaskId = '82ab0c4b-9342-46fa-acbe-c00b87571bf9', 
         @ColumnName = Item7, 
         @CheckBoxValue = 1, 
         @CurrentUser = '6074caea-7a8e-4699-9451-16c2eaf394ef'
Run Code Online (Sandbox Code Playgroud)

它只是说不影响表

命令已成功完成

但是值仍然相同,但是如果我在UPDATE语句中替换值就像

UPDATE [RedMarkItems]
SET Item7 = 1
WHERE [TaskId] = '82ab0c4b-9342-46fa-acbe-c00b87571bf9'
Run Code Online (Sandbox Code Playgroud)

有用!如果我使用参数,为什么它不起作用?问候

Lar*_*rnu 5

你在这里犯的错误是你的印象是变量/参数可以用于对象的名称.简单地说,它不能.对象的名称必须是文字,因此您不能执行以下操作:

DECLARE @TableName sysname;
SET @TableName = N'MyTable';

SELECT *
FROM @TableName;
Run Code Online (Sandbox Code Playgroud)

对于这样的事情,您需要使用动态SQL,以及(同样重要的)安全动态SQL.

首先,我将更改为@ColumnName数据类型sysname(这是一个同义词nvarchar(128))和@Checkbox一个bit(一个复选框只能有3个值:True/ 1,False/ 0和NULL,因此nvarchar(255)一个非常差的数据选择).然后您的存储过程将如下所示:

DECLARE @SQL nvarchar(MAX);

SELECT @SQL = N'UPDATE RedMarkItems' + NCHAR(10) +
              N'SET ' + QUOTENAME(c.[name]) + N' = @Checkbox' + NCHAR(10) +
              N'WHERE TaskID = @ID;'
FROM sys.tables t
     JOIN sys.columns c ON t.object_id = c.object_id
WHERE c.[name] = @ColumnName
  AND t.[name] = 'RedMarkItems';

EXEC sp_executesql @SQL, N'@Checkbox bit, @ID uniqueindentifier', @Checkbox = @CheckBoxValue, @ID = @TaskId;
Run Code Online (Sandbox Code Playgroud)

引用sys表的原因是为了确保列确实存在.如果没有,则不会运行任何SQL.这只是一个额外的安全措施,同时使用QUOTENAME.