0

我正在创建如下程序,当我运行它时,出现以下错误

客户端渲染期间发生错误。
报告处理过程中发生错误。
无法读取数据集 dsCitiDriverStats 的下一个数据行。将 nvarchar 值“瑞典语”转换为数据类型 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

请指教

4

2 回答 2

2

只是猜测,因为我不知道您的数据库的内容,但我认为您的问题可能在这里:ON en.ENQ_LANGUAGE = lov.ID. 我猜这ENQ_LANGUAGE是一个包含“瑞典语”的 nvarchar,所以比较lov.ID失败。

于 2013-11-05T00:22:56.570 回答
0

当您尝试将文本Swedish转换为整数时,您期望会发生什么?正如@devinallenaz 指出的那样,很可能 tableenquiry的列enq_language是一个nvarchar并且包含非数字数据,并且在尝试将其转换为整数以加入 tableDW_Admin.dw_hold_listofvalue的列id(可能是整数)时失败。

整理出问题细节的常用方法是将查询精简到可以工作的最低限度。在您的情况下,注释掉结果集中的所有列,并将它们替换为count(*). where然后将整个子句以及子句中的所有表引用from(第一个除外)注释掉。

运行查询。它有效吗?如果没有发现问题并修复它。

如果是这样,请取消注释from子句中的下一个表。如果它们在连接条件中有多个比较,则仅取消注释第一个。运行。它有效吗?如果是这样,请一次取消注释剩余的连接条件。from如果它仍然有效,请使用子句中的下一个表重复该练习。

如果您通过 from 子句但没有发现错误,请开始取消对 where 子句的注释,一次一个。

确定故障点后,对其进行调试。使用 a 运行选择查询group by以生成所涉及列的频率表。您可能需要在此处添加 where 语句以删除仅由十进制数字组成的任何数据。这可能会识别出有问题的数据。

现在您必须决定是清理数据(如果是数据问题)还是在查询中解决它。如果您清理数据,您可能需要考虑在代码中加入防护措施,以防止垃圾数据潜入。

这里不涉及火箭科学。只是老式的警察工作。

祝你好运。

于 2013-11-05T01:18:00.907 回答