Udostępnij za pośrednictwem


rozwinięta QName (XQuery)

Zwraca wartość typu xs:QName z obszaru nazw URI określony w paramURI $ i lokalną nazwę określoną w paramLocal $.Jeśli paramURI $ jest ciągiem pustym lub puste sekwencji, reprezentuje ona nie obszaru nazw.

Składnia

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?

Argumenty

  • $paramURI
    Czy obszaru nazw URI dla QName.

  • $paramLocal
    Jest to nazwa lokalna część QName.

Uwagi

Poniższe uwagi dotyczą expanded-QName() funkcja:

  • Jeśli paramLocal $ Określona wartość nie jest prawidłowy formularz leksykalne dla typu xs:NCName, puste sekwencji jest zwracany i reprezentuje błąd dynamicznych.

  • Konwersja z typu xs:QName na dowolny inny typ nie jest obsługiwany w SQL Server. Z tego powodu expanded-QName() funkcja nie może być używana w budowie XML.Na przykład, kiedy użytkownik są konstruowania węzłem, takich jak <e> expanded-QName(…) </e>, wartość musi być bez typu. Może to wymagać dokonać konwersji wartości typu xs:QName zwróconej przez expanded-QName() Aby xdt:untypedAtomic. Jednak to nie jest obsługiwana.To rozwiązanie jest dostarczane w przykład w dalszej części tego tematu.

  • Można modyfikować lub porównać istniejące wartości typu QName.Na przykład /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") Porównuje wartość elementu, <e>, z QName, zwracane przez expanded-QName() funkcja.

Przykłady

W tym temacie przedstawiono przykłady XQuery przed XML wystąpienia, które są przechowywane w różnych XML kolumny typu AdventureWorks Baza danych. Aby uzyskać ogólne informacje o każdej z tych kolumn zobacz xml Data Type Representation in the AdventureWorks Database.

A.Zastępowanie wartości QName typ węzła

Ten przykład ilustruje, jak zmodyfikować wartość węzła elementu typu QName.Jeśli jest mieszaniną tego typu lub inne wartości z innych typów są przekazywane, błąd statycznego zostanie zaokrąglona.

  • Tworzy kolekcja schematu XML, który definiuje element typu QName.

  • Tworzy tabela o XML typu kolumna przy użyciu kolekcja schematu XML.

  • Wystąpienie XML są zapisywane w tabela.

  • Używa Modify() metoda typu danych xml, aby zmodyfikować wartość elementu typu QName w wystąpieniu.The expanded-QName() funkcja is used to generate the new QName type value.

-- If XML schema collection (if exists)
-- drop xml schema collection SC
-- go
-- Create XML schema collection
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="QNameXSD" 
      xmlns:xqo="QNameXSD" elementFormDefault="qualified">
      <element name="Root" type="xqo:rootType" />
      <complexType name="rootType">
            <sequence minOccurs="1" maxOccurs="1">
                        <element name="ElemQN" type="xs:QName" />
            </sequence>
      </complexType>
</schema>'
go
-- Create table.
CREATE TABLE T( XmlCol xml(SC) )
-- Insert sample XML instnace
INSERT INTO T VALUES ('
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
      <ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
  <ElemQN>ns:someName</ElemQN>
</Root> 

W następującej kwerendzie <ElemQN> wartość elementu jest zastępowany za pomocą Modify() metoda typ danych xml i zastąp wartość XML DML, jak pokazano.

-- the value.
UPDATE T 
SET XmlCol.modify('
  declare default element namespace "QNameXSD"; 
  replace value of /Root[1]/ElemQN 
  with expanded-QName("http://myURI", "myLocalName") ')
go
-- Verify the result
SELECT * from T
go

Jest to wynik.Należy zauważyć, że element <ElemQN> Nazwa QName typu ma teraz nową wartość:

<Root xmlns="QNameXSD" xmlns:ns="urn">
  <ElemQN xmlns:p1="http://myURI">p1:myLocalName</ElemQN>
</Root>

Poniższe instrukcje usuwania obiektów, w tym przykładzie.

-- Cleanup
DROP TABLE T
go
drop xml schema collection SC
go

B.Zajmowanie ograniczenia przy użyciu funkcja expanded-QName()

The expanded-QName funkcja cannot be used in XML construction.Poniższy przykład ilustruje to.Aby obejść to ograniczenie, w przykładzie najpierw wstawia węzła i następnie modyfikuje węzła.

-- if exists drop the table T
--drop table T
-- go
-- Create XML schema collection
-- DROP XML SCHEMA COLLECTION SC
-- go
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="root" type="QName" nillable="true"/>
</schema>'
go
 -- Create table T with a typed xml column (using the XML schema collection)
CREATE TABLE T (xmlCol XML(SC))
go
-- Insert an XML instance.
insert into T values ('<root xmlns:a="http://someURI">a:b</root>')
 go
-- Verify
SELECT * 
FROM T

Próba następujące dodaje innego <root> element ale zawiedzie, ponieważ funkcja expanded-QName() nie jest obsługiwana w budowie XML.

update T SET xmlCol.modify('
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')
go

Rozwiązanie to jest najpierw wstawić wystąpienie o wartość w polu <root> element, a następnie zmodyfikować. W tym przykładzie zerowe wartości początkowej jest używany, gdy <root> element zostanie wstawiony. kolekcja schematu XML, w tym przykładzie zezwala na wartość zero dla <root> element.

update T SET xmlCol.modify('
insert <root xsi:nil="true"/> as last into / ')
go
-- now replace the nil value with another QName.
update T SET xmlCol.modify('
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')
go
 -- verify 
SELECT * FROM T
go
-- result
<root>b</root>

<root xmlns:a="http://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

Jak pokazano w następującej kwerendzie, można porównać wartość QName.Kwerenda zwraca tylko <root> elementy, których wartości spełniają QName wpisz wartość zwracana przez expanded-QName() funkcja.

SELECT xmlCol.query('
    for $i in /root
    return
       if ($i eq expanded-QName("http://ns","someLocalName") ) then
          $i
       else
          ()')
FROM T

defaultButton

Istnieje jeden ograniczenia: The expanded-QName() funkcja akceptuje puste sekwencji jako drugi argument i zwraca wartość pustą zamiast podnoszenie błąd czas wykonania, gdy drugi argument jest niepoprawny.