2016-02-23 5 views
1

Я написал триггер, который проверяет ограничения внешнего ключа между двумя различными базами данных. Он работает, однако я хотел добавить возможность определить, какая запись вызвала «нарушение ограничения внешнего ключа» в RAISERROR. Я добавил объявленную переменную @SourceParameterTemplateID в первый оператор SELECT, что делает его равным полю, которое я ищу. Когда я это делаю, я получаю две ошибки «Неправильный синтаксис рядом». Первый - на '=', а второй - на последнем ')'. Я искал возможное решение, однако из того, с чем я столкнулся, это должно работать. Любое понимание было бы весьма благодарным.SQL Server 2012 Неправильный синтаксис около '='

Create Trigger AV.testfkTrigger ON [AQB_MON].[AV].[NAAQValue] 
    FOR INSERT, UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Declare @SourceParameterTemplateID varchar(25) 
    IF EXISTS (
     SELECT TOP 1 @SourceParameterTemplateID = [SourceParameterTemplateID] 
     FROM INSERTED AS I 
     WHERE NOT EXISTS (
      SELECT * 
      FROM [AVData].[dbo].[SourceParameterTemplate] AS A 
      WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID] 
     ) 
     order by [SourceParameterTemplateID] 
    ) 
    BEGIN 
     RAISERROR('Violation of foreign key constraint',16,1, @SourceParameterTemplateID); 
     ROLLBACK; 
    END 
END 
+0

Вы хотите: @SourceParameterTemplateID = Выбор TOP 1 [SourceParameterTemplateID] для линии 8? – Chuck

+0

Это действительно не понравилось. Он поместил ошибку «Неверный синтаксис рядом» на @SourceParameterTemplateID и сделал [SourceParameterTemplateID] недопустимым именем столбца. –

+0

CASE WHEN удалил ошибки «Неправильный синтаксис рядом», однако триггер работал как исходный триггер без дополнительной работы по добавлению дополнительной переменной в RAISERROR. –

ответ

1

Эта часть IF EXISTS (SELECT TOP 1 @SourceParameterTemplateID приводит к ошибке синтаксиса. Вы можете использовать EXIST и одновременно назначать SourceParameterTemplateID. Вы можете обойти эту проблему, используя следующий синтаксис:

CREATE TRIGGER AV.testfkTrigger ON [AQB_MON].[AV].[NAAQValue] 
    FOR INSERT, UPDATE 
AS 
    BEGIN 
     SET NOCOUNT ON; 
     DECLARE @SourceParameterTemplateID VARCHAR(25) 
     SELECT TOP 1 
      @SourceParameterTemplateID = [SourceParameterTemplateID] 
     FROM INSERTED AS I 
     WHERE  NOT EXISTS (SELECT * 
         FROM  [AVData].[dbo].[SourceParameterTemplate] 
          AS A 
         WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID]) 
     ORDER BY [SourceParameterTemplateID] 

     IF @SourceParameterTemplateID IS NOT NULL 
      BEGIN 
      DECLARE @msg VARCHAR(250) 
      set @msg = 'Violation of foreign key constraint for SourceParameterTemplateID: ' + CAST(@SourceParameterTemplateID AS VARCHAR(50)) 
      RAISERROR(@msg,16,1); 
      ROLLBACK; 
      END 
    END 
+0

Он запускал триггер, и я получил «Нарушение ограничения внешнего ключа», но ничего не было на месте @SourceParameterTemplateID –

+0

Вы можете передать только переменную в первое поле, поле, которое вы используете в данный момент, работает только для фиксированной строки значение и обычно используется для имени хранимой процедуры/триггера. Я обновил сообщение, чтобы создать сообщение, включающее значение ID. – Jaco

+0

Я просто разместил комментарий, где я сделал то же самое. Спасибо тебе за твою помощь, Жако. –