SQL Server存储过程 - 当前命令中发生严重错误

时间:2011-04-28 08:47:22

标签: sql-server sql-server-2005 tsql stored-procedures

我在编写用于生成电话统计信息的存储过程时出现异常错误。我在SQL Server 2005集群环境中运行此sproc。该过程按顺序调用大约40次(每个调用队列一次)以填充临时表,然后将此临时表插入到每个队列每天存储一行的表中。

我知道有一个修补程序可以应用于sql框但是我想在获取网络小伙伴安装补丁等之前检查我的sproc是否有任何问题

主要的sproc可以在下面看到(它是一个冗长的代码噩梦)。它使用5个视图,通过链接服务器(Cisco UCCX电话系统)连接到主电话数据库。

我遇到的错误如下:


错误消息

  

消息0,级别11,状态0,行0   当前命令发生严重错误。结果,如果有的话,   应该被丢弃   Msg 0,Level 20,Stata 0,Line 0
  当前命令发生严重错误。结果,如果有的话,   应该被丢弃


调用主要存储过程的程序

-- North
EXEC [dbo].[SP_GetStatsMain_ByCSQName] @starttime = @OfficeOpen, @endtime = @OfficeClose, @queue = N'CSQ-N003A', @date = @runDate
EXEC [dbo].[SP_GetStatsMain_ByCSQName] @starttime = @OfficeOpen, @endtime = @OfficeClose, @queue = N'CSQ-N004A', @date = @runDate
EXEC [dbo].[SP_GetStatsMain_ByCSQName] @starttime = @OfficeOpen, @endtime = @OfficeClose, @queue = N'CSQ-N005A', @date = @runDate

主要存储程序

ALTER PROCEDURE [dbo].[SP_GetStatsMain_ByCSQName]
    -- Add the parameters for the stored procedure here
    @starttime DATETIME, 
    @endtime DATETIME, 
    @queue varchar(50),
    @date DATETIME
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @start DATETIME, @end DATETIME/*, @date DATETIME
    set @date = getdate()-1*/
    set @start = DATEADD(ms, DATEDIFF(ms, 0, @starttime), DATEADD(dd, 0, DATEDIFF(dd, 0, @date)))
    set @end = DATEADD(ms, DATEDIFF(ms, 0, @endtime), DATEADD(dd, 0, DATEDIFF(dd, 0, @date)))

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
CREATE TABLE #Temp(
    [CSQName] [varchar](50) NULL,
    [Presented] [int] NULL,
    [Handled] [int] NULL,
    [Abandonded] [int] NULL,
    [Dequeued] [int] NULL,
    [HandledSLA] [float] NULL,
    [AbandondedSLA] [float] NULL,
    [AvgTalkTime] [float] NULL,
    [AvgWaitTime] [float] NULL,
    [Date] [datetime] NULL
) ON [PRIMARY]

insert into #Temp([CSQName])
SELECT    DISTINCT CSQ.CSQName
FROM         CSQ INNER JOIN Queues ON CSQ.CSQName = Queues.CSQName
WHERE     ((dateInactive IS NULL) 
OR (dateInactive < GETDATE() - 1)) AND Queues.csqname = @queue

UPDATE #temp
SET [Date] = dateadd(dd,0, datediff(dd,0,@Date))

UPDATE #temp
SET [Presented] = 0,
    [Handled] = 0,
    [Abandonded] = 0,
    [Dequeued] = 0,
    [HandledSLA] = 0,
    [AbandondedSLA] = 0,
    [AvgTalkTime] = 0,
    [AvgWaitTime] = 0

