【问题标题】:SQL Update command with various variables具有各种变量的 SQL 更新命令
【发布时间】:2014-07-05 04:57:44
【问题描述】:

我有这样的表:

项目

  • ID(整数)
  • 名称(varchar)
  • 日期(日期时间)
  • 值(整数)

我想编写只更新这些不为空的值的 SQL 命令

我想做的伪代码:

UPDATE Items
SET 
  IF @NewName IS NOT NULL
  {
    Items.Name = @NewName
  }
  IF @NewDate IS NOT NULL
  {
    Items.Date = @NewDate
  }
  IF @newValue IS NOT NULL
  {
    Items.Valie = @NewValue
  }
WHERE Items.ID = @ID

可以这样写查询吗?

【问题讨论】:

  • 我可能会为每一列单独查询,因为您只有 3 个。UPDATE Items SET Name=@NewName WHERE Name=null,然后执行下一个,UPDATE Items SET Date=@NewDate WHERE Date=null。它不是一个可重用或可扩展的解决方案,但它适用于一次性场景。
  • @Adam 这有 3 次锁定的开销

标签: sql sql-server tsql sql-update


【解决方案1】:
UPDATE Items
SET Name    = ISNULL(@NewName,Name),
    [Date]  = ISNULL(@NewDate,[Date]),
    Value   = ISNULL(@NewValue,Value)
WHERE ID = @ID

【讨论】:

    【解决方案2】:

    你不能在更新中使用 if 语句,你可以使用下面的查询来更新条件

    'UPDATE Items
    SET 
    Items.Name = (case when @NewName is not null then @NewName else  end) ,
    Items.Date = (case when  @NewDate is not null then @newDate else end ),
    Items.Valie = (case when  @Valie is not null then @Valie else  end )
    

    WHERE Items.ID = @ID'

    【讨论】:

      【解决方案3】:

      你可以做这样的事情:

      declare @sql varchar(1000)
      
      set @sql = 'UPDATE Items SET '
      
      IF @NewName IS NOT NULL
          @sql = @sql + 'Items.Name = ' + @NewName
      
      IF @NewDate IS NOT NULL
          @sql = @sql + 'Items.Date = ' + @NewDate
      
      IF @newValue IS NOT NULL
          @sql = @sql + 'Items.Valie = ' + @NewValue
      
      @sql = @sql + 'WHERE Items.ID = ' + @ID
      
      exec(@sql)
      

      【讨论】:

      • 您在回答中做出了相当的假设。我会说@NewDate 更有可能是DATETIME 而不是字符串
      • 这引入了 SQL 注入的可能性。
      猜你喜欢
      • 2012-05-27
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多