我有一系列存儲過程首先執行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
您還有其他代理作業在表上具有插入權限,還是至少將記錄插入同一模式中的相似表中? – scsimon
您是否從多個地點進行加載?有沒有可能其中一個失敗? 您可以嘗試的一個選項是將您自己的帳戶設置爲憑證/代理,並將作業步驟配置爲使用您的帳戶運行。看看它是否有效。 – Nayak
@scsimon我還有一份工作是從同一個sourcedb複製數據,但是會丟棄並重建最終表格。有問題的工作有6個sp都插入到同一個表中。 – Matt