2013-11-05 103 views
0

我創建過程如下,當我運行它,我得到下面的錯誤客戶端呈現過程中發生無法轉換爲nvarchar值爲int

錯誤。
報告處理過程中發生錯誤。
無法讀取數據集dsCitiDriverStats的下一個數據行。 將nvarchar值'Swedish'轉換爲數據類型int時轉換失敗。

存儲過程的源代碼如下:

Create PROCEDURE [dbo].[usp_DWReport_CITICallDrivers_Test1] 
    @pTransactionsCreatedFrom DATETIME, 
    @pTransactionsCreatedTo DATETIME, 
    @pCallerType NVARCHAR(4000), 
    @pCompany NVARCHAR(4000) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET DATEFIRST 1; 

    DECLARE @ComCount int 

    SET @ComCount = (SELECT CAST(LEN(@pCompany) AS int)) 
    print @ComCount 

    IF @ComCount < 4000 
    BEGIN 
    SELECT en.ENQ_CREATION_DT AS [Date] , 
     DATEPART(dw, en.ENQ_CREATION_DT) AS WeekDayNo, 
     en.ENQ_SOURCE AS CallType, 
     CASE enq_caller_type 
      WHEN '1389' THEN '3rd' 
      WHEN '1390' THEN 'CAS' 
      WHEN '1391' THEN 'CH' 
      WHEN '1392' THEN 'PA' 
      ELSE NULL 
     END AS CallerType, 
     RIGHT(en.ENQ_CC_NUMBER, 6) AS Last6DigitsOfCardNo, 
     en.ENQ_CUSTOMER_NAME AS CustomerName, 
     en.ENQ_COMPANY_NAME AS CustomerCompany, 
     a.ACCNT_CON_FST_NAME AS LineOfBusiness, 
     en.ENQ_ECOUNT_ID AS EcountID, 
     lov.Value1 AS [Language], 
     en.ENQ_OUTCOME AS ClassificationOfTheCall, 
     en.ENQ_COMMENTS_LONG AS Comments, 
     en.ENQ_CREATOR_LOGIN AS AgentInitials, 
     CASE en.ENQ_CUSTOM_CHK1 
      WHEN 1 THEN 'Yes' 
      WHEN 0 THEN 'No' 
      ELSE NULL 
     END AS VIP 
    FROM ENQUIRY      en 
    JOIN ACCOUNTS      a ON a.ACCNT_ID  = en.ENQ_ACCNT_CSN 
    JOIN DW_Admin.dw_hold_listofvalue lov ON en.ENQ_LANGUAGE = lov.ID 
    WHERE en.ENQ_CREATION_DT >= @pTransactionsCreatedFrom 
    AND en.ENQ_CREATION_DT < DATEADD(dd, DATEDIFF(dd, 0, @pTransactionsCreatedTo) + 1, 0) 
    AND a.ACCNT_CON_FST_NAME IN (SELECT s.Item FROM dbo.Split(@pCallerType , ',') s) 
    AND en.ENQ_COMPANY_NAME IN (SELECT s.Item FROM dbo.Split(@pCompany , ',') s) 

END 
ELSE 
BEGIN 

    print 'more than 4K' 
    SELECT en.ENQ_CREATION_DT AS [Date], 
     DATEPART(dw, en.ENQ_CREATION_DT) AS WeekDayNo, 
     en.ENQ_SOURCE AS CallType, 
     CASE enq_caller_type 
      WHEN '1389' THEN '3rd' 
      WHEN '1390' THEN 'CAS' 
      WHEN '1391' THEN 'CH' 
      WHEN '1392' THEN 'PA' 
      ELSE NULL 
     END AS CallerType, 
     RIGHT(en.ENQ_CC_NUMBER, 6) AS Last6DigitsOfCardNo, 
     en.ENQ_CUSTOMER_NAME AS CustomerName, 
     en.ENQ_COMPANY_NAME AS CustomerCompany, 
     a.ACCNT_CON_FST_NAME AS LineOfBusiness, 
     en.ENQ_ECOUNT_ID AS EcountID, 
     lov.Value1 AS [Language], 
     en.ENQ_OUTCOME AS ClassificationOfTheCall, 
     en.ENQ_COMMENTS_LONG AS Comments, 
     en.ENQ_CREATOR_LOGIN AS AgentInitials, 
     CASE en.ENQ_CUSTOM_CHK1 
      WHEN 1 THEN 'Yes' 
      WHEN 0 THEN 'No' 
      ELSE NULL 
     END AS VIP 
    FROM ENQUIRY      en 
    JOIN ACCOUNTS      a ON a.ACCNT_ID  = en.ENQ_ACCNT_CSN 
    JOIN DW_Admin.dw_hold_listofvalue lov ON en.ENQ_LANGUAGE = lov.ID 
    WHERE en.ENQ_CREATION_DT >= @pTransactionsCreatedFrom 
    AND en.ENQ_CREATION_DT < DATEADD(dd, DATEDIFF(dd, 0, @pTransactionsCreatedTo) + 1, 0) 
    AND a.ACCNT_CON_FST_NAME IN (SELECT s.Item FROM dbo.Split(@pCallerType , ',') s) 
    AND en.ENQ_COMPANY_NAME IN (SELECT DISTINCT 
             COMP_NAME 
            FROM COMPANIES 
            WHERE COMP_STATUS = 'Active' 
           ) 

END 

RETURN 0 
END 

請告知

回答

2

只是一個猜測,因爲我不知道你的數據庫的內容,但我覺得你的問題可能在這裏:ON en.ENQ_LANGUAGE = lov.ID。我猜ENQ_LANGUAGE是一個包含'Swedish'的nvarchar,因此與lov.ID的比較失敗。

0

當您嘗試將文本Swedish轉換爲整數時,您會發生什麼?正如@devinallenaz指出的,很可能表enquiry的列enq_languagenvarchar並且包含非數字數據,並且在嘗試將其轉換爲整數以針對表DW_Admin.dw_hold_listofvalue的列id(可能是整數)。

整理問題細節的常用方法是將查詢刪除到最低限度的工作。在你的情況下,註釋掉結果集中的所有列,並用count(*)之類的東西替換它們。然後將where子句全部註釋掉,以及from子句中的所有表格引用(第一個除外)。

運行查詢。它工作嗎?如果不能識別問題並修復它。

如果是這樣,請取消註釋from子句中的下一個表。如果他們在聯合標準中多於一個比較,則僅取消第一個評論。運行。它工作嗎?如果是這樣,請一次取消註釋其餘的加入標準。如果仍然有效,請使用from子句中的下一個表格重複練習。

如果通過from子句沒有發現錯誤,則開始取消註釋where子句,一次一個。

一旦確定了故障點,請進行調試。使用group by運行選擇查詢來生成涉及的列的頻率表。您可能希望在此處添加where語句以刪除僅包含十進制數字的任何數據。這可能會識別有問題的數據。

現在您必須決定是清理數據(如果是數據問題)還是在查詢中解決它。如果您清理數據,您可能需要考慮在代碼中加入警戒,以防止垃圾數據蔓延。

這裏沒有涉及火箭科學。只是老式的警察工作。

祝你好運。