Właściwość promocji
Kwerendy są wykonywane przede wszystkim na niewielką liczbę elementów i atrybut wartości, możesz promować te ilości na relacyjnej kolumny.Jest to przydatne podczas generowania kwerend na niewielką część danych XML podczas całego XML wystąpienie jest pobierana.Tworzenie indeksu XML w pliku XML kolumna nie jest wymagane.Zamiast tego promowanych kolumna mogą być indeksowane.Można zapisywać kwerendy użyć kolumna podwyższony.Oznacza to, że optymalizator kwerendy nie miejsce docelowe ponownie kwerend na kolumnie XML do kolumna podwyższony.
Podwyższony kolumna może być kolumna obliczana w tej samej tabela lub może być osobne, utrzymywane przez użytkownika kolumny w tabela.Jest to wystarczające w przypadku, gdy wartości singleton promowanych z każdego wystąpienie XML.Jednak wielowartościowe właściwość należy utworzyć oddzielną tabela dla właściwość, jak opisano w poniższej sekcji.
Obliczane na podstawie kolumny Typ danych xml
Kolumna obliczana, można utworzyć za pomocą funkcja zdefiniowanej przez użytkownika, który wywołuje xml metod typu danych.Typ kolumna obliczana może być dowolnego typu SQL, w tym XML.Ilustruje to poniższy przykład.
Przykład: Obliczoną na podstawie kolumny na metody typu danych xml
Tworzenie funkcja zdefiniowanej przez użytkownika dla księgi numer ISBN:
CREATE FUNCTION udf_get_book_ISBN (@xData xml)
RETURNS varchar(20)
BEGIN
DECLARE @ISBN varchar(20)
SELECT @ISBN = @xData.value('/book[1]/@ISBN', 'varchar(20)')
RETURN @ISBN
END
Dodaj kolumna obliczana do tabela ISBN:
ALTER TABLE T
ADD ISBN AS dbo.udf_get_book_ISBN(xCol)
kolumna obliczana Mogą być indeksowane w zwykły sposób.
Przykład: Kwerendy dotyczące obliczane kolumny na podstawie metody typu danych xml
Aby uzyskać <book> ISBN, którego jest 0-7356-1588-2:
SELECT xCol
FROM T
WHERE xCol.exist('/book/@ISBN[. = "0-7356-1588-2"]') = 1
Kwerendy kolumna XML można przebudowywany używać kolumna obliczana w następujący sposób:
SELECT xCol
FROM T
WHERE ISBN = '0-7356-1588-2'
Można utworzyć funkcja zdefiniowaną przez użytkownika do zwrócenia xml typ danych i kolumna obliczana za pomocą funkcja zdefiniowanej przez użytkownika.Nie można jednak utworzyć indeks XML na kolumna obliczanej, XML.
Tworzenie właściwości tabel
Może zajść potrzeba promowania niektórych właściwości wielowartościowej z danych XML do jednej lub kilku tabel, tworzenie indeksów w tych tabelach i miejsce docelowe ponownie kwerend z nich korzystać.Typowy scenariusz jest w której niewielka liczba właściwości obejmuje większość swojego obciążenia kwerendy.Można wykonać następujące czynności:
Utwórz jedną lub więcej tabel do przechowywania właściwości wielowartościowej.Może znaleźć wygodne przechowywanie jedną właściwość tabeli i zduplikowany klucz podstawowy tabela bazowa w tabelach właściwości do tyłu łączącej z tabela bazowa.
Utrzymanie względna kolejność właściwości, należy wprowadzić oddzielne kolumna dla względnej kolejności.
Tworzenie wyzwalaczy na XML kolumna do utrzymania właściwość tabel.W ramach Wyzwalacze wykonaj jedną z następujących czynności:
Użyj xml danych typu metod, takich jak nodes() i value(), do wstawiania i usuwania wierszy w tabelach właściwość.
Tworzenie streaming tabela-wyceniane w common language runtime (CLR) do wstawiania i usuwania wierszy właściwości funkcji tabelas.
Zapisywać kwerendy SQL dostępu do tabel właściwość oraz dostępu XML XML kolumnę w tabela podstawowej, z sprzężenia między tabelami przy użyciu ich klucz podstawowy.
Przykład: Tworzenie tabeli właściwości
Na ilustracji przyjęto chcesz podwyższyć imię autorów.Ksiąg ma jednego lub kilku autorów, tak że imię jest właściwość wielowartościowej.Każdy imię są przechowywane w oddzielnym wierszu tabela właściwość.klucz podstawowy w tabela podstawowej jest zduplikowany w tabela właściwość dla łączyć zwrotnego.
create table tblPropAuthor (propPK int, propAuthor varchar(max))
Przykład: Tworzenie funkcji zdefiniowanej przez użytkownika wygenerować zestawu wierszy z instancję XML
Następujące funkcja zwracająca tabelę, udf_XML2Table, akceptuje wartości klucz podstawowego i instancję XML.Pobiera imię wszystkich autorów <book> elementów i zwraca zestaw wierszy o klucz podstawowy, imię par.
create function udf_XML2Table (@pk int, @xCol xml)
returns @ret_Table table (propPK int, propAuthor varchar(max))
with schemabinding
as
begin
insert into @ret_Table
select @pk, nref.value('.', 'varchar(max)')
from @xCol.nodes('/book/author/first-name') R(nref)
return
end
Przykład: Tworzenie wyzwalaczy, aby wypełnić tabelę właściwości
Wyzwalacza wstawienia wstawia wiersze do tabela właściwość:
create trigger trg_docs_INS on T for insert
as
declare @wantedXML xml
declare @FK int
select @wantedXML = xCol from inserted
select @FK = PK from inserted
insert into tblPropAuthor
select * from dbo.udf_XML2Table(@FK, @wantedXML)
Wyzwalacz delete Usuwa wiersze z tabela właściwość na podstawie klucz podstawowy wartość usunięte wiersze:
create trigger trg_docs_DEL on T for delete
as
declare @FK int
select @FK = PK from deleted
delete tblPropAuthor where propPK = @FK
Wyzwalacz aktualizacja usuwa istniejące wiersze w tabela właściwość odpowiadające zaktualizowane wystąpienie XML i wstawia nowych wierszy do tabela właściwość:
create trigger trg_docs_UPD
on T
for update
as
if update(xCol) or update(pk)
begin
declare @FK int
declare @wantedXML xml
select @FK = PK from deleted
delete tblPropAuthor where propPK = @FK
select @wantedXML = xCol from inserted
select @FK = pk from inserted
insert into tblPropAuthor
select * from dbo.udf_XML2Table(@FK, @wantedXML)
end
Przykład: Znaleźć których autorzy mają taką samą nazwę pierwszego wystąpienia XML
Kwerendę można uformować się XML kolumna.Alternatywnie można wyszukiwać w tabela Właściwość imię "David" i wykonywać łączyć zwrotnego z tabela bazowa do zwracania XML wystąpienie.Na przykład:
SELECT xCol
FROM T JOIN tblPropAuthor ON T.pk = tblPropAuthor.propPK
WHERE tblPropAuthor.propAuthor = 'David'
Przykład: Roztwór za pomocą CLR Streaming funkcją oródwierszową
Roztwór ten składa się z następujących czynności:
Definiowanie klasy CLR, SqlReaderBase, który implementuje ISqlReader i generuje przesyłania strumieniowego, tabela-wycenione wyjścia stosując wyrażenie ścieżka na instancję XML.
Tworzenie wirtualny plik dziennika i zdefiniowanej przez użytkownika funkcja języka Transact-SQL start klasy CLR.
Zdefiniować przy użyciu funkcja zdefiniowanej przez użytkownika do utrzymania tabel właściwość insert, update i delete wyzwalaczy.
Aby to zrobić, należy najpierw utworzyć streaming funkcja CLR.xml Typ danych jest ujawniona jako klasy zarządzanej SqlXml w ADO.NET i obsługuje CreateReader() metoda, która zwraca element XmlReader.
Ostrzeżenie
Przykład kodu w tej sekcji używa XPathDocument i Element XPathNavigator.Te siły załadować wszystkich dokumentów XML do pamięci.Jeśli używasz podobne kodu w aplikacji do przetwarzania kilku dużych dokumentów XML, ten kod nie jest skalowalna.Zachować mały alokacji pamięci, a używanie interfejsów strumieniowych możliwe.Aby uzyskać więcej informacji na temat wydajności, zobacz Architektura integracji CLR.
public class c_streaming_xml_tvf {
public static ISqlReader streaming_xml_tvf
(SqlXml xmlDoc, string pathExpression) {
return (new TestSqlReaderBase (xmlDoc, pathExpression));
}
}
// Class that implements ISqlReader
public class TestSqlReaderBase : ISqlReader {
XPathNodeIterator m_iterator;
public SqlChars FirstName;
// Metadata for current resultset
private SqlMetaData[] m_rgSqlMetaData;
public TestSqlReaderBase (SqlXml xmlDoc, string pathExpression) {
// Variables for XPath navigation
XPathDocument xDoc;
XPathNavigator xNav;
XPathExpression xPath;
// Set sql metadata
m_rgSqlMetaData = new SqlMetaData[1];
m_rgSqlMetaData[0] = new SqlMetaData ("FirstName",
SqlDbType.NVarChar,50);
//Set up the Navigator
if (!xmlDoc.IsNull)
xDoc = new XPathDocument (xmlDoc.CreateReader());
else
xDoc = new XPathDocument ();
xNav = xDoc.CreateNavigator();
xPath = xNav.Compile (pathExpression);
m_iterator = xNav.Select(xPath);
}
public bool Read() {
bool moreRows = true;
if (moreRows = m_iterator.MoveNext())
FirstName = new SqlChars (m_iterator.Current.Value);
return moreRows;
}
}
Następnie należy utworzyć zespół i Transact-SQL -funkcja zdefiniowana przez użytkownika, SQL_streaming_xml_tvf (niewidoczne), który odpowiada funkcja CLR, streaming_xml_tvf.Funkcja zdefiniowana przez użytkownika jest używane do definiowania funkcja zwracająca tabelę, CLR_udf_XML2Table do generowania zestaw wierszy:
create function CLR_udf_XML2Table (@pk int, @xCol xml)
returns @ret_Table table (FK int, FirstName varchar(max))
with schemabinding
as
begin
insert into @ret_Table
select @pk, FirstName
FROM SQL_streaming_xml_tvf (@xCol, '/book/author/first-name')
return
end
Wreszcie, zdefiniuj wyzwalaczy jak pokazano w przykładzie, "Tworzenie wyzwalaczy, aby wypełnić tabela właściwość", ale zastąp udf_XML2Table funkcja CLR_udf_XML2Table.W poniższym przykładzie pokazano wyzwalacza wstawienia:
create trigger CLR_trg_docs_INS on T for insert
as
declare @wantedXML xml
declare @FK int
select @wantedXML = xCol from inserted
select @FK = PK from inserted
insert into tblPropAuthor
select *
from dbo.CLR_udf_XML2Table(@FK, @wantedXML)
Usuń wyzwalacz jest identyczny z wersja innych niż CLR.Jednakże wyzwalacza aktualizacji po prostu zastępuje udf_XML2Table() funkcja CLR_udf_XML2Table().