当我从存储过程中提取这段代码时,我已将其更改为包含硬编码变量。我使用相同的结果独立于应用程序运行它。如果每个处理的记录共享满足所需的条件,我需要一个insert语句和一个update语句来执行。结果是每个处理的共享执行两个插入语句,我不明白如何跟踪这是如何发生的。第一种是某种意义上的丢失。
-- Declare variables for the fields of the tables.
DECLARE @CurrentMetricID Int = 3090758;
DECLARE @CurrentSharedMetricID Int;
DECLARE @NewMetricID Int = 3090778;
DECLARE @NewSharedMetricID Int;
IF (EXISTS(SELECT b.SharedMetricID
FROM Shared_Metrics b
WHERE b.MetricID = @CurrentMetricID and b.nextRecordID is NULL ))
BEGIN --METRIC PUBLISH FIRST
DECLARE cr_metric_first CURSOR FOR
SELECT sm.SharedMetricID
FROM Shared_Metrics sm
WHERE sm.MetricID = @CurrentMetricID AND sm.nextRecordID is NULL;
OPEN cr_metric_first
FETCH NEXT FROM cr_metric_first INTO @CurrentSharedMetricID;
WHILE @@FETCH_STATUS = 0
BEGIN -- Metric Publishing First
INSERT INTO Shared_Metrics(MetricID, ScorecardID, SortOrder,
MetricOrder, CategoryOrder, RptCurrentGroup,
CreatedBy, DateCreated, UpdatedBy, DateUpdated,
isDeleted,ReportPeriodStart,nextRecordID)
SELECT @NewMetricID,
NULL,
sm.sortorder,
ISNULL(sm.MetricOrder, 1),
ISNULL(sm.CategoryOrder, 1),
sm.RptCurrentGroup,
'System',
GetDate(),
NULL,
NULL,
'N',
NULL,
NULL
FROM Metric_Instance mi
INNER JOIN Shared_Metrics sm on mi.MetricID = sm.MetricID
WHERE mi.MetricID = @CurrentMetricID
AND mi.MetricDisposition <> 'Suspended'
AND mi.isDeleted <> 'Y'
AND sm.isDeleted <> 'Y';
SELECT @NewSharedMetricID = scope_identity();
-- Check for errors
IF @@ERROR <> 0
BEGIN
select 'error';
-- Determine if the cursors exists and deallocate them.
IF (SELECT CURSOR_STATUS('global','cr_metric_first')) >= -1
BEGIN
CLOSE cr_metric_first;
DEALLOCATE cr_metric_first;
END;
-- ROLLBACK TRANSACTION the transaction
ROLLBACK TRANSACTION
-- Raise an error and return
RAISERROR ('Publishing Error: Cannot insert new shared metric record for next reporting period.', 16, 1)
RETURN
END; -- of Error
-- Update with the new SharedMetricID
UPDATE Shared_Metrics
SET nextRecordID = @NewSharedMetricID
WHERE MetricID = @CurrentMetricID AND SharedMetricID = @CurrentSharedMetricID;
IF @@ERROR <> 0
BEGIN
select 'error';
-- Determine if the cursors exists and deallocate them.
IF (SELECT CURSOR_STATUS('global','cr_metric_first')) >= -1
BEGIN
CLOSE cr_metric_first;
DEALLOCATE cr_metric_first;
END;
-- ROLLBACK TRANSACTION the transaction
ROLLBACK TRANSACTION
-- Raise an error and return
RAISERROR ('Publishing Error: Cannot update shared metric NextRecordID.', 16, 1)
RETURN
END; -- of Error
FETCH NEXT FROM cr_metric_first INTO @CurrentSharedMetricID;
END;-- Metric Publishing First
CLOSE cr_metric_first;
DEALLOCATE cr_metric_first;
END; --METRIC PUBLISH FIRST
分析数据后,插入的第一个共享记录不会继续执行更新语句。第二个插入必须紧跟在它之后,并且创建的记录是在update语句中获取和使用的信息。当处理列表中的第二个共享时,会发生同样的事情。由于仅插入的第二个记录正在移动到更新语句,因此第一个记录基本上丢失到应用程序。它的关键字段永远不会链接回旧记录(Slowly Changing Dimension)。当应用程序运行时,它会从此表中提取信息,而那些未链接回来的记录永远不会添加到要在屏幕上显示给用户的度量列表中。似乎应用程序中的所有内容都是正常运行的,但是那些从未被链接回来的遗忘记录仍在处理并转移到下个月,因为代码通过MetricID查找它们。
创建共享的第一个月,表中的每个共享指标记录只存在一条记录。在第二个月之后,现在有一个额外的记录没有被应用程序为每个已处理的份额提取但仍占用内存和处理能力。在第三个月之后,每条记录共享额外的2条记录。在第四个之后,有4个。它呈指数增长。这是共享的每条记录,因为应用程序没有显示任何内容,我注意到的唯一原因是因为拉取和处理的记录数量导致预期数量加倍的结果,开始减慢服务器的速度。好像存在无限循环,因为这会降低处理能力。我终于找到了为什么应用程序似乎冻结,然后在代码尝试为一个共享记录处理超过65K股票后超时。