代码之家  ›  专栏  ›  技术社区  ›  kateroh

是否可以更新存储过程中的变量字段?

  •  2
  • kateroh  · 技术社区  · 14 年前

    "UPDATE SomeTable set {0}=@Value where TableId=@TableId"
    

    我需要将此查询转换为存储过程。有可能吗?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Remus Rusanu    14 年前

    它只能通过存储过程中的动态SQL来完成(Brad已经回答了alreayd的问题,但是您当然会使用 QUOTENAME(@columnName) 为了防止SQL注入,使用 sysname 参数类型)。如果你走那条路,我建议你先读一读 The Curse and Blessings of Dynamic SQL

    更新时间:

    我不得不发代码,因为布拉德的代码有太多的错误。

    create procedure myCustomUpdate
       @columnName sysname,
       @value sql_variant,
       @id int
    AS
    declare @sql NVARCHAR(max);
    set @sql = N'UPDATE SomeTable SET ' + QUOTENAME(@columnName) 
        + N' = @value WHERE TableId = @id';
    exec sp_executesql @sql, N'@value sql_variant, @id int', @value, @id;
    
        2
  •  4
  •   Brad    14 年前

    我对你所做的做了一些假设,但是要评估一下这段代码。

    CREATE PROCEDURE UpdateTableValue
        (
         @tableId INT
        ,@columnName sql_variant
        ,@value VARCHAR(10)
        )
    AS 
        BEGIN
    
            DECLARE @sql NVARCHAR(MAX)
            SET @sql = N'UPDATE SomeTable '
                       + N'SET ' + QUOTENAME(@columnName) + N' = = @value '
                       + N'WHERE TableId = @tableId'
    
         EXEC sp_executesql @sql
                 , N'@value sql_variant, @tableId int'
                 , @value, @tableId;
    
        END
    
        3
  •  1
  •   kateroh    14 年前

    The Curse and Blessings of Dynamic SQL . 最后,我使用CASE开关优化性能(动态SQL没有被缓存),如本文所述:

    UPDATE tbl
    SET    col1 = CASE @colname WHEN 'col1' THEN @value ELSE col1 END,
           col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END,