我假设您收到带有此标签包含空字符串的行的0或转换错误。
您可以将XML分解为varchar值,然后在TSQL中进行验证和类型转换:
SELECT
[Weight] =
CASE WHEN ISNULL(SHPReportData.value('(RawDataItem/Weight)[1]','VARCHAR(15)'),'') = '' THEN NULL
ELSE CAST(SHPReportData.value('(RawDataItem/Weight)[1]','VARCHAR(15)') AS DECIMAL(10,2)) END,[WeightUQ] = SHPReportData.value('(RawDataItem/UQ)[1]','VARCHAR(2)')
FROM
@XML.nodes('RawData') c (SHPReportData);
,
可接受的解决方案有效,但是可以做得更好:
-XML带有一个十进制值,一个空节点和一个空白节点。
-添加具有不可广播值“ hello”的节点,以使用此方法也测试方法。
DECLARE @xml XML=N'<a>123.456</a>
<a/>
<a> </a>';
--add one more with a non-castable value
-- <a>hello</a>';
-“分段”方法:读取字符串并从外部进行
SELECT a.value('text()[1]','nvarchar(max)') worksInAnyCase
FROM @xml.nodes('/a') A(a)
-类型安全的方法对于非十进制数将失败
SELECT a.value('text()[1]','decimal(6,3)') FailsForHello
FROM @xml.nodes('/a') A(a)
-XQuery的演员表可以在这里提供帮助
SELECT a.value('text()[1] cast as xs:decimal?',3)') WorksImplicitly
FROM @xml.nodes('/a') A(a)
-TRY_CAST也有帮助(需要v2012 +)
SELECT TRY_CAST(a.value('text()[1]','nvarchar(max)') AS DECIMAL(6,3)) castedIfPossible
FROM @xml.nodes('/a') A(a)
-NULLIF可能也有帮助,但是您好会过去
SELECT NULLIF(a.value('text()[1]','nvarchar(max)'),'') NullForBlanks
FROM @xml.nodes('/a') A(a)
-接受的解决方案也会打招呼失败
SELECT CASE WHEN ISNULL(a.value('text()[1]','') = '' THEN NULL ELSE CAST(a.value('text()[1]','VARCHAR(15)') AS decimal(6,3)) END FailsForHello
FROM @xml.nodes('/a') A(a)
我最喜欢的是XQuery演员表...
本文链接:https://www.f2er.com/3135976.html