【问题标题】:TSQL generating update statement for table based on conditionSQL根据条件为表生成更新语句
【发布时间】:2017-09-14 05:11:10
【问题描述】:

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

我想指定日期(对于这个例子'3/16/2016')并生成类似以下更新的内容

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

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

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

【问题讨论】:

  • 我们需要更多细节来回答这个问题。比如你想更新哪些行,从哪里获取数据,诸如此类。
  • 我需要为在某个日期之后更改的行生成更新语句。 (创建导出文件)

标签: c# sql-server-2008 tsql


【解决方案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

【讨论】:

  • 谢谢,但这不是我的方案,我需要将更新语句作为导出文件。
  • 在这种情况下,您可以在该表上使用 SQL 触发器来记录每次数据修改的更新语句。
  • 你能说得具体点吗?
【解决方案2】:

如果你只想生成更新语句,你可以这样做:

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; |
+------------------------------------------------------------------------------+

【讨论】:

  • @Muflix 乐于助人!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多