Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
ksn007
Member

Откуда:
Сообщений: 69
Коллеги, есть ли возможность в INSTEAD OF INSERT-триггере определить, какие поля не были явно указаны в INSERT-е, его запустившем? См. пример, он не работает:
CREATE TABLE dbo.Orders(
	oid INT NOT NULL PRIMARY KEY,
	od SMALLDATETIME NOT NULL,
	sd SMALLDATETIME
)
GO
ALTER TRIGGER dbo.Orders_Insert
ON dbo.Orders
INSTEAD OF INSERT
AS
	SET NOCOUNT ON

	PRINT CASE WHEN UPDATE(sd) THEN 'update' ELSE 'not' END
	PRINT COLUMNS_UPDATED()

	INSERT dbo.Orders(oid, od, sd)
	SELECT oid, od, CASE WHEN UPDATE(sd) THEN sd ELSE od END
	FROM inserted
GO
INSERT dbo.Orders(oid, od) SELECT 1, '20131011'
11 окт 13, 11:37    [14955482]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
Glory
Member

Откуда:
Сообщений: 104760
UPDATE returns the TRUE value in INSERT actions because the columns have either explicit values or implicit (NULL) values inserted.
11 окт 13, 11:41    [14955535]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
INSTEAD OF INSERT
и 3 поля ,что мешает просто проверить значения то ? тем же ISNULL,все равно там будет или значение или нулл
11 окт 13, 12:06    [14955714]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
ksn007
Member

Откуда:
Сообщений: 69
Glory
UPDATE returns the TRUE value in INSERT actions because the columns have either explicit values or implicit (NULL) values inserted.

Да, почему пример не работает, я понимаю :)

Maxx
INSTEAD OF INSERT
и 3 поля ,что мешает просто проверить значения то ? тем же ISNULL,все равно там будет или значение или нулл

Если написать INSERT dbo.Orders(oid, od, sd) SELECT 1, '20131011', NULL , в таблицу должен прописываться NULL (т.е. в sd прописываем или явно заданное в INSERT значение, в т.ч. NULL, или, если в INSERT поля нет, значение od).

Понятно, что есть вариант слепить вьюшку поверх dbo.Orders с фиктивным полем-флажком CAST(NULL AS BIT) isSd , а INSTEAD OF INSERT-триггер повесить на вьюшку и написать там INSERT dbo.Orders(.., sd, ..) SELECT .., CASE WHEN isSd = 1 OR sd IS NOT NULL THEN sd, .. FROM inserted ... но вдруг есть вариант попроще?
11 окт 13, 12:22    [14955853]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
Glory
Member

Откуда:
Сообщений: 104760
ksn007
т.е. в sd прописываем или явно заданное в INSERT значение, в т.ч. NULL, или, если в INSERT поля нет, значение od)

А чем NULL в тексте комнады отличается от NULL-а, который будет при отсутствии поля в тексте команды ?
Определитесь, что является дефлотным значение для поля
11 окт 13, 12:25    [14955880]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ksn007
вдруг есть вариант попроще?

Сразу в INSERT'е указывать все нужные значения и обойтись без триггера?
11 окт 13, 12:28    [14955903]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
ksn007
Member

Откуда:
Сообщений: 69
Glory
ksn007
т.е. в sd прописываем или явно заданное в INSERT значение, в т.ч. NULL, или, если в INSERT поля нет, значение od)

А чем NULL в тексте комнады отличается от NULL-а, который будет при отсутствии поля в тексте команды ?
Определитесь, что является дефлотным значение для поля

Вопрос как раз в том и состоит, можно ли выявить это отличие (внутри INSTEAD OF INSERT-триггера). CREATE TABLE .. (.., sd SMALLDATETIME DEFAULT od), ессно, сделать нельзя (The name "od" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.)...

Можно сформулировать вопрос по-другому: как в DEFAULT прописать другое поле? Есть "корявый" вариант (нельзя явно задать sd = '19000101'):
CREATE TABLE dbo.Orders(
	oid INT NOT NULL PRIMARY KEY,
	od SMALLDATETIME NOT NULL,
	sd SMALLDATETIME DEFAULT '19000101'
)
GO
CREATE TRIGGER dbo.Orders_Insert
ON dbo.Orders
INSTEAD OF INSERT
AS
	SET NOCOUNT ON

	INSERT dbo.Orders(oid, od, sd)
	SELECT oid, od, CASE WHEN sd = '19000101' THEN od ELSE sd END
	FROM inserted
GO
INSERT dbo.Orders(oid, od)     SELECT 1, '20130101'
INSERT dbo.Orders(oid, od, sd) SELECT 2, '20130101', NULL
INSERT dbo.Orders(oid, od, sd) SELECT 3, '20130101', '20130102'
SELECT * FROM dbo.Orders


А как-то более грамотно?
11 окт 13, 13:11    [14956301]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
Glory
Member

Откуда:
Сообщений: 104760
ksn007
Вопрос как раз в том и состоит, можно ли выявить это отличие

NULL - он всегда NULL. Какая разница как NULL попало в поле ?

ksn007
как в DEFAULT прописать другое поле?

Никак. Это должна быть константа
11 окт 13, 13:16    [14956349]     Ответить | Цитировать Сообщить модератору
 Re: Явно заданные поля в INSTEAD OF INSERT-триггере  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ksn007,

Если sd будет not null, тогда можно триггером реализовать желаемое.
11 окт 13, 13:31    [14956465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить