2016-08-13 10 views
-1

Ich möchte einen Vergleich durchführen, wenn @ accid2 nicht gleich @accid dann Rollback-Aktion, sonst führen Sie einfügen.Wenn Else-Vergleich nicht funktioniert

Mein Ergebnis dieses Triggers ist sogar, dass nicht übereinstimmt, aber es immer noch in meine Tabelle einfügen.

hier ist mein Code:

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 

* print für die Prüfung ist der Wert i erhalten.

ist das mein logischer Fehler oder mein Syntaxfehler?

+0

Neben dem Punkt, aber es ist in der Regel eine schlechte Idee, ein Commit oder Rollback innerhalb eines Triggers zu tun. – sstan

+0

Was sind die Werte für '@ accid2' und' @ accid'? – sstan

+0

Ihr Auslöser hat ** MAJOR ** Fehler, in dem Sie davon ausgehen, dass es ** einmal pro Zeile ** genannt wird - das ist ** nicht ** der Fall. Der Trigger wird ** einmal pro Anweisung ** ausgelöst. Wenn also Ihre INSERT-Anweisung, die diesen Auslöser auslöst, 25 Zeilen einfügt, erhalten Sie den Trigger einmal ** ausgelöst, dann aber die "Eingefügte" Pseudo-Tabelle enthalten 25 Zeilen. Welche dieser 25 Zeilen wird Ihr Code hier auswählen? 'SELECT @id = u.id FROM Eingefügte u' - es ist nicht deterministisch, Sie erhalten ** eine beliebige Zeile ** und Sie werden ** ignorieren alle anderen Zeilen **. Sie müssen Ihren Trigger neu schreiben, um dies zu berücksichtigen! –

Antwort

-1

Sollten IF (@ accid2 <> @accid)

+0

versuchen, ard, es gleich ..... es wird immer noch in die Tabelle einfügen, wenn die accid und accid2 ist nicht gleich –

+0

'! =' Ist das gleiche wie '<>' – sstan

+1

Mein schlechtes. Habe es gelernt als <>, wusste nie! = War gültig. Dachte, es war ein Fehler. Wie viele andere Menschen habe ich mit mehreren Sprachen zu tun und dachte, es wäre ein Fehlwurf. – Aeroradish

1

ich den ganzen Trigger so etwas wie diese neu schreiben würde ...

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 

Legen Sie die Zeilen mit gültiger Unterkunft ids und hebt einen Fehler, wenn Es gibt Zeilen mit ungültigen Hotel-IDs, auch keine Notwendigkeit für alle diese Variablen.

Auch Trigger werden für jede Transaktion ausgelöst, nicht für jede Zeile. Ihr Code geht davon aus, dass immer nur eine Zeile in die Tabelle eingefügt wird.

+0

kann ich wissen, was die "1" und "a" für innen verwendet ?? –

+0

'1' ist nur ein zufälliger Wert für den' EXISTS'-Operator, es muss nicht '1' sein, es kann irgendetwas sein, ein' * 'oder sogar' NULL' funktionieren auch gut. 'a' ist nur ein Alias ​​für die' [dbo]. [Accommodation] 'Tabelle. –