Udostępnij za pośrednictwem


Dodawanie obszarów nazw przy użyciu WITH XMLNAMESPACES

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

Korzystanie Z XMLNAMESPACES w kwerendach FOR XML

WITH XMLNAMESPACES pozwala dołączyć obszarów nazw XML FOR XML kwerendy.Na przykład rozważmy następującą kwerendę FOR XML:

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

Oto wynik:

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

Aby dodać obszary nazw do formatu XML, wykonane przez kwerendę FOR XML, należy najpierw określić prefiks obszaru nazw do mapowania identyfikatora URI przy użyciu klauzula WITH obszarów nazw.Następnie za pomocą określania nazw w kwerendzie, jak pokazano w następującej kwerendzie zmodyfikowanych prefiksów obszaru nazw.Należy zauważyć, że klauzula WITH XMLNAMESPACES określa (prefiks obszaru nazwns1) do identyfikatora URI ()uri) mapowania. The ns1 prefix is then used in specifying the element and atrybut names to be constructed by the FOR XML query.

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 prefiksów obszaru 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>

Następujące uwagi dotyczą klauzula WITH XMLNAMESPACES:

  • Jest ona obsługiwana tylko na RAW, AUTO i ścieżka trybów kwerend FOR XML.JAWNE tryb nie jest obsługiwany.

  • Dotyczy tylko prefiksów obszaru nazw XML dla kwerend oraz XML Typ danych metod, ale nie analizator 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ć dyrektyw FOR XML, XMLSCHEMA i XMLDATA po klauzula WITH XMLNAMESPACES jest używany.

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

Użycie dyrektywy XSINIL

Nie można zdefiniować prefiksu xsi w klauzula WITH XMLNAMESPACES w przypadku korzystania z dyrektywą XSINIL elementów.Zamiast tego jest automatycznie dodawany podczas korzystania z XSINIL elementów.Następująca kwerenda używa XSINIL elementów, które generuje zorientowane na element XML, których wartości null są mapowane do elementów, które mają xsi: nil atrybut ustawiony 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

Oto wynik:

<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 obszarów nazw

Zamiast deklarowanie prefiks obszaru nazw, można zadeklarować domyślnego obszaru nazw przy użyciu słowa kluczowego DEFAULT.W kwerendzie FOR XML go będzie powiązać domyślny obszar nazw węzłów XML w wynikowym pliku XML.W poniższym przykładzie XMLNAMESPACES WITH definiuje dwa prefiksów obszaru nazw, które są definiowane razem z 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 FOR XML generuje zorientowane na element XML.Należy zwrócić uwagę, że kwerenda używa zarówno prefiksów obszaru nazw w nazewnictwie węzłów.W klauzula SELECT IDProduktu, nazwę i kolor nie określono nazwy z dowolnym prefiksem.W związku z tym odpowiadające im elementy w wynikowym pliku XML, 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 podobna do poprzedniego, z tą różnicą, że określono tryb automatycznego ustawiania 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

Używanie predefiniowanych obszarów nazw

Korzystając z wstępnie zdefiniowanych obszarów nazw, z wyjątkiem obszaru nazw xml i obszaru nazw xsi użyto XSINIL elementów należy jawnie określić obszaru nazw wiązanie przy użyciu XMLNAMESPACES WITH.Następująca kwerenda jawnie definiuje prefiks obszaru nazw URI wiązanie (wstępnie zdefiniowanego obszaru nazwurn: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 wynik.SQLXML użytkownicy znający ten szablon XML.Aby uzyskać więcej informacji zobaczSQLXML 4.0 pojęcia dotyczące programowania.

<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że być używany bez jawnego określenia w WITH XMLNAMESPACES, jak pokazano w następującej kwerendzie tryb ścieżka.Ponadto zadeklarowana prefiks ma powiązać http://www.w3.org/XML/1998/namespace obszaru nazw.Prefiks obszaru nazw xml, który nie jest jawnie zdefiniowana przy użyciu XMLNAMESPACES WITH 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ą obszaru nazw xml wstępnie zdefiniowane.Ponieważ XML w wersja 1.0 nie wymaga jawnej deklaracja wiązania obszaru nazw xml, wynik nie będzie zawierać jawne deklaracja obszaru nazw wiązania.

Oto wynik:

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

Korzystanie Z XMLNAMESPACES z metod typu danych xml

The xml Data Type Methods specified in a SELECT query, or in UPDATE when it is the modify() metoda, all have to repeat the namespace deklaracja in their prolog.Może to być czasochłonne.Na przykład poniższa kwerenda pobiera modelu produktu identyfikatory opisy którego katalogu należy umieszczać specyfikacji.Oznacza to <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() and EXIST() metody zadeklarować ten sam obszar nazw w prologu ich.Na przykład:

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

Alternatywnie można najpierw zadeklarować WITH XMLNAMESPACES i używać prefiksów obszaru nazw w kwerendzie.W takim przypadek Query() and EXIST() metody nie muszą zawierać deklaracje obszaru nazw w prologu ich.

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 deklaracja jawny w prologu XQuery zastępuje prefiks obszaru nazw i nazw elementów domyślnych, określonych w klauzula WITH.