查看数据转换失败 - SQL Server

Posted

技术标签:

【中文标题】查看数据转换失败 - SQL Server【英文标题】:View failing on data conversion - SQL Server 【发布时间】:2021-11-17 15:23:38 【问题描述】:

我需要帮助重新设计视图。目前,当您对视图进行简单选择时,它会出错。错误如下。

将数据类型 nvarchar 转换为 bigint 时出错

这是视图的当前设计。

SELECT  
    FirstName,
    MiddleName, 
    LastName,           
    CONVERT(bigint, SUBSTRING(Reference, 2, 10)) AS LogNum,     
    Address,
    Birthday,
    Gender,
    BirthDate,
    Gender,     
    ClientCode 
FROM 
    dbo.Client 
WHERE 
    (Reference LIKE 'C%')

出现问题是因为具有 nvcarchar(16) 数据类型的引用列具有如下值。

'C3456423445'  
'2234567310'  
'C8921244532' 

substring 函数基本上去掉了“C”并将其后面的 10 位数字作为 bigint 返回。

现在发生的情况是有新数据进入客户端表,其引用列的值如下

"CC4309842387"    
"CC29383761760"

由于新值中有一个额外的 C,因此该函数无法正常工作。

我需要重新设计视图,以便它可以处理引用列中值的两次迭代。重要的是前端报告中完整的 10 位数字。

感谢您的帮助。

【问题讨论】:

你有什么版本的SQL Server?主角只是'C's? nvcarchar(16)SUBSTRING(Reference, 2, 10) 不一致。细节很重要!如果您正确跳过“CC”,您是否注意到使用长度为 10 的“CC29383761760”的最后一个字符?这是一个问题吗? @SMor,由于视图现在运行时出现错误,我们甚至没有注意到我们可能会丢失最后一个字符。这将是一个问题。 @RBarryYoung,是的,目前我们拥有的主要字符是“C”和“CC”。我们也有没有提到的主角的价值观。那些完好无损 【参考方案1】:

如果只有“C”和“CC”两个选项,那么您可以使用 REPLACE 和 LEFT 而不是 SUBSTRING。

SELECT  
    FirstName,
    MiddleName, 
    LastName,           
    Convert(bigint,Left(Replace(Reference, 'C',''),10)) AS LogNum,     
    Address,
    Birthday,
    Gender,
    BirthDate,
    Gender,     
    ClientCode 
FROM dbo.Client 
WHERE (Reference LIKE 'C%')

【讨论】:

我并没有故意使用 try_convert,因为它可能会导致新选项被跳过,所以最好得到错误而不是误导数据。 在我的脑海中,我宁愿识别和捕获 NULL,也不愿抛出错误并强制 ABEND。【参考方案2】:

如果不是前面的 C,你可以使用patindex() 来查找第一个数字的位置

另外,我更喜欢try_convert(),因为如果转换失败,它将返回 NULL 而不是抛出错误。

示例

Declare @YourTable Table ([Reference] nvarchar(50))  Insert Into @YourTable Values 
 ('C3456423445')
,('2234567310')
,('C8921244532')
,('CC29383761760')
,('XX29383761760')

Select *
      ,NewValue = try_convert(bigint,substring([Reference],patindex('%[0-9]%',[Reference]),25))
 from @YourTable

结果

Reference       NewValue
C3456423445     3456423445
2234567310      2234567310
C8921244532     8921244532
CC29383761760   29383761760
XX29383761760   29383761760

【讨论】:

以上是关于查看数据转换失败 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 文件导入 SQL Server 时唯一标识符转换失败

sql server:错误 0xc02020a1: 数据流任务 1: 数据转换失败。列“列 0”的数据转换返回状态值 4 和状态文本“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。 (

解决sql server保存对象字符串转换成uniqueidentifier失败的问题

在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

SQL Server 查询(查看)将字符串转换为日期时间

删除 SQL Server 数据库