Wyrażenia i kolumny obliczane w zamiast wyzwalaczy

Lista wyboru widoku może mieć wyrażeń innych niż proste wyrażenia składa się z nazwy kolumna.INSTEAD OF wyzwalaczy w tych widokach musi mieć logiki poprawnie określić od wartości określonej na wstawianie i aktualizacja co wartości muszą być zestaw do kolumny w tabela bazowa.Oto przykłady takich wyrażeń:

  • Wyświetlanie wyrażeń, które nie są mapowane na dowolnej kolumna w tabela, takich jak stała lub niektóre typy funkcji.

  • Wyrażenia widoku mapowane do wielu kolumn, takie jak wyrażenia złożone przez Konkatenowanie ciągów znaków z dwóch lub więcej kolumn.

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

Problemy te stosuje się także do kolumna widoku, które są proste wyrażenia odwołującego się do kolumna obliczana w tabela podstawowej.Definiowanie wyrażenie kolumna obliczana mogą mieć tego samego formularza jako bardziej złożone wyrażenie na liście wybierz widok.

Widoki mogą zawierać wyrażenia ich liście select, które nie jest mapowany do kolumny tabela bazowa, na przykład:

CREATE VIEW dbo.ExpressionView
AS
SELECT BusinessEntityID, JobTitle, GETDATE() AS TodaysDate
FROM AdventureWorks2008R2.HumanResources.Employee;

Chociaż TodaysDate kolumna nie mapuje się do dowolnej kolumna tabeli SQL Server należy utworzyć TodaysDate kolumna w inserted Tabela przekazaniem do wyzwalacza INSTEAD OF zdefiniowana ExpressionView.Jednakże inserted.TodaysDate Kolumna jest nullable; Dlatego instrukcja INSERT, która odwołuje się do ExpressionView nie muszą podawać wartości dla kolumna.Ponieważ wyrażenie nie mapuje się do kolumna w tabela, wyzwalacza można zignorować wartości dostarczonych przez WSTAW w tej kolumnie.

To samo podejście powinny być stosowane do wyrażenia widok prosty, że odwołanie obliczane kolumny tabel bazowych, które kreowania wynik, który nie jest zależna od innych kolumn, na przykład:

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

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

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

Wyrażenie CombinedName w ConcatView zawiera wartości uzyskiwanej z FirstName i LastName wartości.Jeśli zdefiniowano wyzwalacza INSTEAD OF WSTAW na ConcatView, muszą mieć Konwencja jak instrukcji INSERT podana wartość CombinedName kolumna, która umożliwia wyzwalacza, określić, która część ciąg należy umieścić FirstName kolumna i części, które należy umieścić LastName kolumna.Jeśli wybierzesz konwencji mających instrukcji INSERT, określ wartość CombinedName przy użyciu konwencji 'first_name;last_name', następujące wyzwalacz może przetwarzać pomyślnie INSERT:

CREATE TRIGGER InsteadSample on dbo.ConcatView
INSTEAD OF INSERT
AS
BEGIN

   INSERT INTO dbo.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 jest wymagane kolumny widoku procesu, które są proste wyrażenia odnoszące się do kolumn obliczanych złożonych wyrażeń.

Niektóre wyrażenia widoku można przekształcać wartość kolumna tabela bazowa, na przykład wykonywania operacji matematycznych lub używając kolumna jako parametr do funkcja.przypadek wyzwalacza INSTEAD OF WSTAWIĆ logikę można wykonać dwa podejścia:

  • Konwencja może być że wszystkich instrukcji INSERT dostaw surowca wartość umieścić w tabela bazowa i logiki wyzwalacza przenosi wartość z inserted tabeli do tabeli podstawowej.

  • Może być Konwencji, że wszystkie instrukcje WSTAWIAJĄCE dostaw wartości oczekiwane są zwracane przez SELECT w widoku, w którym to przypadek logikę wyzwalacza należy odwrócić operacji.Na przykład:

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

Niektóre wyrażeń, takich jak wyrażenia złożone operacje matematyczne, takie jak dodawanie i odejmowanie, użytkownicy nie można dostarczyć wartość wyzwalacza można używać do budowania jednoznacznie wartości dla obiekt docelowy oprzeć kolumn tabela.Na przykład, jeśli listy wybierz widok zawiera wyrażenie IntColA + AddedColumns jako IntColB, co oznacza wartość 10 w inserted.AddedColumns oznacza?Jest wynikiem 3 + 7, 2 + 8 lub 5 + 5 10?Nie ma możliwości stwierdzić od wartości inserted.AddedColumns samodzielnie jakie wartości powinny być umieszczone w IntColA i IntColB.

W takich przypadkach wyzwalacza można zakodowane użyć alternatywnych źródeł informacji w celu określenia wartości do zestaw w kolumnach tabela bazowa.Widoków, które mają zamiast wyzwalaczy na liście wybierz widok musi zawierać wystarczające informacje, aby zbudować wartości dla wszystkich niepustych kolumn tabel bazowych zmodyfikowanych przez wyzwalacz.Nie wszystkie dane muszą pochodzić bezpośrednio z inserted tabela.W niektórych przypadkach wartości w inserted tabela może być wartości klucz, które używa wyzwalacz do pobrania odpowiednich danych z innych tabel podstawowych.

Zobacz także

Koncepcje