2016-08-13 2 views
-1

Я хочу выполнить сравнение, если @ accid2 не равно @accid, тогда откат действия, иначе выполнить вставку.Если другое выражение не работает

Мой результат этого триггера даже не совпадает, но он все еще вставляется в мой стол.

вот мой код:

ALTER TRIGGER [dbo].[TG_checkacctypehtl] 
ON [dbo].[Accommodation_Hotel] INSTEAD OF INSERT 
AS 
DECLARE @accid NVARCHAR(50), @accid2 NVARCHAR(50),@hid NVARCHAR(50),@fsp NVARCHAR(50), @fc NVARCHAR(50), @sr NVARCHAR(50); 
SELECT @hid = i.hotel_id FROM INSERTED i; 
SELECT @fsp = i.facillities_swimming_pool FROM INSERTED i; 
SELECT @fc = i.facillities_catering FROM INSERTED i; 
SELECT @sr = i.star_rating FROM INSERTED i; 
SELECT @accid2 = i.accommodation_id FROM INSERTED i; 
SELECT @accid = accommodation_id FROM [dbo].[Accommodation] WHERE accommodation_type= 'hotel' AND [email protected]; 
BEGIN 
BEGIN TRAN 
SET NOCOUNT ON 
PRINT @accid2 
PRINT @accid 
IF(@accid2 != @accid) 
BEGIN 
RAISERROR('Record Not Inserted, Accommodation ID is not a Hotel Id',16,1); ROLLBACK; END 
ElSE BEGIN 
INSERT INTO [dbo].[accommodation_hotel] (hotel_id,facillities_swimming_pool,facillities_catering,star_rating,accommodation_id) 
     VALUES (@hid,@fsp,@fc,@sr,@accid2);COMMIT; 

END 
END 

* печать для проверки значения я получаю.

что моя логическая ошибка или моя синтаксическая ошибка?

+0

Помимо точки, но, как правило, это плохая идея совершить фиксацию или откат внутри триггера. – sstan

+0

Каковы значения для '@ accid2' и' @ accid'? – sstan

+0

У вашего триггера есть ** ОСНОВНАЯ ** ошибка в том, что вы, кажется, считаете, что она будет называться ** один раз за строку ** - это ** не ** случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваш оператор 'INSERT', который вызывает этот триггер для запуска вставки 25 строк, вы получите триггер, запущенный ** один раз **, но тогда псевдо-таблица' Inserted' будет содержат 25 строк. Какой из этих 25 строк будет выбран ваш код? 'SELECT @id = u.id FROM Inserted u' - он не детерминирован, вы получите ** одну произвольную строку **, и вы будете ** игнорируете все остальные строки **. Для этого нужно переписать триггер! –

ответ

-1

Должен быть IF (@ accid2 <> @accid)

+0

попробуйте ard, он же ..... он по-прежнему будет вставляться в таблицу, если accid и accid2 не равны –

+0

'! =' Это то же самое, что '<>' – sstan

+1

My bad. Узнал это как <>, никогда не знал! = Был действительным. Думал, что это была ошибка. Как и многие люди, я имею дело с несколькими языками и думал, что это ошибка. – Aeroradish

1

Я бы переписать все спусковое что-то вроде этого ...

ALTER TRIGGER [dbo].[TG_checkacctypehtl] 
ON [dbo].[Accommodation_Hotel] 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
INSERT INTO [dbo].[accommodation_hotel] (hotel_id,facillities_swimming_pool,facillities_catering,star_rating,accommodation_id) 
SELECT i.hotel_id 
     ,i.facillities_swimming_pool 
     ,i.facillities_catering 
     ,i.star_rating 
     ,i.accommodation_id 
FROM inserted i 
WHERE EXISTS (SELECT 1 
       FROM [dbo].[Accommodation] a 
       WHERE a.accommodation_type= 'hotel' 
       AND a.accommodation_id = i.accommodation_id) 

IF EXISTS (SELECT 1 FROM inserted i 
      WHERE NOT EXISTS (SELECT 1 
           FROM [dbo].[Accommodation] a 
           WHERE a.accommodation_type= 'hotel' 
           AND a.accommodation_id = i.accommodation_id) 
      ) 
    BEGIN 
    RAISERROR('Records with invalid Accommodation ID is not a Hotel Id not inserted',16,1); 
    END 
END 

Вставки строки с идентификаторами размещения и вызвать ошибку, если есть строки с недопустимыми идентификаторами гостиницы, также нет необходимости во всех этих переменных.

Также запускаются триггеры для каждой транзакции, а не для каждой строки. Ваш код предполагает, что в таблице будет только одна строка, вставленная в таблицу.

+0

Могу ли я узнать, что «1» и «а» используется для внутри? –

+0

'1' является просто случайным значением для оператора' EXISTS', он не должен '1', это может быть что угодно,' * 'или даже' NULL' также будет работать нормально. 'a' является просто псевдонимом таблицы' [dbo]. [Accommodation]. –

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