Udostępnij za pośrednictwem


Wyrażenia i kolumny obliczane w, a nie z wyzwalaczy

Lista wyboru widoku może zawierać wyrażenia innych niż proste wyrażenia, składający się z nazwy kolumna.Wyzwalacze O INSTEAD w tych widokach musi mieć logiki, aby poprawnie określić od wartości określonej na INSERT i UPDATE, jakie wartości muszą być zestaw do kolumn w tabela bazowa.Oto przykłady takich wyrażeń:

  • Widok wyrażenia, które nie mapowane na dowolnej kolumna w tabela, na przykład stała lub niektóre typy funkcji.

  • Wyrażenia widoku mapowane do wielu kolumn, takie jak złożone wyrażenia poprzez konkatenację ciągów z dwóch lub większej liczbie kolumn.

  • Wyświetlanie wyrażeń, które przekształcenie wartości kolumna pojedynczej tabela bazowa, takich jak odwołanie do kolumna w funkcja.

Problemy te mają również zastosowanie do widoku kolumny, które są proste wyrażenia odwołującego się do kolumna obliczana w tabela bazowa.Wyrażenie określające kolumna obliczana może mieć ten sam formularz jako bardziej złożone wyrażenie na liście select widoku.

Widoki mogą zawierać wyrażenia w liście select, które nie mapowanych do każdej kolumny tabela bazowa, na przykład:

CREATE VIEW ExpressionView
AS
SELECT *, GETDATE() AS TodaysDate
FROM AdventureWorks.HumanResources.Employee

Mimo że TodaysDate kolumna nie mapuje się do dowolnej kolumna tabela SQL Server 2005 należy utworzyć TodaysDate kolumna w dodaje tabela przekazaniem do wyzwalacz Z INSTEAD zdefiniowane na ExpressionView. Jednak inserted.TodaysDate Kolumna jest pustych, dlatego instrukcja INSERT, jest odwoływanie się do ExpressionView nie trzeba podać wartość dla tej kolumny. Ponieważ wyrażenie nie mapuje się do kolumna w tabela, wyzwalacza można zignorować wartości dostarczonych przez INSERT w tej kolumnie.

Ten sam sposób powinny być stosowane do wyrażenia widok prosty, że odwołanie obliczona kolumn w tabelach podstawowych, które również tworzyć wyniku, który nie jest zależna od innych kolumn, na przykład:

CREATE TABLE ComputedExample
   (
    PrimaryKey    int PRIMARY KEY,
    ComputedCol   AS SUSER_NAME()
   )

Niektóre złożone wyrażenia mapowania do wielu kolumn, na przykład:

CREATE TABLE SampleTable
     (
      PriKey    int,
      FirstName nvarchar(20),
      LastName  nvarchar(30)
     )
GO
CREATE VIEW ConcatView
AS
SELECT PriKey, FirstName + ' ' + LastName AS CombinedName
FROM SampleTable

Wyrażenie CombinedName w ConcatView wartości są połączone z FirstName i LastName wartości. Jeśli wyzwalacz INSERT Z INSTEAD jest zdefiniowana na ConcatView, musisz mieć Konwencja jak podana wartość w instrukcji INSERT CombinedName kolumny, która umożliwia wyzwalacz ustalić która część ciąg znaków, należy wprowadzić FirstName kolumny, a która część powinny zostać wprowadzone LastName Kolumna. Jeśli wybierzesz Konwencji o instrukcji INSERT, określ wartość CombinedName przy użyciu Konwencji "first_name;last_name", następujące wyzwalacza pomyślnie może przetwarzać INSERT:

CREATE TRIGGER InsteadSample on ConcatView
INSTEAD OF INSERT
AS
BEGIN

   INSERT INTO SampleTable
      SELECT PriKey,
         -- Pull out the first name string.
         SUBSTRING(
            CombinedName,
            1,
            (CHARINDEX(';', CombinedName) - 1)
            ),
         -- Pull out the last name string.
         SUBSTRING(
            CombinedName,
            (CHARINDEX(';', CombinedName) + 1),
            DATALENGTH(CombinedName) - (CHARINDEX(';', CombinedName) + 1)
            )
      FROM inserted
END

Podobne logika wymagane jest, aby proces widoku kolumny, które są proste wyrażenia, odnoszące się do kolumny obliczanej, które zawierają złożone wyrażenia.

Niektóre wyrażenia widoku można przekształcić wartości kolumna tabela bazowa, na przykład operacji matematycznych, lub używając kolumna jako parametr do funkcja.W takim przypadek logikę wyzwalacz INSERT Z INSTEAD można wykonać dwie metody:

  • Konwencja może być nieprzetworzonej wartości do umieszczenia w tabela bazowa dostarczania wszystkich instrukcji INSERT i logikę wyzwalacza przeniesie wartości z dodaje tabeli do tabela bazowa.

  • Może być Konwencji, że wszystkie instrukcje INSERT podania wartości, oczekują one zostały zwrócone przez SELECT w widoku, w takim przypadek logikę wyzwalacza musi odwrotna operacja.Na przykład:

    CREATE TABLE BaseTable
      (
       PrimaryKey   int PRIMARY KEY,
       ColumnB      int,
       ColumnC      decimal(19,3)
      )
    
    CREATE VIEW SquareView AS
    SELECT PrimaryKey, ColumnB,
           -- Square the value of ColumnC
           SQUARE(ColumnC) AS SquareC
    FROM BaseTable
    
    CREATE TRIGGER SquareTrigger ON SquareView
    INSTEAD OF INSERT
    AS
    BEGIN
      INSERT INTO BaseTable
         SELECT PrimaryKey, ColumnB,
                 -- Perform logical inverse of function in view.
                 SQRT(SquareC)
         FROM inserted
    END
    

Niektóre wyrażeń, takich jak złożone wyrażenia przy użyciu operacje matematyczne, takie jak dodawanie i odejmowanie użytkowników może okazać się niemożliwe podania wartości, wyzwalacza można użyć, aby jednoznacznie tworzenie wartości dla obiekt docelowy kolumny tabela bazowa.Na przykład jeśli widok listy select zawiera wyrażenie IntColA + AddedColumns AS IntColB, co oznacza wartość 10 w inserted.AddedColumns mean?Jest to wynikiem 3 + 7, 2 + 8 lub 5 + 5 10?Nie ma możliwości stwierdzić, od wartości inserted.AddedColumns samodzielnie co wartości powinny być umieszczone w IntColA and IntColB.

W takim przypadku wyzwalacz może być kodowane do używania z alternatywnych źródeł informacji w celu określenia wartości w kolumnach tabela bazowa.Dla widoków, a nie z wyzwalaczami o widoku Lista wyboru musi zawierać wystarczających informacji do utworzenia wartości dla wszystkich niepustych kolumn tabel bazowych zmodyfikowanych przez wyzwalacz.Nie wszystkie dane muszą pochodzić bezpośrednio z dodaje tabela.W niektórych przypadkach wartości w polach dodaje tabela może być wartości klucz, które wyzwalacz używa w celu pobrania odpowiednich danych z innych tabel bazowych.

See Also

Concepts