Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有各种变量的SQL Update命令_Sql_Sql Server_Tsql_Sql Update - Fatal编程技术网

带有各种变量的SQL Update命令

带有各种变量的SQL Update命令,sql,sql-server,tsql,sql-update,Sql,Sql Server,Tsql,Sql Update,我的桌子像: 项目 ID(int) 名称(varchar) 日期(日期时间) 值(整数) 我想写一个SQL命令,它将只更新这些不为null的值 我想做的伪代码: UPDATE Items SET IF @NewName IS NOT NULL { Items.Name = @NewName } IF @NewDate IS NOT NULL { Items.Date = @NewDate } IF @newValue IS NOT NULL

我的桌子像:

项目

  • ID(int)
  • 名称(varchar)
  • 日期(日期时间)
  • 值(整数)
我想写一个SQL命令,它将只更新这些不为null的值

我想做的伪代码:

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

可以这样写查询吗?

您可以这样做:

UPDATE Items
SET Name    = ISNULL(@NewName,Name),
    [Date]  = ISNULL(@NewDate,[Date]),
    Value   = ISNULL(@NewValue,Value)
WHERE ID = @ID
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)

在update中不能使用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 )

其中Items.ID=@ID'

我可能会对每个列进行单独的查询,因为您只有3个
updateitems SET Name=@NewName,其中Name=null
,然后执行下一个操作,
updateitems SET Date=@NewDate,其中Date=null
。这不是一个可重用或可扩展的解决方案,但它适用于一次性场景。@Adam,它的开销是占用锁3次您在回答中所做的假设。我想说的是,
@NewDate
更可能是一个
DATETIME
,而不是一个string。这引入了SQL注入的可能性。