Лучшие способы регистрации действий с помощью оператора слияния, потенциально с возможностью определения ошибки в TSQL - PullRequest
4 голосов
/ 25 ноября 2011
**Update**

Я использую оператор Merge для выполнения заполнения таблицы, я ищу лучший способ реализовать регистрацию ошибок для оператора объединения.

Изначально я хочу войти в системуколичество строк, на которые влияют действия (например, вставка, обновление, удаление), выполняемые оператором слияния, а не подробное содержимое строки.Тем не менее, зарегистрированных сведений может быть недостаточно для определения причины ошибки, если ошибка возросла.

Второй параметр заключается в регистрации всех строк, выполненных слиянием, в таблице журнала.Однако недостатком является то, что для каждой бизнес-таблицы требуется одна таблица журналирования;и сохранить все данные.

Однако, поскольку слияние выполняет атомарные операции, это означает, что нет данных для регистрации при возникновении ошибки.Таким образом, функция регистрации ошибок, вероятно, используется для отслеживания потенциальной ошибки в логике заполнения таблицы (пожалуйста, исправьте ее, если она ошибочна).

Мне нужен способ регистрации ошибок во время оператора слияния, чтобы я мог определитьошибка, или даже восстановить данные.

Любой совет будет очень признателен.

Чтобы сохранить результат слияния, используйте Merge OUTPUT INTO, чтобы вставить все затронутые строки в таблицу, и @@RowCount, ниже:

DECLARE @ChangedTable Table (
Action Varchar(20),
TargetProductID Int,
TargetProductName Varchar(100),
TargetRate Money,
SourceProductID Int, 
SourceProductName Varchar(100), 
SourceRate Money
)

--Synchronize the target table with
--refreshed data from source table
MERGE Products AS TARGET
USING UpdatedProducts AS SOURCE 
ON (TARGET.ProductID = SOURCE.ProductID) 
--When records are matched, update 
--the records if there is any change
WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName 
OR TARGET.Rate <> SOURCE.Rate THEN 
UPDATE SET TARGET.ProductName = SOURCE.ProductName, 
TARGET.Rate = SOURCE.Rate 

--When no records are matched, insert
--the incoming records from source
--table to target table
WHEN NOT MATCHED BY TARGET THEN 
INSERT (ProductID, ProductName, Rate) 
VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate)
--When there is a row that exists in target table and
--same record does not exist in source table
--then delete this record from target table
WHEN NOT MATCHED BY SOURCE THEN 
DELETE
--$action specifies a column of type nvarchar(10) 
--in the OUTPUT clause that returns one of three 
--values for each row: 'INSERT', 'UPDATE', or 'DELETE', 
--according to the action that was performed on that row
OUTPUT $action, 
DELETED.ProductID AS TargetProductID, 
DELETED.ProductName AS TargetProductName, 
DELETED.Rate AS TargetRate, 
INSERTED.ProductID AS SourceProductID, 
INSERTED.ProductName AS SourceProductName, 
INSERTED.Rate AS SourceRate
INTO @ChangedTable;

select * from @ChangedTable;

SELECT @@ROWCOUNT;

Любая идея будет очень признательна.

Таблицы:

--Create a target table
CREATE TABLE Products
(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Rate MONEY
) 
GO
--Insert records into target table
INSERT INTO Products
VALUES
(1, 'Tea', 10.00),
(2, 'Coffee', 20.00),
(3, 'Muffin', 30.00),
(4, 'Biscuit', 40.00)
GO
--Create source table
CREATE TABLE UpdatedProducts
(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Rate MONEY
) 
GO
--Insert records into source table
INSERT INTO UpdatedProducts
VALUES
(1, 'Tea', 10.00),
(2, 'Coffee', 25.00),
(3, 'Muffin', 35.00),
(5, 'Pizza', 60.00)
GO
SELECT * FROM Products
SELECT * FROM UpdatedProducts
GO

1 Ответ

1 голос
/ 25 ноября 2011

Я хочу записать количество строк, на которые влияет действие (например, вставка, обновление, удаление), выполняемое оператором слияния, а не подробное содержимое строки.

Чтобы сделать это, вы уже в пути!

По сути, все, что вам нужно сделать, это изменить SELECT с @ChangedTable на:

SELECT Action, COUNT(*) 
FROM @ChangedTable
GROUP BY Action;

и вы должны получить что-то вроде:

Action  (No column name)
DELETE        1
INSERT        1
UPDATE        2

Это то, что вы ищете ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...