Udostępnij za pośrednictwem


Dodawanie nazw przy użyciu XMLNAMESPACES

Z XMLNAMESPACES (języka Transact-SQL) zapewnia obsługę URI obszaru nazw w następujący sposób:

Korzystanie Z XMLNAMESPACES w kwerendach XML dla

Z XMLNAMESPACES pozwala umieścić w kwerendach XML dla obszarów nazw XML.Na przykład rozważmy następującą kwerendę dla XML:

SELECT ProductID, Name, Color
FROM   Production.Product
WHERE  ProductID=316 or ProductID=317
FOR XML RAW

Jest to wynikiem:

<row ProductID="316" Name="Blade" />
<row ProductID="317" Name="LL Crankarm" Color="Black" />

Aby dodać XML przez kwerendy XML dla obszarów nazw, należy najpierw określić prefiks obszaru nazw do mapowania identyfikatora URI przy użyciu klauzula z obszarów nazw.Następnie należy użyć prefiksów obszaru nazw określając nazwy w kwerendzie, jak pokazano w następującej kwerendzie zmodyfikowane.Uwaga, że klauzula Z XMLNAMESPACES Określa prefiks obszaru nazw (ns1) do identyfikatora URI (uri) mapowania.ns1 Prefiks jest następnie używana w Określanie nazwy elementów i atrybut do zbudowane przez kwerendę dla XML.

WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
       Name      as 'ns1:Name', 
       Color     as 'ns1:Color'
FROM Production.Product
WHERE ProductID=316 or ProductID=317
FOR XML RAW ('ns1:Prod'), ELEMENTS

Wynik XML zawiera prefiksy obszarów nazw:

<ns1:Prod xmlns:ns1="uri">
  <ns1:ProductID>316</ns1:ProductID>
  <ns1:Name>Blade</ns1:Name>
</ns1:Prod>
<ns1:Prod xmlns:ns1="uri">
  <ns1:ProductID>317</ns1:ProductID>
  <ns1:Name>LL Crankarm</ns1:Name>
  <ns1:Color>Black</ns1:Color>
</ns1:Prod>

Poniższe informacje dotyczą klauzula Z XMLNAMESPACES:

  • Jest obsługiwany tylko na RAW, automatyczne i ścieżki Tryby kwerend dla XML.JAWNE tryb nie jest obsługiwany.

  • Dotyczy tylko prefiksy obszarów nazw XML dla kwerend i xml typ danych, metody, ale nie analizatora składni XML.Na przykład poniższa kwerenda zwraca błąd, ponieważ nie deklaracja obszaru nazw dla prefiksu myNS dokumentu XML.

  • Nie można użyć w dyrektywach XML dla schematu XML i XMLDATA, gdy jest używana klauzula Z XMLNAMESPACES.

    CREATE TABLE T (x xml)
    go
    WITH XMLNAMESPACES ('http://abc' as myNS )
    INSERT INTO T VALUES('<myNS:root/>')
    

Za pomocą dyrektywy XSINIL

Nie można zdefiniować prefiks xsi w klauzula XMLNAMESPACES Z korzystania z dyrektywy XSINIL elementów.Zamiast tego jest automatycznie dodawany podczas korzystania z elementów XSINIL.Następująca kwerenda używa XSINIL elementów generuje zorientowany na element XML, gdzie wartości null są mapowane do elementów, które mają xsi: nil atrybut zestaw na wartość True.

WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
       Name      as 'ns1:Name', 
       Color     as 'ns1:Color'
FROM Production.Product
WHERE ProductID=316 
FOR XML RAW, ELEMENTS XSINIL

Jest to wynikiem:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="uri">
  <ns1:ProductID>316</ns1:ProductID>
  <ns1:Name>Blade</ns1:Name>
  <ns1:Color xsi:nil="true" />
</row>

Określanie domyślnego obszaru nazw.

Zamiast deklarowania prefiks obszaru nazw, można zadeklarować domyślnego obszaru nazw przy użyciu słowa kluczowego domyślne.W kwerendzie XML dla go będzie powiązać domyślny obszar nazw XML węzłów w wynikowym pliku XML.W poniższym przykładzie Z XMLNAMESPACES definiuje dwa prefiksów obszaru nazw, które są zdefiniowane przy użyciu domyślnego obszaru nazw.

WITH XMLNAMESPACES ('uri1' as ns1, 
                    'uri2' as ns2,
                    DEFAULT 'uri2')
SELECT ProductID, 
      Name,
      Color
FROM Production.Product 
WHERE ProductID=316 or ProductID=317
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS

