如果SQL列值不为空,如何更改?

时间:2014-10-29 10:15:43

标签: sql-server sql-update

当我只需要更改一列时,这非常简单:

UPDATE [MyTable] SET [MyColumn1] = 'NewValue' WHERE [MyColumn1] <> ''
...
UPDATE [MyTable] SET [MyColumn20] = 'NewValue' WHERE [MyColumn20] <> ''

我的问题是,我需要更新的不仅仅是一列,而是一打。我想在一个UPDATE命令中更新它们,而不是为每个命令发出单独的命令。

有没有办法在一个更新命令中执行此操作?

4 个答案:

答案 0 :(得分:1)

使用CASE,如下所示

UPDATE t 
SET MyColumn1 = CASE WHEN MyColumn1 <> '' THEN 'NEW VALUE' ELSE MyColumn1 END,
    MyColumn2 = CASE WHEN MyColumn2 <> '' THEN 'NEW VALUE' ELSE MyColumn2 END
FROM MyTable t
-- WHERE '' NOT IN (MyColumn1, MyColumn2)

答案 1 :(得分:1)

试试这个

update MyTable set 
mycolumn1 = case when [MyColumn1] <> '' then 'NewValue' else [MyColumn1] end,
mycolumn20 = case when [MyColumn20] <> '' then 'NewValue' else [MyColumn20] end...

继续添加您要更新的列

答案 2 :(得分:1)

单个查询

中无法做到这一点

但您也可以通过将表名和值传递给参数来尝试使用过程。

答案 3 :(得分:0)

试试这个

循环访问sys.columns并获取列名和各个表名

DECLARE  @COlname varchar(MAX),@TableName varchar(MAX)
DECLARE cursorName CURSOR -- Declare cursor

LOCAL SCROLL STATIC

FOR

select name,d.TableName from ( select OBJECT_NAME(OBJECT_ID) 
TableName,* from sys.columns )d
where d.TableName='tbl_Name'

OPEN cursorName -- open the cursor

FETCH NEXT FROM cursorName

   INTO @COlname,@TableName



WHILE @@FETCH_STATUS = 0

BEGIN

  print  'UPDATE '+ @TableName +'SET '+@COlname +
  '= ''NewValue'' WHERE '+@COlname +' <> '''' '

 EXEC ('UPDATE '+ @TableName +'SET '+@COlname +
  '= ''NewValue'' WHERE '+@COlname +' <> '''' ')


   FETCH NEXT FROM cursorName

   INTO @COlname,@TableName



END

CLOSE cursorName -- close the cursor

DEALLOCATE cursorName -- Deallocate the cursor