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.