Slavenin999
@Slavenin999
программист php/erlang/elixir/js

Создание триггера в ms sql server 2005

Привет хабр!
Пытаюсь создать триггер в ms sql server 2005

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE Name = 'INSERT_TR_table' AND type = 'TR')
CREATE TRIGGER INSERT_TR_table ON table1
	FOR INSERT
	AS
	DECLARE @temp_row
	DECLARE @pkey int

	select @pkey = ID from inserted;
	SET @temp_row = SELECT top 1 * FROM table1 WHERE ID = @pkey

	IF EXISTS (@temp_row)
	    UPDATE table1 SET 
		ID = case(inserted.ID) when '' then @temp_row.ID when null then @temp_row.ID else inserted.ID end,
		field1 = case(inserted.field1) when '' then @temp_row.field1 when null then @temp_row.field1 else inserted.field1 end,
	    WHERE ID = @pkey
	ELSE
	    INSERT INTO table1 (ID,field1) 
			select * from inserted;
GO


вижу горку ошибок…

Msg 156, Level 15, State 1, Line 38
Incorrect syntax near the keyword 'TRIGGER'.
Msg 156, Level 15, State 1, Line 45
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 47
Incorrect syntax near '@temp_row'.
Msg 137, Level 15, State 2, Line 49
Must declare the scalar variable "@temp_row".


точно знаю, что нужно присвоить какой-то тип переменной @temp_row, но какой ума не приложу. Там должна содержаться исходная строка. Может быть так в ms sql вообще нельзя? Облазил сегодня все поисковики, информации много но того, что нужно не нашел. Смысл триггера прост. Если запись есть, она обновляется, при условии, что новое поле не пустое, если строки нет, то она вставляется.
В ms sql, не смыслю почти ничего, облазил msdn, ничего путного не нашел.
Почему триггер? Обновлять нужно почти 200к записей в 28 таблицах, плюс, есть вероятность переезда на другой сервер, поэтому триггеры создаю прямо в тексте файла с инсертами, для каждой таблицы индивидуально. Возможно, такой подход не правильный, если кто-то подскажет более рациональный буду благодарен. Важным моментом является то, что работать нужно с ms sql server 2005, где нету многих возможностей.
  • Вопрос задан
  • 10638 просмотров
Решения вопроса 1
Как то так:

          UPDATE table1 SET  
          field1 = CASE WHEN ISNULL(i.field1,'')='' THEN t.field1 ELSE i.field1 END
          FROM table1 t INNER JOIN inserted i on t.ID=i.ID
          
          INSERT INTO table1 (ID,field1) 
          SELECT ID,field1 FROM inserted i WHERE NOT EXISTS (SELECT TOP 1 ID FROM table1 t WHERE  t.id = i.id)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
return
@return
По-хорошему, @temp_row — не нужен, inserted — это временная табличка вставленных записей, которые кладутся перед вызовом кода триггера. Так что оперируйте с ней как с таблицей (лучше) или бегите по ней курсором и для каждой записи что-то выполняйте (хуже).

Ну и create trigger должен идти первым в пачке, такие правила в MSSQL. Так что сначала проверьте, есть ли триггер и удалите, потом go и затем создавайте триггер.
Ответ написан
return
@return
Мимо ветки ответил, извините
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы