SQL:kolumna() funkcji (XQuery)
Zgodnie z opisem w temacie, Powiązanie relacyjnymi bazami danych wewnątrz XML, można użyć sql:kolumna(() funkcja podczas korzystania z Metod typu danych XML do udostępnienia relacyjnej wartość wewnątrz XQuery.
Na przykład metoda query() (typ danych XML) jest używana do określenia zapytanie XML wystąpienie jest przechowywana w zmiennej lub kolumnie xml typu.Czasami konieczne może być również kwerendy, aby użyć wartości z innego, XML inny niż kolumna, doprowadzić relacyjnych i razem danych XML.Aby to zrobić, użyj sql:kolumna() funkcja.
Wartość SQL będą mapowane do odpowiedniej wartości XQuery i jego typ będzie typ bazowy XQuery jest równoważne odpowiedni typ SQL.
Składnia
sql:column("columnName")
Uwagi
Należy zauważyć, że odwołanie do kolumna określone w sql:kolumna() funkcja wewnątrz XQuery odnosi się do kolumn w wierszu, który jest przetwarzana.
W SQL Server, tylko może odnosić się do xml instancji w kontekście wyrażenia źródła instrukcji insert XML LŚD; w przeciwnym razie nie może odwoływać się do kolumn, które są typu xml lub CLR typ zdefiniowany przez użytkownika.
Sql:kolumna() funkcja nie jest obsługiwana w operacji JOIN.Zastosuj operacji można zamiast niej.
Przykłady
A.Aby pobrać wartość relacyjnej wewnątrz XML przy użyciu sql:kolumna()
Przy konstruowaniu XML, następujący przykład ilustruje, jak pobieranie wartości z kolumna relacyjnej XML inny niż powiązać XML i w relacyjnej bazie danych.
Kwerenda konstrukcje XML, który ma następującą postać:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Poniższe konstruowanej XML:
The ProductID, ProductName,and ProductPrice attribute values are obtained from the Product table.
ProductModelID wartość atrybut jest pobierana z ProductModel tabela.
Aby bardziej interesujące kwerendy ProductModelName wartość atrybut jest uzyskiwana z CatalogDescription kolumna Typ xml.Ponieważ informacje wykazu modelu produktu XML nie są przechowywane dla wszystkich modeli produktu, if instrukcja jest używany do pobierania wartości tylko, jeśli istnieje.
SELECT P.ProductID, CatalogDescription.query(' declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; <Product ProductID= "{ sql:column("P.ProductID") }" ProductName= "{ sql:column("P.Name") }" ProductPrice= "{ sql:column("P.ListPrice") }" ProductModelID= "{ sql:column("PM.ProductModelID") }" > { if (not(empty(/pd:ProductDescription))) then attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName } else () } </Product> ') as Result FROM Production.ProductModel PM, Production.Product P WHERE PM.ProductModelID = P.ProductModelID AND CatalogDescription is not NULL ORDER By PM.ProductModelID
Poniższe z poprzedniej kwerendy:
Ponieważ wartości są pobierane z dwóch różnych tabel, klauzula FROM określa dwie tabele.Warunku w klauzula WHERE filtruje wynik i pobiera tylko produkty, których modeli produktu zawiera opisy wykazu.
Nazw słowo kluczowe w XQuery prologu definiuje prefiks obszaru nazw XML "pd", używany w treści kwerendy.Należy zauważyć, że tabela aliasów, "P" i "PM" są zdefiniowane w klauzula FROM samą kwerendę.
Sql:kolumna() funkcja jest używana do wartości innych niż XML wewnątrz XML.
Jest to wynik częściowy:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
Następująca kwerenda konstrukcje XML, który zawiera informacje dotyczące produktu.Informacje te obejmują IDProduktu, NazwaProduktu, ProductPrice i, jeśli jest dostępny, ProductModelName dla wszystkich produktów, które należą do określonego modelu produktu, ProductModelID = 19.XML jest następnie przypisywany do zmiennej @ x xml typu.
declare @x xml
SELECT @x = CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductID= "{ sql:column("P.ProductID") }"
ProductName= "{ sql:column("P.Name") }"
ProductPrice= "{ sql:column("P.ListPrice") }"
ProductModelID= "{ sql:column("PM.ProductModelID") }" >
{ if (not(empty(/pd:ProductDescription))) then
attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }
else
()
}
</Product>
')
FROM Production.ProductModel PM, Production.Product P
WHERE PM.ProductModelID = P.ProductModelID
And P.ProductModelID = 19
select @x