2017-04-17 6 views
1

XMLデータをテーブルに細断するためにNodesメソッドを使用しています。私は特定のXML要素が必要ですが、そのバックアップ(私の貧弱な構文、XMLを扱うことに慣れていないこと)を、私が細断処理しているところからXMLで赦してください。ノードを使用したXMLのバックアップの移動

XML::

<ToDoList xmlns="----.----.MappingObjects/XmlSchemas/ToDoList.xsd"> 
    <Step> 
    <StepId>f3ab5132-fcf4-47c4-929f-ab7464d3bcc7</StepId> 
    <Rank>1</Rank> 
    <IsComplete>true</IsComplete> 
    <CompletionDate>2017-04-17T17:12:45Z</CompletionDate> 
    <CompletionUser>Michael Johnson</CompletionUser> 
    <Text></Text> 
    <CalibrationId>3</CalibrationId> 
    <CalibrationValues> 
     <Value> 
     <Standard>1111</Standard> 
     <UnitOfMeasureName>NewU</UnitOfMeasureName> 
     <Min>1111</Min> 
     <Normal>1112</Normal> 
     <Max>1113</Max> 
     <BeforeReading>1111</BeforeReading> 
     <AfterReading>1112</AfterReading> 
     <DateCalibrated>2017-04-17T17:12:00Z</DateCalibrated> 
     <FailBefore>false</FailBefore> 
     <FailAfter>false</FailAfter> 
     </Value> 
     <Value> 
     <Standard>245.000</Standard> 
     <UnitOfMeasureName>NewU</UnitOfMeasureName> 
     <Min>245</Min> 
     <Normal>250</Normal> 
     <Max>280</Max> 
     <BeforeReading>245</BeforeReading> 
     <AfterReading>250</AfterReading> 
     <DateCalibrated>2017-04-17T17:12:00Z</DateCalibrated> 
     <FailBefore>false</FailBefore> 
     <FailAfter>false</FailAfter> 
     </Value> 
    </CalibrationValues> 
    </Step> 
</ToDoList> 

SQL:

既存のテーブルには、次の列を戻し
;with XMLNAMESPACES('----.-----.MappingObjects/XmlSchemas/ToDoList.xsd' as NS) 

select WOId, 
     N.Step.value('(NS:Standard)[1]', 'nvarchar(max)') as [Standard], 
     N.Step.value('(NS:UnitOfMeasureName)[1]','nvarchar(32)') as [UOM], 
     N.Step.value('(NS:Min)[1]','float') as [Min], 
     N.Step.value('(NS:Normal)[1]','float') as Normal, 
     N.Step.value('(NS:Max)[1]','float') as [Max], 
     N.Step.value('(NS:BeforeReading)[1]','float') as BeforeReading, 
     N.Step.value('(NS:AfterReading)[1]','float') as AfterReading, 
     dbo.fn_clr_GetCustomerLocalTimeFromUTC(@CUSTOMERTIMEZONE, N.Step.value('(NS:DateCalibrated)[1]','datetime')) as DateCalibrated, 
     N.Step.value('(NS:FailBefore)[1]','bit') as FailBefore, 
     N.Step.value('(NS:FailAfter)[1]','bit') as FailAfter 


from tblWorkOrderToDoList WOTD 
cross apply Data.nodes('//NS:Value') N(Step) 

(簡潔にするために短縮):

私は私が願うことは、関連するすべてのコードで、掲載しました

WOId標準UOM最小標準最大読取前アフターリーディング日付較正

私が見てみたい:CalibrationIdは(上記のXMLを使用して)各返された行は3である

WOId CalibrationId標準UOM分通常の最大BeforeReading AfterReading

あなたは両方の要素から必要な情報を得ることができるようにあなたは、まず Step要素レベルにして、 Valueに、二回XMLを細断処理す​​ることができます

答えて

2

select 
    WOId, 
    T.Step.value('NS:CalibrationId[1]','int') as CalibrationId 
    N.Value.value('NS:Standard[1]', 'nvarchar(max)') as [Standard], 
    N.Value.value('NS:UnitOfMeasureName[1]','nvarchar(32)') as [UOM], 
    N.Value.value('NS:Min[1]','float') as [Min], 
    .... 
from tblWorkOrderToDoList WOTD 
cross apply WOTD.Data.nodes('//NS:Step') T(Step) 
cross apply T.Step.nodes('NS:CalibrationValues/NS:Value') N(Value) 
+0

または、おそらくを移動する..' '使用して二回破砕せずに'(../../NS:CalibrationId)[1]' – har07

関連する問題