如何使用存储过程将导入的空白XML标记导入表的“数字”列中

我创建了一个存储过程,该过程将XML文件转换为SQL Server数据表。当每个标签中都有数字格式的列的值时,此方法效果很好,但如果标签为空,则该方法无效。有没有一种方法可以将空白转换为null或忽略存储过程中的空白?这是该过程的简化版本。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[SHPReportDataXML] 
    @XML XML
AS 
    INSERT dbo.SHPReportData ([Weight],[WeightUQ]) 
        SELECT
            [Weight] = SHPReportData.value('(RawDataItem/Weight)[1]','DECIMAL(10,2)'),[WeightUQ] = SHPReportData.value('(RawDataItem/UQ)[1]','VARCHAR(2)')
        FROM
            @XML.nodes('RawData') c (SHPReportData);
fhqjgfhqjg 回答:如何使用存储过程将导入的空白XML标记导入表的“数字”列中

我假设您收到带有此标签包含空字符串的行的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

大家都在问