TSQL根据条件生成表的更新语句

时间:2017-04-18 11:26:35

标签: c# sql-server-2008 tsql

如何在某些条件下在整个表上生成更新语句?例如,我有表

enter image description here

我想指定日期(对于此示例'3/16/2016')并生成类似于更新的内容

UPDATE TableName SET ColumnValue = 30 AND ModifiedDate = '2016-03-17' WHERE Id = 2

如果在指定日期之后会有更多更改,我想为这些更改生成所有更新。

是否有一些简单的解决方案,或者我必须通过一些自定义的C#脚本编写所有这些脚本?

3 个答案:

答案 0 :(得分:1)

如果您有2个相同的表,并且需要根据另一个表中特定时间戳(@Date)之后发生的更改来更新其中一个表,那么您可以使用以下查询。

UPDATE T1
SET T1.ColumnValue=T2.ColumnValue,T1.ModifiedDate=T2.ModifiedDate
FROM Table1 T1 inner join Table2 T2 on T1.ID=T2.ID
WHERE T2.ModifiedDate>=@Date

答案 1 :(得分:0)

如果您只想生成更新语句,可以执行以下操作:

declare @afterDate date = '20160316';

select update_statements = 'update table t set columnvalue = '
       +convert(varchar(10),columnvalue)
       +', modifieddate = '''
       +replace(convert(varchar(10),modifieddate,120),'-','')+''''
       +' where id = '+convert(varchar(10),id)+';'
from t
where modifieddate > @afterdate;

rextester演示:http://rextester.com/MZQ68677

返回:

+------------------------------------------------------------------------------+
|                              update_statements                               |
+------------------------------------------------------------------------------+
| update table t set columnvalue = 30, modifieddate = '20160317' where id = 2; |
+------------------------------------------------------------------------------+

答案 2 :(得分:0)

这使触发器可以跟踪表的所有更新。根据表结构,您可以在跟踪表中添加必需的列。

CREATE TABLE EMP(ID int, NAME VARCHAR(20), SALARY MONEY)
CREATE TABLE TrackUpdate (Id int identity, updatestmt varchar(500), DateCreated datetime)
GO
INSERT INTO EMP
VALUES
(1, 'A', 10),(2, 'E',40 ),(3,'B',5),(4,'F',40),(5,'I',50)
GO
 ALTER TRIGGER TR_EMP ON EMP
 INSTEAD OF UPDATE
 AS
 BEGIN
     declare @Name varchar(10)
     declare @Salary MONEY
     SELECT @Name=Name,@Salary=Salary FROM inserted
     insert into TrackUpdate values ('update Emp SET E.Name='''+@Name+''', '+'E.Salary='+CAST(@Salary as varchar(20)),getdate())
     update E SET E.Name=I.Name, E.Salary=I.Salary
     FROM EMP E inner join inserted I on I.ID=E.ID 
 END
update EMP set Name='D' where ID=4
select updatestmt  from TrackUpdate 
--drop table EMP
--drop table TrackUpdate