sql-server - MsSQL xml 解析为十进制

标签 sql-server xml tsql null type-conversion

我正在用这个存储过程处理 xml

select
    col.query('./AgreementId').value('.','uniqueidentifier') as [AgreementId],
    x.query('./GrossValue').value('.','decimal(19, 4)') as [GrossValue]
    into #AdvanceInvoices
    from @XML.nodes('/DataFromERP/CustomObjects/Agreements/Agreement') as ref(col)
    cross apply ref.col.nodes('AdvanceInvoices/AdvanceInvoice') as T(x)

问题是GrossValue,可以为空

<GrossValue></GrossValue>

可能是这样的时候,我得到了一个错误

Error converting data type nvarchar to numeric

我如何准备它以获得 0.0 而不是错误?

编辑:

我想到了

CAST(COALESCE(NULLIF(ISNULL(x.query('./GrossValue').value('.','nvarchar(50)'),''),''),'0.0') as decimal(19,4)) as [GrossValue],

但是真的很丑

最佳答案

早在 TRY_CASTTRY_CONVERT 发明之前,就有一个 XQuery 转换:

DECLARE @SomeTable TABLE(ID INT IDENTITY, SomeXML XML);
INSERT INTO @SomeTable VALUES
 (N'<DATA><SomeNumber>1</SomeNumber></DATA>')     --integer
,(N'<DATA><SomeNumber>1.1</SomeNumber></DATA>')   --decimal
,(N'<DATA><SomeNumber></SomeNumber></DATA>')      --empty
,(N'<DATA><SomeNumber>abc</SomeNumber></DATA>')   --invalid
,(N'<DATA><SomeNumber>.123</SomeNumber></DATA>')  --short

SELECT t.SomeXML.value(N'/DATA[1]/SomeNumber[1]/text()[1] cast as xs:decimal?',N'decimal(19,4)')
FROM @SomeTable AS t

当值不可转换时,使用 cast as xs:decimal? 将返回 NULL

为了获得 0.0 而不是 NULL,您可以使用 ISNULL() 函数(正如 TT 所指出的那样) .

作为提示:

在旧版本中,如果 TRY_ 调用不起作用,这是一个很好的解决方法:

DECLARE @InvalidNumber VARCHAR(100)='123a'
       ,@ValidNumber VARCHAR(100)='123';

SELECT (SELECT @InvalidNumber FOR XML PATH(''),TYPE).value(N'. cast as xs:int?',N'int') AS InvalidNumber
      ,(SELECT @ValidNumber FOR XML PATH(''),TYPE).value(N'. cast as xs:int?',N'int') AS ValidNumber;

或者更简单,只是一个转换:

DECLARE @InvalidNumber VARCHAR(100)='123a'
       ,@ValidNumber VARCHAR(100)='123';

SELECT CAST(@InvalidNumber AS XML).value(N'. cast as xs:int?',N'int') AS InvalidNumber
      ,CAST(@ValidNumber AS XML).value(N'. cast as xs:int?',N'int') AS ValidNumber

关于sql-server - MsSQL xml 解析为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48341049/

相关文章:

sql - 哪里使用SQL的列级加密?

SQL Server 上用于查询成本估算的 SQL

c# - 构建时的 SqlServer 类型错误

SQL-如何将两个日期拆分为年度格式

php - 如何使用 PHP 将 sql 数据按顺序组织

c# - 使用嵌套 XSD 架构的 XML 验证错误 - 类型未声明

Java:读取 XML 文件并将信息存储在文本文件中的快速方法

xml - 最佳实践 : XML attribute vs XML element - When should I use elements and when should I use attributes?

sql-server - 无法在 SQl 2008 中创建非索引字表

sql-server - 级联外连接