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)
有用!如果我使用参数,为什么它不起作用?问候
你在这里犯的错误是你的印象是变量/参数可以用于对象的名称.简单地说,它不能.对象的名称必须是文字,因此您不能执行以下操作:
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.
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |