2016-11-08 133 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程序來解決這個問題。相反,我將數據集寫入適當的表,然後在所有過程運行後,將這些單獨表的結果合併爲一個,然後刪除表。似乎現在工作正常。奇數