Sql 如果else表达式比较不起作用

Sql 如果else表达式比较不起作用,sql,sql-server,Sql,Sql Server,我想在@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 NVAR

我想在@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 accommodation_id=@accid2; 
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
*打印用于检查我得到的值


这是我的逻辑错误还是语法错误?

应该是如果(@accid2@accid)

我会像这样重写整个触发器

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
插入带有有效住宿ID的行,如果有任何带有无效酒店ID的行,也不需要所有这些变量,则会引发错误


还为每个事务而不是每行触发触发器。您的代码假定一次在表中只插入一行

除此之外,在触发器内执行提交或回滚通常不是一个好主意。
@accid2
@accid
的值是多少?您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。触发器将对每条语句触发一次,因此,如果导致此触发器触发的
INSERT
语句插入了25行,则触发器将触发一次,但是
Inserted
伪表将包含25行。您的代码将在此处选择这25行中的哪一行
从插入的u中选择@id=u.id
-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点!试试ard,它是一样的……如果accid和accid2不相等,它仍将插入表中。
=与我的坏代码相同。学习它就像,永远不知道!=这是有效的。我认为这是个错误。像许多人一样,我处理多种语言,认为这是一个错误。我可以知道“1”和“a”在内部使用的是什么吗???
1
只是
EXISTS
操作符的一个随机值,它不必
1
它可以是任何东西,a
*
甚至
NULL
也可以正常工作
a
只是
[dbo].[accountment]
表的别名。