2011-04-14 96 views
0

編輯4/18: 我想感謝所有已回答的人。作爲一個測試,我已經建立了一個新的工作,這有它只需一個步驟,SQL作業失敗但不是存儲過程

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,charindex(';',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,[email protected],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,[email protected],CAST(CONVERT(VARCHAR(10),GETDATE(),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,[email protected]) 
      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 

ORIGINAL: 我有一個用於填充的表值以下存儲過程。

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 

..the工作運行良好。這個存儲過程(p_CallLog_GetAbandonedCallsForCallList)確實依賴於一個鏈接的服務器,並且自行運行良好,並且在運行p_OutboundCallList_Create時也可以正常運行。當我將它作爲工作的一部分運行時,它只會失敗。我嘗試以不同的用戶身份運行(sa,benderle等),並始終得到相同的結果(失敗)。

+0

所有的評論似乎已被刪除。我留下一個暗示作業運行的帳戶可能需要此設置http://support.microsoft。com/kb/814398 – 2011-04-15 10:27:14

回答

0

「集合或其他SET操作消除空值」是SQL Server警告,這意味着如果運行查詢並引發此警告,您將不會在輸出中看到它(切換到「消息「選項卡在SQL Server Management Studio中以查看此)。

雖然這是一個警告,但可能是SQL作業中的任何警告都會導致作業出錯。修復p_CallLog_GetAbandonedCallsForCallList程序,使其不會引發該警告,您的工作將按預期工作。

0

如果您有興趣查看p_CallLog_GetAbandonedCallsForCallList中的代碼,它可能會解釋爲什麼會發生這種情況的原因是用戶NT AUTHORITY \ SYSTEM。

當您執行聚合時(例如,在其中包含空值的數據集上的sum(),max(),count()),將發生此消息。

若要解決此問題,您可能需要在問題字段周圍放置ISNULL(),或者使用INNER JOIN而不是LEFT或RIGHT JOIN。

+1

我假設它只是在錯誤消息中報告它收到的所有消息。感興趣的似乎是鏈接服務器的'Initialize'錯誤。 – 2011-04-14 14:35:10