计划与手动执行时存储过程执行不同

时间:2016-11-08 22:32:07

标签: sql sql-server tsql sql-server-2012 sql-agent-job

我有一系列存储过程首先执行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

1 个答案:

答案 0 :(得分:0)

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