如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值

Posted

技术标签:

【中文标题】如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值【英文标题】:How to pass NULL instead of string format 'NULL' value using XML node in SQL server 【发布时间】:2014-10-30 12:10:30 【问题描述】:

我正在使用 XML node() 方法使用 SQLSserver 2008 提取 XML 数据。

现在在提取 XML 数据时,XML 字段的整数数据类型之一具有类似 NULL 的值,它试图以字符串格式插入 'NULL' 而不是 NULL。

下面是用于提取数据的 XML Node() 查询,

CREATE TABLE [dbo].[WO_Log](
[Flag] [int] NULL,
[FillingPO] [nvarchar](50) NULL,
[PackAtCAN1] [bit] NULL
) ON [PRIMARY]

declare @message XML

set @message='<ProductionOrder>
          <Header>
            <MessageID>00000005</MessageID>
            <PublishedDate>2013-05-30 09:30:10</PublishedDate>
          </Header>
          <Body>
            <ProductionOrderDetails>
              <Flag>NULL</Flag>
              <FillingPO>NULL</FillingPO>
              <PackAtCAN1>NULL</PackAtCAN1>
            </ProductionOrderDetails>
          </Body>
        </ProductionOrder>'


 INSERT INTO dbo.WO_Log(Flag,FillingPO,PackAtCAN1)
  SELECT p.value('Flag[1]','int')
         p.value('FillingPO[1]','NVARCHAR(50)'),
         p.value('PackAtCAN1[1]','BIT')
  FROM  @message.nodes('/ProductionOrder/Body/ProductionOrderDetails') x(p)

 Now when I'm execute the query i'm getting the error as below,

"Msg 245, Level 16, State 1, Line 1 转换时转换失败 将 varchar 值 'NULL' 转换为数据类型 int。"

【问题讨论】:

【参考方案1】:

您可以在 xQuery 中对value() 使用强制转换。如果转换失败,它将返回 NULL。

SELECT p.value('Flag[1] cast as xs:int?','int'),
       p.value('FillingPO[1]','NVARCHAR(50)'),
       p.value('PackAtCAN1[1] cast as xs:boolean?','BIT')
FROM  @message.nodes('/ProductionOrder/Body/ProductionOrderDetails') x(p)

Type Casting Rules in XQuery

如果您想在字符节点中为字符串值'NULL' 获取NULL,您可以在value() 的结果上使用isnull

SELECT p.value('Flag[1] cast as xs:int?','int'),
       nullif(p.value('FillingPO[1]','NVARCHAR(50)'), N'NULL'),
       p.value('PackAtCAN1[1] cast as xs:boolean?','BIT')
FROM  @message.nodes('/ProductionOrder/Body/ProductionOrderDetails') x(p)

【讨论】:

以上是关于如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值的主要内容,如果未能解决你的问题,请参考以下文章

sql 使用XQuery方法查询,值,存在,节点在SQL Server中查询XML

sql 在SQL Server中粉碎XML的节点方法

Sql Server 中FOR XML PATH(‘‘)函数用法

Sql Server 中FOR XML PATH(‘‘)函数用法

从 SQL Server 中的 XML 中删除所有空节点

Sql Server 取xml中节点值(传参)