无法将nvarchar值转换为int

时间:2013-11-05 00:16:36

标签: sql

我正在创建一个程序如下,当我运行它时,我得到以下错误

  

客户端渲染期间发生错误   报告处理期间发生错误   无法读取数据集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 个答案:

答案 0 :(得分:2)

因为我不知道您的数据库的内容,但我认为您的问题可能在这里:ON en.ENQ_LANGUAGE = lov.ID。我猜测ENQ_LANGUAGE是包含'Swedish'的nvarchar,因此与lov.ID的比较失败。

答案 1 :(得分:0)

当您尝试将文本Swedish转换为整数时,您会发生什么?正如@devinallenaz指出的那样,表enquiry的列enq_language很可能是nvarchar并且包含非数字数据,并且在尝试将其转换为要加入的整数时会发生故障对于表DW_Admin.dw_hold_listofvalue的列id(可能是整数)。

解决问题细节的常用方法是将查询剥离到最小的工作状态。在您的情况下,注释掉结果集中的所有列,并用count(*)之类的内容替换它们。然后完整地注释掉where子句以及from子句中的所有表引用(第一个除外)。

运行查询。它有用吗?如果没有找出问题并修复它。

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

如果你在没有找到错误的情况下完成了from子句,那么就开始取消注释where子句,一次一个。

确定故障点后,请对其进行调试。使用group by运行选择查询以生成所涉及列的频率表。您可能希望在此处添加where语句以删除仅包含十进制数字的任何数据。这可能会识别违规数据。

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

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

祝你好运。