2016-11-08 134 views
2

我有一系列存储过程首先执行ETL过程,然后将某些公式的结果加载到新表中。在这个过程结束时,我有一小段代码将输出表与输入表进行比较,以确保所有记录都在那里。我已经将这一切都放到了SQL Agent作业中,并计划在每天早上运行。存储过程执行时间与预定vs手动执行不同

如果我手动运行SQL Server代理作业,一切正常。但是,当我让代理按计划执行作业时,比较表的代码会通知我一些记录不在最终表中。在表中大约100万条记录中,每天只有大约2000条记录不在决赛桌中。这个数字每天都在变化。

我怀疑这是一个权限问题,因为我有其他代理作业没有这个问题。

有什么想法可能会导致此行为?

编辑

这是做数据的插入的代码。我的数据有三种类型和两种不同的版本。我可以将它全部构建到一个存储过程中,但由于过程可以更改的方式,因此每个类型/版本组合都会拆分为单独的存储过程。在每个存储过程结束时,将使用存储过程的结果构建临时表。例如,此临时表称为## ResultsT1Ver1,并调用UpdateResultTable,并将父存储过程的类型和版本作为参数传入。

请注意,当我运行我的存储过程时,我构建临时表之前构建中间表。查找一个被标记为没有进入结果表的记录表明它在中间表中。所以我认为这个问题存在于插入或临时表的存储中。

单个存储过程每个超过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' [email protected] + @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

您还有其他代理作业在表上具有插入权限,还是至少将记录插入同一模式中的相似表中? – scsimon

+0

您是否从多个地点进行加载?有没有可能其中一个失败? 您可以尝试的一个选项是将您自己的帐户设置为凭证/代理,并将作业步骤配置为使用您的帐户运行。看看它是否有效。 – Nayak

+0

@scsimon我还有一份工作是从同一个sourcedb复制数据,但是会丢弃并重建最终表格。有问题的工作有6个sp都插入到同一个表中。 – Matt

回答

0

所以我设法通过消除使用临时表的普遍UPSERT程序来解决这个问题。相反,我将数据集写入适当的表,然后在所有过程运行后,将这些单独表的结果合并为一个,然后删除表。似乎现在工作正常。奇数