UPDATE #temp
      SET Handled =
            (
              SELECT COUNT(CQD.targetType)
              FROM ACD 
                  INNER JOIN CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum 
                        AND ACD.nodeID = CCD.nodeID 
                        AND ACD.profileID = CCD.profileID 
                  INNER JOIN CQD ON ACD.sessionID = CQD.sessionID 
                        AND ACD.sessionSeqNum = CQD.sessionSeqNum 
                        AND ACD.profileID = CQD.profileID 
                        AND ACD.nodeID = CQD.nodeID 
                  INNER JOIN CSQ ON CQD.targetID = CSQ.recordID 
                        AND CQD.profileID = CSQ.profileID 
                  INNER JOIN Queues ON CSQ.CSQName = Queues.csqname 
                  INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
              WHERE     
                  (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) 
                  AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) 
                  AND (CCD.contactDisposition = 2) 
                  AND (ACD.talkTime > 0) 
                  AND (CQD.targetType = 0) 
                  AND (CQD.disposition = 2) 
                  AND Queues.csqname = @queue
            )
      FROM ACD 
            INNER JOIN CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum 
                  AND ACD.nodeID = CCD.nodeID 
                  AND ACD.profileID = CCD.profileID 
            INNER JOIN CQD ON ACD.sessionID = CQD.sessionID 
                  AND ACD.sessionSeqNum = CQD.sessionSeqNum 
                  AND ACD.profileID = CQD.profileID 
                  AND ACD.nodeID = CQD.nodeID 
            INNER JOIN CSQ ON CQD.targetID = CSQ.recordID 
                  AND CQD.profileID = CSQ.profileID 
            INNER JOIN Queues ON CSQ.CSQName = Queues.csqname 
            INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     
            (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) 
            AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) 
            AND (CCD.contactDisposition = 2) 
            AND (ACD.talkTime > 0) 
            AND (CQD.targetType = 0) 
            AND (CQD.disposition = 2) 
            AND Queues.csqname = @queue

UPDATE #temp
      SET Presented =
            (
            SELECT     COUNT(CQD.sessionID) AS [Calls Presented]
            FROM         CQD INNER JOIN
                                  CCD ON CQD.sessionID = CCD.sessionID AND CQD.sessionSeqNum = CCD.sessionSeqNum AND CQD.profileID = CCD.profileID AND 
                                  CQD.nodeID = CCD.nodeID INNER JOIN
                                  CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                                  Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
            WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
            AND Queues.csqname = @queue
            )
            FROM         CQD INNER JOIN
                                  CCD ON CQD.sessionID = CCD.sessionID AND CQD.sessionSeqNum = CCD.sessionSeqNum AND CQD.profileID = CCD.profileID AND 
                                  CQD.nodeID = CCD.nodeID INNER JOIN
                                  CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                                  Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
            WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
            AND Queues.csqname = @queue

UPDATE #temp
      SET Abandonded =
            (
            SELECT     COUNT(CQD.sessionSeqNum) AS [Calls Abandonded]
            FROM         CCD INNER JOIN
                                  CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                                  CCD.profileID = CQD.profileID INNER JOIN
                                  CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                                  Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
            WHERE     (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
            AND Queues.csqname = @queue
            )
            FROM CCD INNER JOIN
                                  CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                                  CCD.profileID = CQD.profileID INNER JOIN
                                  CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                                  Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
            WHERE     (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
            AND Queues.csqname = @queue

UPDATE #temp
    SET Dequeued =
        (
        SELECT     COUNT(CQD.sessionSeqNum) AS [Calls Dequeued]
        FROM         CCD INNER JOIN
                              CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                              CCD.profileID = CQD.profileID INNER JOIN
                              CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName

        WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))  
                              AND (CQD.targetType = 0) AND (CQD.disposition = 3)
        AND Queues.csqname = @queue
        )
        FROM CCD INNER JOIN
                              CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                              CCD.profileID = CQD.profileID INNER JOIN
                              CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName

        WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))  
                              AND (CQD.targetType = 0) AND (CQD.disposition = 3)
        AND Queues.csqname = @queue

