TSQL参数化SPROC问题

时间:2009-05-06 15:16:50

标签: sql sql-server sql-server-2005 tsql

我需要编写一个存储过程来更新一组类似列中的一个。列被命名为'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

6 个答案:

答案 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或多个IFUPDATE语句,那么您可以尝试使用以下内容:

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)