gpt4 book ai didi

sql-server - 通过合并语句记录操作的最佳方法,可能具有识别 TSQL 错误的能力

转载 作者:行者123 更新时间:2023-12-01 05:36:38 25 4
gpt4 key购买 nike

**Update**

我用 Merge语句来执行表填充,我正在寻找一种最佳方法来实现合并语句的错误日志记录。

最初,我想记录受合并语句执行的操作(例如插入、更新、删除操作)影响的行数,而不是详细的行内容。但是,如果错误出现,记录的详细信息可能不足以识别错误原因。

第二个选项 是将 Merge 执行的所有行记录到日志表中。但是,缺点是每个业务表都需要一个日志表;并保留所有数据。

但是,由于合并执行原子操作,这意味着发生错误时没有数据要记录。因此,错误日志功能可能用于跟踪表填充逻辑中的潜在错误(如果有错误,请更正)。

我想要一种在合并语句期间记录错误的方法,以便我可以识别错误,甚至恢复数据。

任何建议将不胜感激。

要保存 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

最佳答案

I want to log the number of rows that are affected by action (e.g. insert, update, delete action) performed by merge statement, rather than detailed row contents.



要做到这一点,你就在路上!

基本上,您需要做的就是更改您的 SELECT来自 @ChangedTable成为:
SELECT Action, COUNT(*) 
FROM @ChangedTable
GROUP BY Action;

你应该得到类似的东西:
Action  (No column name)
DELETE 1
INSERT 1
UPDATE 2

这就是你要找的??

关于sql-server - 通过合并语句记录操作的最佳方法,可能具有识别 TSQL 错误的能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com