UPDATE #temp
    SET AbandondedSLA =
        (
        SELECT     COUNT(CQD.sessionSeqNum) AS [Calls Abandonded SLA]
        FROM         CCD INNER JOIN
                              CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                              CCD.profileID = CQD.profileID INNER JOIN
                              CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
        AND (CQD.metServiceLevel =1)
        AND Queues.csqname = @queue
        )
        FROM CCD INNER JOIN
                              CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                              CCD.profileID = CQD.profileID INNER JOIN
                              CSQ ON CQD.profileID = CSQ.profileID AND CQD.targetID = CSQ.recordID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CQD.targetType = 0) AND (CQD.disposition = 1) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102))
        AND (CQD.metServiceLevel =1)
        AND Queues.csqname = @queue

UPDATE #temp
    SET HandledSLA = 
        (
SELECT     COUNT(CQD.targetType) AS [Calls Handled SLA]
FROM         ACD INNER JOIN
                      CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND 
                      ACD.profileID = CCD.profileID INNER JOIN
                      CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND 
                      ACD.nodeID = CQD.nodeID INNER JOIN
                      CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
                      Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND
                       (CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2) AND (CQD.metServiceLevel = 1)
AND Queues.csqname = @queue
)
FROM         ACD INNER JOIN
                      CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND 
                      ACD.profileID = CCD.profileID INNER JOIN
                      CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND 
                      ACD.nodeID = CQD.nodeID INNER JOIN
                      CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
                      Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND
                       (CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2) AND (CQD.metServiceLevel = 1)
AND Queues.csqname = @queue

UPDATE #temp
    SET AvgTalkTime = 
        (
        SELECT     (SUM(CQD.queueTime)/Count(CQD.queueTime)) AS [AverageQueueTime]
        FROM         CCD INNER JOIN
                              CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
                              CCD.profileID = CQD.profileID INNER JOIN
                              CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CQD.targetType = 0) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND Queues.csqname = @queue
        )
        FROM CCD INNER JOIN
        CQD ON CCD.sessionID = CQD.sessionID AND CCD.sessionSeqNum = CQD.sessionSeqNum AND CCD.nodeID = CQD.nodeID AND 
        CCD.profileID = CQD.profileID INNER JOIN
        CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
        Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CQD.targetType = 0) AND (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND Queues.csqname = @queue

UPDATE #temp
    SET AvgWaitTime = 
        (
        SELECT    (SUM(ACD.talkTime) / COUNT(CQD.targetType)) AS [AverageTalkTime]
        FROM         ACD INNER JOIN
                              CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND 
                              ACD.profileID = CCD.profileID INNER JOIN
                              CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND 
                              ACD.nodeID = CQD.nodeID INNER JOIN
                              CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND
                               (CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2)
        AND Queues.csqname = @queue
        )
        FROM         ACD INNER JOIN
                              CCD ON ACD.sessionID = CCD.sessionID AND ACD.sessionSeqNum = CCD.sessionSeqNum AND ACD.nodeID = CCD.nodeID AND 
                              ACD.profileID = CCD.profileID INNER JOIN
                              CQD ON ACD.sessionID = CQD.sessionID AND ACD.sessionSeqNum = CQD.sessionSeqNum AND ACD.profileID = CQD.profileID AND 
                              ACD.nodeID = CQD.nodeID INNER JOIN
                              CSQ ON CQD.targetID = CSQ.recordID AND CQD.profileID = CSQ.profileID INNER JOIN
                              Queues ON CSQ.CSQName = Queues.csqname INNER JOIN #temp on CSQ.CSQName = #Temp.CSQName
        WHERE     (CCD.startDateTime > CONVERT(DATETIME, @start, 102)) AND (CCD.startDateTime < CONVERT(DATETIME, @end, 102)) AND
                               (CCD.contactDisposition = 2) AND (ACD.talkTime > 0) AND (CQD.targetType = 0) AND (CQD.disposition = 2)
        AND Queues.csqname = @queue

INSERT INTO [db_cra].[dbo].[CallData]
           ([CSQName]
           ,[Presented]
           ,[Handled]
           ,[Abandonded]
           ,[Dequeued]
           ,[HandledSLA]
           ,[AbandondedSLA]
           ,[AvgTalkTime]
           ,[AvgWaitTime]
           ,[Date])
SELECT * FROM #Temp

END

0 个答案:

没有答案