我有一系列存储过程首先执行ETL过程,然后将一些公式的结果加载到新表中。在这个过程的最后,我有一小段代码将输出表与输入表进行比较,以确保所有记录都在那里。我已将这一切都放入SQL代理作业并安排它每天早上运行。
如果我手动运行SQL Server代理程序作业,一切正常。但是,当我让代理按计划执行作业时,比较表的代码会通知我最终表中没有多个记录。在表格中的大约100万条记录中,每天只有大约2000条记录不在决赛桌中。这个数字每天都在变化。
我怀疑这是一个权限问题,因为我有其他没有此问题的代理作业。
有什么可能导致这种行为的想法?
修改
这是插入数据的代码。我的数据有三种类型,两种不同的版本。我可以将它全部构建到一个存储过程中,但是由于进程可以改变的方式,它被分成每个类型/版本组合的单独存储过程。在每个存储过程结束时,使用存储过程的结果构建临时表。例如,此临时表称为## ResultsT1Ver1,并调用UpdateResultTable,并将父存储过程的Type和Version作为参数传入。
请注意,当我运行存储过程时,我会在构建临时表之前构建一个中间表。查找标记为未将其显示到结果表的一条记录显示它在中间表中。所以我认为这个问题存在于临时表的插入或存储中。
单个存储过程每个超过300行,清理它们需要更长时间才能在此处发布。
ALTER PROCEDURE [dbo].[UpdateResultTable] @Version varchar(2), @Type varchar(15)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(4000);
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Results'))
BEGIN
IF (EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.Results') AND name = 'IDX_Results_Epinum'))
BEGIN DROP INDEX [IDX_Results_Epinum] ON dbo.Results END
END
ELSE
CREATE TABLE dbo.Results
(
ResultsId [int] IDENTITY(1,1) NOT NULL,
ValType VARCHAR(10) NULL,
Epinum VARCHAR(50) NULL,
N15 DECIMAL(25,13) NULL,
G15 DECIMAL(25,13) NULL,
N16 DECIMAL(25,13) NULL,
G16 DECIMAL(25,13) NULL,
EstablishmentId VARCHAR(9) NULL,
ServiceDate datetime NULL,
ExcludedRecord VARCHAR(11) NULL,
CONSTRAINT [PK_Results] PRIMARY KEY CLUSTERED (ResultsId)
);
SET @SQL = N'
IF EXISTS (SELECT n.Epinum FROM ##Results' + @Version + @Type + N' n INNER Join dbo.Results r on r.Epinum = n.Epinum WHERE n.N' + @VERSION + ' <> r.N' + @VERSION + ' OR n.G' + @VERSION + ' <> r.G' + @VERSION + '
OR n.ValType <> r.ValType OR n.ExcludedRecord <> r.ExcludedRecord)
BEGIN
UPDATE D
SET D.N' + @VERSION + ' = S.N' + @VERSION + ',
D.G' + @VERSION + ' = S.G' + @VERSION + ',
D.ValType = S.ValType ,
D.ExcludedRecord = S.ExcludedRecord
FROM dbo.Results D
INNER JOIN ##Results' + @Version + @Type + N' S ON D.Epinum = S.Epinum
END
ELSE
BEGIN
INSERT INTO dbo.Results
SELECT
ValType,
Epinum,'
SET @SQL = @SQL + CASE WHEN @Version = '15' THEN N'N15, G15, 0.0, 0.0, ' ELSE N'0.0,0.0,N16, G16, ' END
SET @SQL = @SQL + N'
EstablishmentId ,
ServiceDate,
ExcludedRecord
FROM ##Results' + @Version + @Type + N' S
WHERE NOT EXISTS (SELECT Epinum FROM dbo.Results D WHERE S.Epinum = D.Epinum)
END'
--select @SQL
print @sql
declare @val int;
declare @printsql NVARCHAR(4000);
set @printsql = 'declare @val int;
select @val = count(*) from ##Results' +@version + @type +'; print @val;'
exec sp_executesql @printsql;
exec sp_executesql @SQL;
CREATE NONCLUSTERED INDEX [IDX_Results_Epinum] ON dbo.Results (Epinum ASC) INCLUDE (N15, G15, N16,G16)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
END
答案 0 :(得分:0)
所以我设法通过删除使用临时表的通用upsert过程来解决问题。相反,我将数据集写入正确的表,然后在所有程序运行后,将这些单个表的结果合并为一个,然后删除表。现在似乎工作正常。奇