当我只需要更改一列时,这非常简单:
UPDATE [MyTable] SET [MyColumn1] = 'NewValue' WHERE [MyColumn1] <> ''
...
UPDATE [MyTable] SET [MyColumn20] = 'NewValue' WHERE [MyColumn20] <> ''
我的问题是,我需要更新的不仅仅是一列,而是一打。我想在一个UPDATE命令中更新它们,而不是为每个命令发出单独的命令。
有没有办法在一个更新命令中执行此操作?
答案 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