2014-10-30 4 views
1

나는 지금대신 문자열 형식의 NULL을 전달하는 방법을 XML 데이터를 추출하는 동안

SQLSserver 2008를 사용하여 XML 데이터를 추출하기 위해 XML 노드() 메소드를 사용하고 SQL 서버에서 XML 노드를 사용하여 'NULL'값 하나 XML 필드의 정수 데이터 유형 중 NULL이 NULL과 같은 값을 가지고 있으며 NULL 대신 'NULL'형식의 문자열을 삽입하려고합니다. 데이터 유형에 VARCHAR를 값 'NULL'을 변환 할 때 아래

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 변환 실패, XML 노드() 데이터를 추출하는 쿼리입니다 int. "

답변

0

value()의 xQuery에서 캐스트를 사용할 수 있습니다. 캐스트가 실패하면 NULL을 리턴합니다.

Type Casting Rules in XQuery

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) 

당신은 당신이 value()에서 결과에 isnull를 사용할 수있는 문자 노드의 문자열 값 'NULL'에 대한 NULL을 얻을합니다.

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)