【问题标题】:Create trigger statement inside an IF OBJECT_ID('TableName', 'U'): Incorrect syntax near 'BEGIN'. Expecting EXTERNAL在 IF OBJECT_ID('TableName', 'U') 内创建触发器语句:'BEGIN' 附近的语法不正确。期待外部
【发布时间】:2016-06-27 14:42:04
【问题描述】:

编辑:我后来发现,如果使用 Visual Studio DB 项目,则无需检查表、触发器等是否存在。

如何创建触发器?以下给了我如下所示的错误:

IF OBJECT_ID('SomeSchema.tableName', 'U') IS NOT NULL
BEGIN
  CREATE TABLE SomeSchema.tableName ( ... 
  );
END
GO

IF OBJECT_ID('SomeSchema.tableName', 'U') IS NOT NULL
BEGIN
  CREATE TRIGGER [SomeSchema].[triggername] 
    ON [SomeSchema].[tableName]  
  FOR UPDATE

  AS 
  BEGIN
    IF @@ROWCOUNT = 0 RETURN   

    SET NOCOUNT ON  

    UPDATE SomeSchema.tableName
       SET SomeColumn = GETUTCDATE(),
           OtherColumn      = HOST_NAME()
      FROM SomeSchema.SomeTable INNER JOIN INSERTED ON INSERTED.ID = 
           SomeSchema.SomeTable.Id
  END
END

Error:
SQL80001: Incorrect syntax near 'BEGIN'.  Expecting EXTERNAL. 

这是在 Visual Studio 数据库项目中。不,这不是 clr 触发器。只有当创建触发器在 if 语句中时,它才会给我这个错误。

【问题讨论】:

  • 这是一个 clr 触发器,请发布整个代码
  • 谷歌搜索错误文本显示了导致此错误的至少 2 个不同原因。我们需要查看更多代码。
  • 问题出在开始结束之间的 4 个点之一。有关更多详细信息,您需要放大这些点,以便我们阅读其中的内容....
  • @GuidoG 绝对正确!
  • 它不能包含在IF - CREATE TRIGGER 中:“CREATE TRIGGER 必须是批处理中的第一个语句...”

标签: sql-server triggers database-project


【解决方案1】:

我已将其更改为以下内容。这似乎有效。

如果使用数据库项目,则无需进行以下检查。我以前没有使用数据库项目的经验。

IF OBJECT_ID(N'triggername') IS NOT NULL
DROP TRIGGER triggername
go

CREATE TRIGGER triggername
  ON tablename
FOR UPDATE
AS 
BEGIN
  IF @@ROWCOUNT = 0 RETURN   

  SET NOCOUNT ON  

  UPDATE ...
END

【讨论】:

  • 为什么要检查是否存在? DB/SQL 项目的全部意义在于将您的项目与数据库进行比较并使它们保持同步。如果触发器不存在,它将被创建——您不必添加额外的代码来检查它。如果确实存在,则会根据需要对其进行更改以使其同步。
  • 谢谢,我以前没有 db 项目的经验,最近才知道它是如何工作的。
  • 这可能会有所帮助 - 我使用 SSDT 的经验汇总 - schottsql.wordpress.com/2013/10/22/all-ssdt-articles - 不自称是专家,但对入门可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多