2013-09-11 2 views
3

Сценарий: У меня есть столбец xml в базе данных MSSQL, который я должен проанализировать XML-данные этой ячейки с помощью XQuery.Как передать переменную в XPath XQuery в выражении SQL

 Xml content : <AnchoredXml xmlns="urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008" SchemaWriteVersion="2"> 
    <Key ScopeClass="Global"> 
    <SchemaId Namespace="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" ElementName="Topology" /> 
    <AuthorityId Class="Host" InstanceId="00000000-0000-0000-0000-000000000000" /> 
    </Key> 
    <Dictionary Count="1"> 
    <Item> 
     <Key /> 
     <Value Signature="b1ac04f7-d8f0-4300-86cf-fb2b3383536c"> 
     <Topology xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008"> 
      <InternalDomains AllowAllDomains="false" DefaultDomain="ocsqa.com"> 
      <InternalDomain Name="ocsqa.com" Authoritative="false" AllowSubDomains="false" /> 
      </InternalDomains> 
      <Sites> 
      <CentralSite SiteId="1"> 
       <Name>LyncSite</Name> 
       <Location /> 
      </CentralSite> 
      </Sites> 
      <Clusters> 

Это часть данных содержимого xml в этой ячейке.

Я использую ниже запроса, чтобы пройти узлы выше XML:

select @cluster = @Items.query('/DocItemSet/DocItem/Data/*[@SchemaWriteVersion="2"]/*[2]/*[1]/*[2]/*[1]/*[3]') 

Выход вышеуказанного запроса:

<p1:Cluster xmlns:p1="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" RequiresReplication="true" RequiresSetup="true" Fqdn="XXXX.ocsqa.com"> 
    <p1:ClusterId SiteId="1" Number="1" /> 
    <p1:Machine OrdinalInCluster="1" Fqdn=" XXXX.ocsqa.com"> 
    <p1:NetInterface InterfaceSide="Primary" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    <p1:NetInterface InterfaceSide="External" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    <p1:NetInterface InterfaceSide="Pstn" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    </p1:Machine> 
</p1:Cluster> 
<p2:Cluster xmlns:p2="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" RequiresReplication="true" RequiresSetup="true" Fqdn=" XXXX2.ocsqa.com"> 
    <p2:ClusterId SiteId="1" Number="2" /> 
    <p2:Machine OrdinalInCluster="1" Fqdn=" XXXX2.ocsqa.com"> 
    <p2:NetInterface InterfaceSide="Primary" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    <p2:NetInterface InterfaceSide="External" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    <p2:NetInterface InterfaceSide="Pstn" InterfaceNumber="1" IPAddress="0.0.0.0" /> 
    </p2:Machine> 
</p2:Cluster> 
<p3:Cluster xmlns:p3="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" RequiresReplication="true" RequiresSetup="true" Fqdn=" XXXX2.ocsqa.com"> 
    <p3:ClusterId SiteId="1" Number="3" /> 
    <p3:Machine OrdinalInCluster="1" Fqdn=" XXXX2.ocsqa.com" /> 
</p3:Cluster> 

Теперь, используя запрос упоминается как показано ниже:

select @fqdn = @cluster.value('(./*/*/@Fqdn)[1]','nvarchar(20)') Select @fqdn 

Обратите внимание на выделенный индекс нет в запросе выше. Используя этот запрос, мы сможем добиться первого кластера, доступного в xml, аналогичным образом, я хотел также искать другие кластеры.

Так что я хотел использовать этот запрос во время цикла. Для чего мне нужно передать переменную вместо значения hardcoded int. Нечто подобное, как показано ниже:

select @fqdn = @cluster.value('(./*/*/@Fqdn)[sql:variable("@test")]','nvarchar(20)') 

я упомянул некоторые сообщения How to use XPath with a variable in Oracle XMLTable? http://www.jasonstrate.com/2011/01/xquery-for-the-non-expert-variable-use/

, но я получаю сообщение об ошибке, как показано ниже:

Msg 2389, Level 16, State 1, Line 35 XQuery [value()]: 'value()' требует одиночного (или пустой последовательности), найденного операнда типа 'xdt: untypedAtomic *' Как передать переменную в оператор XQuery SQL?

ответ

2

Необходимо указать SQL Server, что вас интересует только один узел. Добавьте [1] в конец.

@cluster.value('(./*/*/@Fqdn)[sql:variable("@test")][1]','nvarchar(20)') 
Смежные вопросы