微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL作业失败,但不是存储过程

如何解决SQL作业失败,但不是存储过程

| 编辑4/18: 我要感谢到目前为止已经回答的每个人。作为测试,我建立了一个仅一步之遥的新工作,
EXECUTE p_CallLog_GetAbandonedCallsForCallList
此过程本身运行良好,不会报告任何错误或警告,但是在作为作业的一部分执行时将不会运行。运行作业时收到的错误是:
Executed as user: NT AUTHORITY\\SYstem. OLE DB provider \'sqlOLEDB\' reported an error. [sqlSTATE 42000] (Error 7399)   [sqlSTATE 01000] (Error 7312)  OLE DB error trace 
[OLE/DB Provider \'sqlOLEDB\' IDBInitialize::Initialize returned 0x80004005:   ]. 
[sqlSTATE 01000] (Error 7300).  The step Failed.
我尝试将运行方式更改为用户选择,而我尝试的所有其他选择均导致以下错误
Executed as user: Db2WebCal. Remote access not allowed for Windows NT user activated 
by SETUSER. [sqlSTATE 42000] (Error 7410).  The step Failed.
我尝试过的所有用户链接服务器上都具有本地登录设置。 p_CallLog_GetAbandonedCallsForCallList过程如下:
CREATE       PROCEDURE [dbo].[p_CallLog_GetAbandonedCallsForCallList] 

AS
BEGIN
    DECLARE @SrvrName varchar(255)
    DECLARE @HoursOld int --only get abandoned call that are fresher than @HoursOld

    SET @HoursOld  =  2 /*was normal default     */
    SET @SrvrName = CAST(ServerProperty(\'MachineName\') as varchar(255))

    CREATE TABLE #tmpAbandonedCalls 
    (
        [ID] INT NULL,StartTime DateTime NULL,CallerIDNumber varchar(255) NULL,CallerIDCount INT NULL,Holdtime INT NULL,DIDNumber varchar(20) NULL,CustomData varchar(255) NULL,FromFirstName varchar(100) NULL,FromLastName varchar(100) NULL,CallType int NULL
    )

    IF @SrvrName <> \'ROME\' BEGIN
        INSERT INTO #tmpAbandonedCalls
        SELECT 
            cl.[ID],cl.StartTime,cl.CallerIDNumber,LastAbandonedCallID.cnt as CallerIDCount,cl.HoldTime,right(cl.DIDNumber,10) as DIDNumber,REPLACE(right(left(cl.CustomData,charindex(\';\',cl.CustomData) - 1),len(left(cl.CustomData,cl.CustomData) - 1)) - charindex(\'=\',cl.CustomData)),\' NAME\',\'\') as CustomData,cl.FromFirstName,cl.FromLastName,2 AS CallType                  -- T_L_CallType obctAbandoned
        FROM 
            [StrataCS.perceptionist.local].TVDB.dbo.CallLog CL LEFT OUTER JOIN

            /*=============================================
            This derived table lists the CallerID\'s and the most
            recent Call Log ID for candidate calls
            =============================================*/
            (
                SELECT 
                    CallerIDNumber,Max(ID) as ID,count(*) as cnt
                FROM 
                    [StrataCS.perceptionist.local].TVDB.dbo.CallLog CL 
                WHERE
                    --Last n days
                    --StartTime >= DATEADD(dd,-@DaysBack,CAST(CONVERT(VARCHAR(10),GETDATE(),112) as DATETIME))

                    --Get calls only from within the last two hours.
                    StartTime >= DATEADD(hh,-2,GETDATE())
                    AND
                    LEFT(CustomData,11) = \'CompanyName\'
                    AND
                    CHARINDEX(\'Db2ID\',CustomData) > 0
                    AND
                    CallerIDNumber <> \'\'
                    AND
                    Len(CallerIDNumber) = 10
                    AND 
                    (cl.HoldTime > 0) --0 holdtime is generally an automated call that we will not want to call again
                GROUP BY
                    CallerIDNumber
            ) as LastAbandonedCallID
            ON
            CL.CallerIDNumber = LastAbandonedCallID.CallerIDNumber
        WHERE
            --Last n days
            --StartTime >= DATEADD(dd,112) as DATETIME))

            --Get calls only from within the last two hours.
            cl.StartTime >= DATEADD(hh,(-1 * @HoursOld),GETDATE())
            AND
            --determine abandoned calls
            CASE
                    WHEN CL.Result IN (0,3,11)    THEN    0
                    WHEN CL.Result IN (1,2)        THEN    1
                    WHEN CL.Result IN (4,9)        THEN    2
                    WHEN CL.Result = 5              THEN    3
                    WHEN CL.Result = 6              THEN    4
                    WHEN CL.Result = 8              THEN    5
                    WHEN CL.Result = 10             THEN    6
                    WHEN CL.Result = 12             THEN    7
                    WHEN CL.Result = 13             THEN    8
                    WHEN CL.Result = 14             THEN    9

                    ELSE    -CL.Result
                END = 0
            --Calls which have hit the call queue will have both a CompanyName and Db2ID in custom data.
            AND
            LEFT(CustomData,11) = \'CompanyName\'
            AND
            CHARINDEX(\'Db2ID\',CustomData) > 0
            AND
            --omit calls with no caller id -- or from IGC 6143847400
            (
                CL.CallerIDNumber <> \'\'
                --OR CL.CallerIDNumber = \'6143847400\'
            )
            AND
            --make sure the caller id has 10 digits
            Len(CL.CallerIDNumber) = 10
            AND
            --The abandoned call must be the most recent call from this caller id
            --CL.ID >= isnull(LastAbandonedCallID.ID,-@DaysBack)
            CL.ID >= isnull(LastAbandonedCallID.ID,-1)
            AND 
            (CL.HoldTime > 0) --0 holdtime is generally an automated call that we will not want to call again
        ORDER BY 
            --sort by call time,most recent first.  
            StartTime DESC

        -- Company has opted out of the Abandoned Callback program
        DELETE #tmpAbandonedCalls
        FROM  
            #tmpAbandonedCalls tmp
            INNER JOIN dbo.T_CompanyPhonesetup cps
                on tmp.DIDNumber = cps.DID
            INNER JOIN T_CompanyAbandonedCallbackOptOut aco
                ON cps.CompanyID = aco.CompanyID
                    AND
                    aco.OptOutIsActive = 1

        --Delete calls that have had a terminating outcome or have been returned within the last 20 minutes
        DELETE #tmpAbandonedCalls 
        FROM
            #tmpAbandonedCalls 
            INNER JOIN 
            (
                SELECT 
                    c.CallLogID
                FROM
                    T_Call c (nolock)
                    INNER JOIN #tmpAbandonedCalls tmp
                        on tmp.ID = c.CallLogID
                    LEFT OUTER JOIN T_L_Need n
                        ON c.NeedID = n.NeedID
                    LEFT OUTER JOIN T_L_Outcome o
                        ON c.OutcomeID = o.OutcomeID
                    LEFT OUTER JOIN dbo.T_L_CallCampaignDetailStatus ccds
                        ON o.CCDetailStatusID = ccds.CCDetailStatusID
                    LEFT OUTER JOIN dbo.T_Company co
                        ON c.CompanyID = co.CompanyID
                    LEFT OUTER JOIN dbo.T_L_ProductLine pl
                        ON co.ProductLineID = pl.ProductLineID
                    LEFT OUTER JOIN T_CompanyAbandonedCallbackOptOut aco
                        ON (c.CompanyID = aco.CompanyID) and (aco.OptOutIsActive = 1)
                GROUP BY
                    c.CallLogID
                HAVING 
                    --Calls that have an outcome that include at least one terminating outcome
                    (SUM(CAST(isnull(ccds.IsTerminal,0) as INT)) > 0)
                    OR
                    (
                        --Calls that have been returned less than 20 minutes ago
                        (SUM(CAST(isnull(ccds.IsTerminal,0) as INT)) = 0)
                        AND
                        GETDATE() <= DATEADD(mi,20,Max(c.EnteredOn))
                    )
                    OR
                    (
                        --Calls for perceptionist Lite product line
                        (MAX(co.ProductLineID) = 2) -- perceptionist Lite
                    )

            ) LastCall
            ON
                #tmpAbandonedCalls.[ID] = LastCall.CallLogID

    END

    INSERT INTO T_OutboundCallList
    (TrackingID,Company,CompanyDID,Phone,CallType)
    SELECT
        #tmpAbandonedCalls.[ID],#tmpAbandonedCalls.CustomData,#tmpAbandonedCalls.DIDNumber,#tmpAbandonedCalls.CallerIDNumber,#tmpAbandonedCalls.CallType
    FROM  
        #tmpAbandonedCalls 
    ORDER BY
        StartTime


END
GO
原版的: 我有以下存储过程,用于用值填充表。
PROCEDURE [dbo].[p_OutboundCallList_Create] 

AS

BEGIN

  TruncATE TABLE T_OutboundCallList

  EXECUTE p_Leadvendor_GetCallsForCallList  
  EXECUTE p_CallCampaign_GetCallsForCallList    
  EXECUTE p_CallLog_GetAbandonedCallsForCallList    
  EXECUTE p_NoSaleFollowUp_GetCallsForCallList

END
运行此工作正常,表已满。创建作业并添加以下步骤后:
EXEC p_OutboundCallList_Create
作业失败,并显示以下错误消息:
Executed as user: NT AUTHORITY\\SYstem. Warning: Null value is eliminated 
by an aggregate or other SET operation. [sqlSTATE 01003] (Message 8153)  
Warning: Null value is eliminated by an aggregate or other SET operation. 
[sqlSTATE 01003] (Message 8153)  OLE DB provider \'sqlOLEDB\' reported an error. 
[sqlSTATE 42000] (Error 7399)  [sqlSTATE 01000] (Error 7312)  OLE DB error trace 
[OLE/DB Provider \'sqlOLEDB\' IDBInitialize::Initialize returned 0x80004005:   ]. 
[sqlSTATE 01000] (Error 7300).  The step Failed.
如果我注释掉
EXECUTE p_CallLog_GetAbandonedCallsForCallList
..工作顺利。此存储过程(p_CallLog_GetAbandonedCallsForCallList)确实依赖于链接服务器,并且本身运行良好,并且在我运行p_OutboundCallList_Create时也运行良好。仅当我将其作为作业的一部分运行时,它才会失败。我尝试以其他用户(sa,benderlele等)的身份运行,并且始终获得相同的结果(失败)。     

解决方法

\“通过合计或其他SET操作消除了空值\”是SQL Server警告,这意味着如果您运行查询并且引发此警告,则您将不会在输出中看到它(切换到\“ Messages SQL Server Management Studio中的\“标签以查看此信息)。 尽管这是一个警告,但SQL作业中的任何警告都可能导致该作业出错。修正
p_CallLog_GetAbandonedCallsForCallList
程序,这样它不会发出警告,您的工作将按预期进行。     ,我对查看ѭ8中的代码很感兴趣,因为它可能会解释为什么用户NT AUTHORITY \\ SYSTEM会发生这种情况。 当您执行汇总时(例如,对其中包含空值的数据集进行“ 10”,“ 11”,“ 12”)时,会出现此消息。 要解决此问题,您可能需要在相关字段周围放置一个ISNULL(),或使用INNER JOIN而不是LEFT或RIGHT JOIN。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。