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

时间:2014-10-30 12:10:30

标签: sql xml sql-server-2008-r2 xmlnode

我正在使用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,
  

“消息转换时,消息245,级别16,状态1,行1转换失败   varchar值'NULL'到数据类型int。“

1 个答案:

答案 0 :(得分:0)

您可以在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',可以对isnull的结果使用value()

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)