2013-04-28 4 views
1

База данных, в которой я работаю, имеет следующий триггер вставки. Проблема заключается в том, что триггер не будет работать с многострочной вставкой. Когда я пытаюсь вставить несколько строк одновременно, я получаю следующее сообщение.Вставка триггера T-SQL

Msg 512, уровень 16, состояние 1, процедура _ti_UD06, линия 8
Subquery вернулся более чем на 1 значение. Это недопустимо, когда подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение . Я думаю, что проблема заключается в следующем утверждении: вернет более одного значения при вставке нескольких строк.

Как я могу заставить эту триггерную работу вставить несколько строк?

IF(SELECT PROGRESS_RECID FROM inserted) IS NULL 

Есть 2 колонки в таблице, PROGRESS_RECID и PROGRESS_RECID_IDENT_.

Я думаю, что PROGRESS_RECID_IDENT_ - это столбец Identity для SQL Server. Сервер PROGRESS_RECID_INDENT используется сервером PROGRESS.

Если новая запись вставляется проверки запуска, чтобы увидеть, если PROGRESS_RECID является недействительным и установит его в inserted.Identity

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as 
begin 
if (select PROGRESS_RECID from inserted) is NULL 
    begin 
     update t set PROGRESS_RECID = i.IDENTITYCOL 
     from UD06 t JOIN INSERTED i ON 
     t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_ 
     select convert (bigint, @@identity) 
    end 
end 

Вот определение Таблица

CREATE TABLE [dbo].[UD06](
[Company] [nvarchar](8) NULL, 
[Key1] [nvarchar](50) NOT NULL, 
[Key2] [nvarchar](50) NULL, 
[Key3] [nvarchar](50) NULL, 
[Key5] [nvarchar](50) NULL, 
[Character01] [nvarchar](max) NULL, 
[Character02] [nvarchar](max) NULL, 
[Character03] [nvarchar](max) NULL, 
[Character04] [nvarchar](max) NULL, 
[Character05] [nvarchar](max) NULL, 
[Character06] [nvarchar](max) NULL, 
[Character07] [nvarchar](max) NULL, 
[Character08] [nvarchar](max) NULL, 
[Character09] [nvarchar](max) NULL, 
[Character10] [nvarchar](max) NULL, 
[SysRowID] [nvarchar](36) NULL, 
[SysRevID] [int] NULL, 
[BitFlag] [int] NULL, 
[GlobalUD06] [tinyint] NULL, 
[GlobalLock] [tinyint] NULL, 
[PROGRESS_RECID] [bigint] NULL, 
[PROGRESS_RECID_IDENT_] [bigint] IDENTITY(1,1) NOT NULL 
) ON [PRIMARY] 

ответ

1

Я думаю, что вы» re довольно близко уже:

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as 
begin 

    UPDATE t 
    SET PROGRESS_RECID = t.PROGRESS_RECID_IDENT_ --not "IDENTITYCOL" 
    FROM UD06 t 
    JOIN inserted i ON t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_ 
    WHERE i.PROGRESS_RECID is Null 

    -- Not sure what this bit is for? I doubt it's a good idea though... 
    select convert (bigint, @@identity) 

end 
+0

Я внес изменения, я больше не получаю ошибку, но PROGRESS_RECID имеет значение null после вставки. – Kevin

+0

@Kevin Нам нужно будет увидеть, как определение таблицы будет идти дальше. – RBarryYoung

+0

Вот определение таблицы. – Kevin

Смежные вопросы