Kwerendy XML dla generuje zorientowany na element XML.Należy zauważyć, że w kwerendzie użyto zarówno nazw prefiksów nazw węzłów.W klauzula SELECT ProductID, nazwa i kolor nie należy określać nazwę dowolnej prefiksu.Dlatego odpowiednie elementy XML wynikowy należą do domyślnego obszaru nazw.

<ns2:root xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
  <ns1:Product>
    <ProductID>316</ProductID>
    <Name>Blade</Name>
  </ns1:Product>
  <ns1:Product>
    <ProductID>317</ProductID>
    <Name>LL Crankarm</Name>
    <Color>Black</Color>
  </ns1:Product>
</ns2:root>

Następująca kwerenda jest podobny do poprzedniego, chyba, że określono tryb dla AUTO XML.

WITH XMLNAMESPACES ('uri1' as ns1,  'uri2' as ns2,DEFAULT 'uri2')
SELECT ProductID, 
      Name,
      Color
FROM Production.Product as "ns1:Product"
WHERE ProductID=316 or ProductID=317
FOR XML AUTO, ROOT('ns2:root'), ELEMENTS

Za pomocą wstępnie zdefiniowanych obszarów nazw

Korzystając z wstępnie zdefiniowanych obszarów nazw, z wyjątkiem nazw xml i nazw xsi użyto XSINIL elementy należy jawnie określić obszar nazw powiązanie korzystając Z XMLNAMESPACES.Następująca kwerenda jawnie definiuje prefiks obszaru nazw URI powiązanie dla wstępnie zdefiniowanych nazw (urn:schemas-microsoft-com:xml-sql).

WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-sql' as sql)
SELECT 'SELECT * FROM Customers FOR XML AUTO, ROOT("a")' AS "sql:query"
FOR XML PATH('sql:root')

Jest to wynikiem.SQLXML użytkownicy zapoznali się z tego szablonu XML.Aby uzyskać więcej informacji, zobacz SQLXML 4.0 pojęcia związane z programowaniem.

<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>
</sql:root>

Prefiks obszaru nazw xml można bez jawnego definiowania Z XMLNAMESPACES, jak pokazano w następującej kwerendzie tryb ścieżki.Ponadto jeżeli zadeklarowano prefiks posiada związany z http://www.w3.org/XML/1998/namespace obszaru nazw.Prefiks obszaru nazw xml, który nie jest jawnie zdefiniowana za pomocą Z XMLNAMESPACES można znaleźć nazwy określone w klauzula SELECT.

SELECT 'en'    as "English/@xml:lang",
       'food'  as "English",
       'ger'   as "German/@xml:lang",
       'Essen' as "German"
FOR XML PATH ('Translation')
go

@ Xml: lang atrybutów za pomocą nazw xml wstępnie zdefiniowanych.Ponieważ XML w wersja 1.0 nie wymaga jawnej deklaracji obszaru nazw xml powiązanie, wynik nie będzie zawierać jawne deklaracja obszaru nazw powiązanie.

Jest to wynikiem:

<Translation>
  <English xml:lang="en">food</English>
  <German xml:lang="ger">Essen</German>
</Translation>

Korzystanie Z XMLNAMESPACES z metod typu danych xml

metoda typu danych xml określonych w kwerendzie WYBIERAJĄCEJ lub aktualizacja jest modify() metoda, mieć deklaracja obszaru nazw w prologu ich powtórzyć.Może to być czas-zużyciu.Na przykład poniższa kwerenda pobiera modelu produktu identyfikatory, których opisy wykazu zawiera specyfikację.Oznacza to, że <Specifications> istnieje element.

SELECT ProductModelID, CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
    <Product 
        ProductModelID= "{ sql:column("ProductModelID") }" 
        />
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
    declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     /pd:ProductDescription[(pd:Specifications)]'
    ) = 1

W poprzedniej kwerendy zarówno query() i exist() ten sam obszar nazw w ich prologu zadeklarować metody.Na przykład:

 declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

Alternatywnie można najpierw zadeklarować Z XMLNAMESPACES i używają prefiksów obszaru nazw w kwerendzie.W takim przypadek query() i exist() metod musi zawierać deklaracje obszaru nazw w ich prologu.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT ProductModelID, CatalogDescription.query('
    <Product 
        ProductModelID= "{ sql:column("ProductModelID") }" 
        />
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
     /pd:ProductDescription[(pd:Specifications)]'
    ) = 1
Go

Należy zauważyć, że jawnej deklaracja w prologu XQuery zastępuje prefiks obszaru nazw i obszar nazw elementu domyślnego zdefiniowanego w klauzula WITH.