Default-Werte in INSTEAD OF INSERT-Triggern

28/01/2009 - 12:48 von Lutz Uhlmann | Report spam
Hallo NG!

Hat von euch jemand Erfahrungswerte mit "INSTEAD OF INSERT"-triggern und
dort speziell mit der Verwendung der Default-Werte für Spalten?
INSERT INTO schema.TABELLE
( [ID]
,[BitField]
,[NDATE]
,[KEN])
SELECT [ID]
,[BitField]
,[NDATE]
,[KEN]
FROM inserted
Obiger Insert innerhalb des Triggers berücksichtigt ja keine Default-Werte
von schema.TABELLE, sondern er versucht natürlich die Inahlte aus inserted
(bei Leer halt NULL) zu schreiben.

Ich löse das derzeit so:
INSERT INTO schema.TABELLE
( [ID]
,[BitField]
,[NDATE]
,[KEN])
SELECT [ID]
,ISNULL(inserted.BitField, 0) AS [BitField]
,ISNULL(inserted.NDATE, GETDATE()) AS [NDATE]
,ISNULL(inserted.KEN, 10) AS [KEN]
FROM inserted

Das ist aber nicht optimal, da ich für den Fall, daß ich Default-Werte
àndere immer auch den Trigger àndern müßte.

Gibt es ne Möglichkeit, auf den referenzierten Default-Wert einer Spalte zu
referenzieren??
Vielleicht sowas in der Art etwa:
,ISNULL(inserted.KEN, DEFAULT_WERT()) AS [KEN]

oder auch
DECLARE @defaultKEN
SET @defaultKEN = DEFAULT_WERT( schema.Tabelle.KEN)
...
,ISNULL(inserted.KEN, @defaultKEN) AS [KEN]

Danke ...

Lutz
 

Lesen sie die antworten

#1 Stefan Hoffmann
28/01/2009 - 13:13 | Warnen spam
hallo Lutz,

Lutz Uhlmann schrieb:
Ich löse das derzeit so:
INSERT INTO schema.TABELLE
( [ID]
,[BitField]
,[NDATE]
,[KEN])
SELECT [ID]
,ISNULL(inserted.BitField, 0) AS [BitField]
,ISNULL(inserted.NDATE, GETDATE()) AS [NDATE]
,ISNULL(inserted.KEN, 10) AS [KEN]
FROM inserted


Ist nicht notwendig:

http://www.microsoft.com/technet/pr...x?mfr=true

Das funktioniert bei mir:

CREATE TABLE [dbo].[TestInsteadDefault](
[ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Created] [datetime] NOT NULL DEFAULT (getdate()),
[Payload] [nvarchar](255) NOT NULL DEFAULT ('<n/a>'),
[Playground] [nvarchar](255) NOT NULL);
go

CREATE TRIGGER [dbo].[tr_TestInsteadOf_Ins] ON [dbo].[TestInsteadDefault]
INSTEAD OF INSERT
AS
INSERT INTO TestInsteadDefault
(
Created,
Payload,
Playground
)
SELECT Created,
Payload,
Playground
FROM inserted
go

SELECT * FROM TestInsteadDefault;
GO

INSERT INTO TestInsteadDefault (Playground) VALUES ('playground');
go

SELECT * FROM TestInsteadDefault;
go


mfG

Ähnliche fragen