【问题标题】:Incorrect syntax near the keyword 'TRIGGER'关键字“TRIGGER”附近的语法不正确
【发布时间】:2018-06-16 21:14:00
【问题描述】:
CREATE TRIGGER AirportCodeDegis
    ON AIRPORT
    INSTEAD OF UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Silinen_AirportCode nvarchar(10) = (SELECT deleted.Airport_code FROM deleted);
    DECLARE @Yeni_AirportCode nvarchar(10) = (SELECT inserted.Airport_code FROM inserted);

    -- Airport Tablosunda güncellenen Airport_code değerini, CAN_LAND tablosunun içindeki airport_code değerine atamaktadır..
    IF (SELECT COUNT(*) FROM CAN_LAND WHERE CAN_LAND.Airport_code = @Silinen_AirportCode) != 0
        BEGIN 
            UPDATE CAN_LAND SET Airport_code = @Yeni_AirportCode WHERE Airport_code = @Silinen_AirportCode; 
        END

    -- Airport Tablosunda güncellenen airport_code değerini, FLIGHT_LEG tablosunun içindeki Arrival_airport_code değerine atamaktadır..
    IF (SELECT COUNT(*) FROM FLIGHT_LEG WHERE FLIGHT_LEG.Arrival_airport_code = @Silinen_AirportCode) != 0
        BEGIN 
            UPDATE FLIGHT_LEG SET Arrival_airport_code = @Yeni_AirportCode WHERE Arrival_airport_code = @Silinen_AirportCode; 
        END

    -- Airport Tablosunda güncellenen airport_code değerini, FLIGHT_LEG tablosunun içindeki Departure_airport_code değerine atamaktadır..
    IF (SELECT COUNT(*) FROM FLIGHT_LEG WHERE Departure_airport_code = @Silinen_AirportCode) != 0
        BEGIN
            UPDATE FLIGHT_LEG SET Departure_airport_code = @Yeni_AirportCode WHERE Departure_airport_code = @Silinen_AirportCode; 
        END

    -- Airport Tablosunda güncellenen airport_code değerini, LEG_INSTANCE tablosunun içindeki Arrival_airport_code değerine atamaktadır..
    IF (SELECT COUNT(*) FROM LEG_INSTANCE WHERE LEG_INSTANCE.Arrival_airport_code = @Silinen_AirportCode) != 0
        BEGIN 
            UPDATE LEG_INSTANCE SET Arrival_airport_code = @Yeni_AirportCode WHERE Arrival_airport_code = @Silinen_AirportCode; 
        END

    -- Airport Tablosunda güncellenen airport_code değerini, LEG_INSTANCE tablosunun içindeki Departure_airport_code değerine atamaktadır..
    IF (SELECT COUNT(*) FROM LEG_INSTANCE WHERE LEG_INSTANCE.Departure_airport_code = @Silinen_AirportCode) != 0
        BEGIN 
            UPDATE LEG_INSTANCE SET Departure_airport_code = @Yeni_AirportCode WHERE Departure_airport_code = @Silinen_AirportCode; 
        END

    SET NOCOUNT OFF;
END;

我收到此错误:

Msg 156,级别 15,状态 1,过程 SegmentasyonSagla,第 107 行 [批处理开始第 3 行]
关键字“TRIGGER”附近的语法不正确。

你能帮我解决这个错误吗谢谢:)

【问题讨论】:

  • 引用 marc_s 的常见 cmets 之一:您的触发器有 MAJOR 缺陷,您似乎认为它会被调用 每行一次 - 不是的情况。触发器将每条语句触发一次,因此如果导致此触发器触发的 INSERT 语句插入 25 行,您将触发一次触发器,但 Inserted 伪表将包含 25 行。

标签: sql-server tsql database-trigger


【解决方案1】:

我猜,您正试图在名为 SegmentasyonSagla 的过程中创建触发器。您应该使用动态查询来创建触发器。

CREATE PROC AirportCodeDegisProc
as
begin
    declare @query nvarchar(max) = '
    CREATE TRIGGER AirportCodeDegis
        ON ActiveEvaluations
        INSTEAD OF UPDATE
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @Silinen_AirportCode nvarchar(10) = (SELECT deleted.Airport_code FROM deleted);
        DECLARE @Yeni_AirportCode nvarchar(10) = (SELECT inserted.Airport_code FROM inserted);

        -- Airport Tablosunda güncellenen Airport_code değerini, CAN_LAND tablosunun içindeki airport_code değerine atamaktadır..
        IF (SELECT COUNT(*) FROM CAN_LAND WHERE CAN_LAND.Airport_code = @Silinen_AirportCode) != 0
            BEGIN 
                UPDATE CAN_LAND SET Airport_code = @Yeni_AirportCode WHERE Airport_code = @Silinen_AirportCode; 
            END

        -- Airport Tablosunda güncellenen airport_code değerini, FLIGHT_LEG tablosunun içindeki Arrival_airport_code değerine atamaktadır..
        IF (SELECT COUNT(*) FROM FLIGHT_LEG WHERE FLIGHT_LEG.Arrival_airport_code = @Silinen_AirportCode) != 0
            BEGIN 
                UPDATE FLIGHT_LEG SET Arrival_airport_code = @Yeni_AirportCode WHERE Arrival_airport_code = @Silinen_AirportCode; 
            END

        -- Airport Tablosunda güncellenen airport_code değerini, FLIGHT_LEG tablosunun içindeki Departure_airport_code değerine atamaktadır..
        IF (SELECT COUNT(*) FROM FLIGHT_LEG WHERE Departure_airport_code = @Silinen_AirportCode) != 0
            BEGIN
                UPDATE FLIGHT_LEG SET Departure_airport_code = @Yeni_AirportCode WHERE Departure_airport_code = @Silinen_AirportCode; 
            END

        -- Airport Tablosunda güncellenen airport_code değerini, LEG_INSTANCE tablosunun içindeki Arrival_airport_code değerine atamaktadır..
        IF (SELECT COUNT(*) FROM LEG_INSTANCE WHERE LEG_INSTANCE.Arrival_airport_code = @Silinen_AirportCode) != 0
            BEGIN 
                UPDATE LEG_INSTANCE SET Arrival_airport_code = @Yeni_AirportCode WHERE Arrival_airport_code = @Silinen_AirportCode; 
            END

        -- Airport Tablosunda güncellenen airport_code değerini, LEG_INSTANCE tablosunun içindeki Departure_airport_code değerine atamaktadır..
        IF (SELECT COUNT(*) FROM LEG_INSTANCE WHERE LEG_INSTANCE.Departure_airport_code = @Silinen_AirportCode) != 0
            BEGIN 
                UPDATE LEG_INSTANCE SET Departure_airport_code = @Yeni_AirportCode WHERE Departure_airport_code = @Silinen_AirportCode; 
            END

        SET NOCOUNT OFF;
    END;'
    EXECUTE sp_executesql @query
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2013-12-16
    • 2017-11-22
    • 2013-10-29
    • 2014-06-22
    • 1970-01-01
    • 2013-05-04
    • 2013-05-21
    相关资源
    最近更新 更多