查看数据转换失败 - 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失败的问题