Udostępnij za pośrednictwem


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:

  1. 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.

  2. Tworzenie wirtualny plik dziennika i zdefiniowanej przez użytkownika funkcja języka Transact-SQL start klasy CLR.

  3. 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().