我正在创建一个程序如下,当我运行它时,我得到以下错误
客户端渲染期间发生错误 报告处理期间发生错误 无法读取数据集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
请告知
答案 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语句以删除仅包含十进制数字的任何数据。这可能会识别违规数据。
现在您必须决定是否清理数据(如果是数据问题)或在查询中解决它。如果清理数据,可能需要考虑在代码中加入防护,以防止垃圾数据进入。
这里没有涉及火箭科学。只是老式的警察工作。
祝你好运。