Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Zgodnie z opisem w temacie wiązanie danych relacyjnych wewnątrzXML, można użyć funkcji sql:column(() podczas używania metod typów danych XML uwidaczniać wartość relacyjną wewnątrz biblioteki XQuery.
Na przykład metoda query() (typ danych XML) służy do określania zapytania względem wystąpienia XML przechowywanego w zmiennej lub kolumnie typu xml. Czasami możesz również chcieć, aby zapytanie używało wartości z innej kolumny, innej niż XML, aby połączyć dane relacyjne i XML. W tym celu należy użyć funkcji sql:column().
Wartość SQL zostanie zamapowana na odpowiadającą wartość XQuery, a jej typ będzie typem podstawowym XQuery, który jest odpowiednikiem odpowiedniego typu SQL.
Składnia
sql:column("columnName")
Uwagi
Należy pamiętać, że odwołanie do kolumny określonej w sql:column() funkcji wewnątrz zapytania XQuery odnosi się do kolumny w przetwarzanym wierszu.
W programie SQL Server można odwoływać się tylko do wystąpienia xml w kontekście wyrażenia źródłowego instrukcji insert XML-DML; W przeciwnym razie nie można odwoływać się do kolumn typu xml lub typu zdefiniowanego przez użytkownika CLR.
Funkcja sql:column() nie jest obsługiwana w operacjach JOIN. Zamiast tego można użyć operacji APPLY.
Przykłady
A. Pobieranie wartości relacyjnej wewnątrz pliku XML przy użyciu metody sql:column()
W konstruowaniu kodu XML poniższy przykład ilustruje sposób pobierania wartości z kolumny relacyjnej innej niż XML w celu powiązania danych XML i relacyjnych.
Zapytanie konstruuje kod XML, który ma następujący formularz:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Zwróć uwagę na następujące elementy w skonstruowanym pliku XML:
Wartości atrybutów ProductID, ProductNamei ProductPrice są uzyskiwane z tabeli produktu.
Wartość atrybutu ProductModelID jest pobierana z tabeli ProductModel.
Aby zapytanie było bardziej interesujące, wartość atrybutu ProductModelName jest uzyskiwana z kolumny CatalogDescription typu xml . Ponieważ informacje o wykazie modeli produktów XML nie są przechowywane dla wszystkich modeli produktów, instrukcja
ifsłuży do pobierania wartości tylko wtedy, gdy 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
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
Ponieważ wartości są pobierane z dwóch różnych tabel, klauzula FROM określa dwie tabele. Warunek w klauzuli WHERE filtruje wynik i pobiera tylko produkty, których modele produktów mają opisy katalogu.
przestrzeni nazw słowo kluczowe w XQuery Prolog definiuje prefiks przestrzeni nazw XML "pd", który jest używany w treści zapytania. Pamiętaj, że aliasy tabeli , "P" i "PM" są zdefiniowane w klauzuli FROM samego zapytania.
Funkcja sql:column() służy do stosowania wartości innych niż XML wewnątrz kodu 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" />
...
Poniższe zapytanie konstruuje kod XML zawierający informacje specyficzne dla produktu. Te informacje obejmują wartości ProductID, ProductName, ProductPrice i, jeśli są dostępne, ProductModelName dla wszystkich produktów należących do określonego modelu produktu ProductModelID=19. Kod XML jest następnie przypisywany do zmiennej @x typu xml.
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
Zobacz też
porównaj typizowane dane XML z nietypowych XML
danych XML (SQL Server)
tworzenie wystąpień danych XML
metody typów danych xml
języka modyfikacji danych XML (XML DML)