我需要编写一个存储过程来更新一组类似列中的一个。列被命名为'UserField1','UserField2'等。我希望将参数传递给SPROC,这将设置要更新的列。但是,我似乎无法使代码正确。这是我尝试的一个简化示例(它给我一个'不正确的语法'消息):
create procedure UpdateUserField
(@UserFieldNumber int, @UserFieldNewValue int)
as
update MyTable set
case @UserFieldNumber
when 1 then UserField1
when 2 then UserField2
end
= @UserFieldNewValue
答案 0 :(得分:2)
如何使用多个IF?
CREATE PROCEDURE UpdateUserField
(
@UserFieldNumber int,
@UserFieldNewValue int
) AS
IF @UserFieldNumber=1
BEGIN
UPDATE MyTable SET UserField1 = @UserFieldNewValue
END
IF @UserFieldNumber=2
BEGIN
UPDATE MyTable SET UserField2 = @UserFieldNewValue
END
或者,您可以在exec中构建动态SQL
CREATE PROCEDURE UpdateUserField
(
@UserFieldNumber int,
@UserFieldNewValue int
) AS
EXEC('UPDATE MyTable SET UserField' + CONVERT(varchar(10), @UserFieldNumber) + ' = ' + CONVERT(varchar(10), @UserFieldNewValue))
如果你这样做,请注意SQL注入,如果你没有问题,那么你可能需要考虑风险。
答案 1 :(得分:2)
如果您不想使用动态SQL或多个IF
和UPDATE
语句,那么您可以尝试使用以下内容:
UPDATE MyTable
SET UserField1 = CASE WHEN @UserFieldNumber = 1
THEN @UserFieldNewValue ELSE UserField1 END,
UserField2 = CASE WHEN @UserFieldNumber = 2
THEN @UserFieldNewValue ELSE UserField2 END
答案 2 :(得分:0)
if @UserFieldNumber=1
BEGIN
update MyTable set UserField1=@UserFieldNewValue where...
END
ELSE if @UserFieldNumber=2
BEGIN
update MyTable set UserField2=@UserFieldNewValue where...
END
ELSE if @UserFieldNumber=3
BEGIN
update MyTable set UserField3=@UserFieldNewValue where...
END
答案 3 :(得分:0)
update命令不接受动态字段名称。
相反,您可以做的是使用您要执行的update语句构建一个字符串,然后执行它,如下所示:
DECLARE @strToExecute VARCHAR(1000)
SET @strToExecute = 'UPDATE MyTable '
IF @UserFieldNumber = 1
SET @strToExecute = @strToExecute + ' SET UserField1 = '
IF @UserFieldNumber = 2
SET @strToExecute = @strToExecute + ' SET UserField2 = '
等等来构建你的字符串,然后执行它。
答案 4 :(得分:-1)
我认为你不能在语句的字段列表中使用CASE语句。我几乎肯定你只能将CASE语句应用于你正在设置,返回或测试的值。
在您的示例中,您尝试使用case语句修改字段列表,我假设SQL有问题,因为字段列表将在编译和运行语句之后才会确定,这是一种鸡肉和鸡蛋的情况。
答案 5 :(得分:-1)
AFAIK您不能使用CASE WHEN指定列。
你可以将它包装在Some Dynamic SQL中。
CREATE PROCEDURE UpdateUserField
(
@UserFieldNumber int,
@UserFieldNewValue int
)
AS
DECLARE @sql nvarchar(max)
SET @sql = 'UPDATE MyTable SET UserField' + @UserFieldNumber + ' = ' + @UserFieldNewValue
EXEC (@sql)