に一致したとき、私はレコードが存在している場合は、ターゲットの終了日を変更するには、次の条件アップデートと条件がTSQL-マージ
にマージ使用してアップサートを実行することができますストアドプロシージャを書くしようとしている挿入昨日の日すなわち、現在の日に - 1
するレコードが存在しない場合は、新規挿入レコードの
ここで私はSP 0123で使用される表のtblEmployeeですここで
CREATE TABLE tblEmployee
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
[StartDate] [date] NOT NULL,
[EndDate] [date] NOT NULL
)
は、入力パラメータとしてUDTTを取り、私のSPで
CREATE PROCEDURE [dbo].[usp_UpsertEmployees]
@typeEmployee typeEmployee READONLY -- It has same column like tblEmployye except EmployeeID
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO tblEmployee AS TARGET
USING @typeEmployee AS SOURCE
ON TARGET.Name = SOURCE.Name
WHEN MATCHED and TARGET.StartDate < SOURCE.StartDate
THEN
--First Update Existing Record EndDate to Previous Date as shown below
UPDATE
set TARGET.EndDate = DATEADD(day, -1, convert(date, SOURCE.StartDate))
-- Now Insert New Record
--INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
WHEN NOT MATCHED by TARGET
THEN
INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
SET NOCOUNT OFF;
END
私は両方の既存のレコードを更新し、列が誰かが私説明していただけます
に一致したときに新しいレコードを追加実行することができますどのようにTSQLでのMergeの実行フロー、すなわちWHEN MATCHED --Will this Execute Everytime
WHEN NOT MATCHED by TARGET -- Will this Execute Everytime
WHEN NOT MATCHED by SOURCE -- Will this Execute Everytime
上記の3つのconditiマージ中に毎回実行されたりのみマッチング条件はこれがMERGE
は、(更新をし、同じ句に挿入)行うことを意味するものではありませんアドバンス
'その後、/ *アップデートを開始し、*/end' ... –
取得コンパイルエラー「不正な構文が近い '開始' ここに挿入します。INSERT、またはUPDATE、DELETE期待。 – Amar
よく、私は私の推測します間違っていました... –