このシナリオでは、変更された列のみを含む XML を取得することを目的としています。 SQL Server データベースで更新トリガーを実行するときの値。この情報は、データ レプリケーションの目的にとって非常に重要です。
1 つの方法では、動的 SQL を使用して抽出するコードを構築します。変更された列の値。ただし、テーブルに多数の列がある場合、このアプローチは面倒になる可能性があります。
より効率的な解決策は、両方のピボットをアンピボットすることです。テーブルを挿入および削除し、一意のキー (ContactID)、フィールド名 (FieldName)、およびフィールド値 (FieldValue) のフィールドを含むテーブルを作成します。これら 2 つのテーブルを結合することで、FieldValue が変更された行を識別し、変更された値を得ることができます。
次のコードを考えてみましょう:
CREATE TRIGGER TriggerName ON dbo.Sample_Table FOR DELETE, INSERT, UPDATE AS BEGIN SET NOCOUNT ON; -- Unpivot deleted WITH deleted_unpvt AS ( SELECT ContactID, FieldName, FieldValue FROM (SELECT ContactID, Forename, Surname, Extn, Email, Age FROM deleted) p UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age)) AS deleted_unpvt ), -- Unpivot inserted inserted_unpvt AS ( SELECT ContactID, FieldName, FieldValue FROM (SELECT ContactID, Forename, Surname, Extn, Email, Age FROM inserted) p UNPIVOT (FieldValue FOR FieldName IN (Forename, Surname, Extn, Email, Age)) AS inserted_unpvt ) -- Join them and identify changes INSERT INTO Sample_Table_Changes (ContactID, FieldName, FieldValueWas, FieldValueIs) SELECT Coalesce(D.ContactID, I.ContactID) ContactID, Coalesce(D.FieldName, I.FieldName) FieldName, D.FieldValue AS FieldValueWas, I.FieldValue AS FieldValueIs FROM deleted_unpvt D FULL OUTER JOIN inserted_unpvt I ON D.ContactID = I.ContactID AND D.FieldName = I.FieldName WHERE D.FieldValue <> I.FieldValue OR (D.FieldValue IS NOT NULL AND I.FieldValue IS NULL) OR (D.FieldValue IS NULL AND I.FieldValue IS NOT NULL); -- Use the contents of Sample_Table_Changes for replication END GO
この非宣言的なアプローチは、複雑な動的 SQL を使用したり、ビットフィールド算術オーバーフローの問題に直面したりすることなく、変更、削除、挿入を効果的に処理します。また、追加の GUID 列が識別に使用されている限り、自然主キーの変更の影響を受けません。
以上がSQL Server 更新トリガーから変更されたフィールドのみを効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。