2017-11-10 144 views
1

我需要从SQL Server中的XML中提取信息。该文件的格式与下面的格式类似。我无法解析出这种文档样式的信息。有谁知道为什么要做到这一点?在SQL Server中从XML中提取信息

<ExtractSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ConnectorSettings connectorScriptId="74" channelDomain="Diag" isActive="true"> 
    <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
    <StepSettings stepScriptId="23" stepType="Enc" isActive="true" sequence="2" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="15" channelDomain="Doc" isActive="true"> 
     <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
     <StepSettings stepScriptId="23" stepType="Enc" isActive="true" sequence="2" /> 
     <StepSettings stepScriptId="61" stepType="Lab" isActive="true" sequence="3" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="12" channelDomain="Imm" isActive="true"> 
     <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
     <StepSettings stepScriptId="16" stepType="Imm" isActive="true" sequence="2" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="46" channelDomain="Lab" isActive="true"> 
    <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
    </ConnectorSettings> 
</ExtractSettings> 

我在SQL Server之前做到了这一点,但格式是这样的

<ConnectorSetting> 
    <StepSettings>70<StepSettings/> 
     <Steptype>Enc<Steptype/> 
    <StepSettings>23<StepSettings/> 
     <Steptype>Demo<Steptype/> 
    </ConnectorSettings> 

这使得它更容易处理。

我试了几件事情,但已大多试图让这些工作

select 
    stuff.connectorSettings.value('stepScriptID', 'varchar(50)') 
from 
    @xml.nodes('ROOT/ConnectorSettings/stepscript') as stuff(connectorSettings); 

exec sp_xml_preparedocument @idoc output, @xml; 
select * from OPENXML(@idoc,'/ROOT/ConnectorSettings',4) 

我有点失去了在这一点所以任何的建议是,赞赏。

回答

0

鉴于你的XML在XML变量@xml,你可以尝试这样的事:

SELECT 
    ConnectorScriptId = xc.value('../@connectorScriptId', 'int'), 
    StepScriptId = xc.value('@stepScriptId', 'int'), 
    StepType = xc.value('@stepType', 'varchar(50)'), 
    Sequence = xc.value('@sequence', 'int') 
FROM 
    @xml.nodes('/ExtractSettings/ConnectorSettings/StepSettings') AS XT(XC) 

这应该给你这样的事情:

enter image description here

0

这里有一个小样本,让你开始:

declare @doc xml = '<ExtractSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ConnectorSettings connectorScriptId="74" channelDomain="Diag" isActive="true"> 
    <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
    <StepSettings stepScriptId="23" stepType="Enc" isActive="true" sequence="2" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="15" channelDomain="Doc" isActive="true"> 
     <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
     <StepSettings stepScriptId="23" stepType="Enc" isActive="true" sequence="2" /> 
     <StepSettings stepScriptId="61" stepType="Lab" isActive="true" sequence="3" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="12" channelDomain="Imm" isActive="true"> 
     <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
     <StepSettings stepScriptId="16" stepType="Imm" isActive="true" sequence="2" /> 
    </ConnectorSettings> 
    <ConnectorSettings connectorScriptId="46" channelDomain="Lab" isActive="true"> 
    <StepSettings stepScriptId="9" stepType="Demo" isActive="true" sequence="1" /> 
    </ConnectorSettings> 
</ExtractSettings>'; 

select cs.value('@connectorScriptId','int') connectorScriptId, 
     ss.value('@stepType','varchar(20)') stepType 
from @doc.nodes('/ExtractSettings/ConnectorSettings') c(cs) 
outer apply cs.nodes('StepSettings') cs(ss) 

输出

connectorScriptId stepType 
----------------- -------------------- 
74    Demo 
74    Enc 
15    Demo 
15    Enc 
15    Lab 
12    Demo 
12    Imm 
46    Demo 

(8 rows affected)