다음과 같은 두 개의 xml 파일이 있습니다.
<?xml version="1.0"?>
<instance xmlns="http://www.ubrea.com/xforms/88668970-6edb-0131-28e9-22000a1cda92" xmlns:tm="http://www.ubrea.com/xforms" >
<inputs>
<Truck_Number_Non_Barcode>MNKSJJHDHH88728</Truck_Number_Non_Barcode>
<VIN>
<Non_Barcode>xyz</Non_Barcode>
<ODO>1425788</ODO>
<Defect>
<Code>33J</Code>
</Defect>
</VIN>
</inputs>
</instance>
과
<?xml version="1.0"?>
<instance xmlns="http://www.ubrea.com/xforms/88668970-6edb-0131-28e9-22000a1cda92" xmlns:tm="http://www.ubrea.com/xforms" >
<inputs>
<Number_Non_Barcode>mnbcdsddsd3455</Number_Non_Barcode>
<VIN>
<Non_Barcode>xyz</Non_Barcode>
<ODO>1425788</ODO>
</VIN>
</inputs>
</instance>
다음은 xml 파일을 구문 분석하기위한 sqlquery입니다.
declare @xmldata xml
set @xmldata ='
<?xml version="1.0"?>
<instance xmlns="http://www.ubrea.com/xforms/88668970-6edb-0131-28e9-22000a1cda92" xmlns:tm="http://www.ubrea.com/xforms" >
<inputs>
<Number_Non_Barcode>mnbcdsddsd3455</Number_Non_Barcode>
<VIN>
<Non_Barcode>xyz</Non_Barcode>
<ODO>1425788</ODO>
</VIN>
</inputs>
</instance>'
declare @sql nvarchar(max)
declare @xmlns varchar(max)
set @xmlns=''''+SUBSTRING(cast(@xmldata as varchar(max)),CHARINDEX('http://www.ubrea.com/xforms/',cast(@xmldata as varchar(max)),1),CHARINDEX('" xmlns:dm',cast(@xmldata as varchar(max)),1)-18)+''''
set @sql='
declare @xmldata xml
set @xmldata = '''+cast(@xmldata as varchar(max))+'''
begin try
;WITH XMLNAMESPACES
(
DEFAULT ' + @xmlns +
','+'''http://www.ubrea.com/xforms''' + ' as fm
)
select
Number_Non_Barcode, Non_Barcode, ODO, Code
from (
select
x.c.value(''(../../Number_Non_Barcode)[1]'', ''varchar(100)'') as Number_Non_Barcode,
x.c.value(''(../Non_Barcode)[1]'', ''varchar(100)'') as Non_Barcode,
x.c.value(''(../ODO)[1]'', ''varchar(100)'') as ODO,
x.c.value(''(Code)[1]'', ''varchar(100)'') as Code
from @xmldata.nodes(''/instance/inputs/VIN/Defect'') x(c)
) x
end try
begin catch
select ERROR_NUMBER() Code, ERROR_MESSAGE() Message
end catch'
exec sp_executesql @sql;
<Defect>
사용할 수없는 경우 쿼리를 만드는 방법 및 결과는 다음과 같아야합니다.
Number_Non_Barcode Non_Barcode ODO Defect_Code
mnbcdsddsd3455 xyz 1425788 NULL
나는 xml 쿼리에 익숙하지 않고 그것을 수행하는 방법의 예를 찾을 수없는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다. 감사
기본 네임 스페이스를 알 수 없기 때문에 동적 쿼리가있는 것 같습니다. 대신를 사용하여 XQuery에서 네임 스페이스를 지정할 수 있습니다 *
.
및 여러 단계를 ..
사용하여 XML을 파쇄 하면 상위 축 사용을 피할 수 있습니다 . 때문에 노드가 누락 될 수 있습니다 당신은 사용이 그 노드를 분쇄 할 때.nodes()
cross apply
Defect
outer apply
select I.X.value('(*:Number_Non_Barcode/text())[1]', 'varchar(100)') as Number_Non_Barcode,
V.X.value('(*:Non_Barcode/text())[1]', 'varchar(100)') as Non_Barcode,
V.X.value('(*:ODO/text())[1]', 'varchar(100)') as ODO,
D.X.value('(*:Code/text())[1]', 'varchar(100)') as Code
from @XMLData.nodes('/*:instance/*:inputs') as I(X)
cross apply I.X.nodes('*:VIN') as V(X)
outer apply V.X.nodes('*:Defect') as D(X)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다