sql - 当匹配语句时使用 MERGE 在其他表中进行 UPDATE 和 INSERT?

标签 sql sql-server-2008 t-sql

我在该主题上搜索了某种类型的帮助/答案,但没有找到太多。我这么问是因为我更喜欢MERGE;如果不可能,那么我将返回常规更新/插入。

我有两个表:[Course][CourseHistory]。两者都有三列:EmpIdCourseIdCourseName。以下 MERGE 语句可以正常工作,因为它可以在需要时UPDATEsINSERTs[Course] .

我需要包括的是当有UPDATE时插入[CourseHistory]。本质上,我将备份将要修改的记录。

我尝试包含某种 INSERT 语句,但出现语法错误。

我的 tsql 语句如下所示:

merge dbo.Courses as pre              
using (select @EmpId as EmpId, @CourseId as CourseId) as S              
    on  pre.EmpId = S.EmpId and pre.CourseId = s.CourseId
  when matched then
   /* 
     INSERT INTO [CourseHistory] (EmpId, CourseId, CourseName)
     SELECT EmpId, CourseId, CourseName 
     where EmpId = @EmpId and @CourseId = CourseId
   */
    update set
        CourseName = @CourseName
  when not matched then              
    INSERT (CourseId, EmpId, CourseName)
    VALUES (@CourseId, @EmpId, @CourseName);

最佳答案

注意:我已根据 rbhatup 以下评论更新了我的答案。

我会使用OUTPUT ... INTO ...带有 $action 虚拟列的子句:

-- It create a temp. table with the same columns and data type like source table
SELECT TOP(0) *, CONVERT(NVARCHAR(10), N'') AS MergeAction 
INTO #AffectedRows 
FROM dbo.Courses;
-- If source table have one column with IDENTOTY property then this SELECT INTO will add also the IDENTITY property to the same column

MERGE... your statement ...
OUTPUT deleted.*, $action into  #AffectedRows; -- deleted = old values, inserted = new values

INSERT INTO [CourseHistory] -- You could add a new column to CourseHistory named [Action] (will store values from MergeAction)
SELECT * FROM #AffectedRows r
WHERE r.MergeAction = 'UPDATE'

关于sql - 当匹配语句时使用 MERGE 在其他表中进行 UPDATE 和 INSERT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28816802/

相关文章:

sql - 如何根据Teradata SQL中的条件计算带重置的移动总和?

mysql - 如何在 MySQL 中返回数据透视表输出?

sql-server - REFERENTIAL_CONSTRAINTS 中 UNIQUE_CONSTRAINT_NAME 的值不正确

sql-server-2008 - 自动重组和重建索引

sql - 将列值转换为列名 SQL Server

sql - TSQL - 在初始查询中运行 "duplicates"/误报的日期比较?

sql - SQL Server 存储过程中的错误处理

sql - 如果结果为 true,则返回列名称

sql - 命名管道提供程序无法打开与 SQL Server 1231 的连接

sql - 减少 T-SQL 查询的运行时间