我不是SQL方面的高级程序员,也许我的问题很愚蠢,但我在Google中找不到答案。我们有一些用于构造更改包的SQL构造:
...
BEGIN TRY
BEGIN TRANSACTION;
<User Code Is Here>
...
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
...
如何将CREATE TRIGGER块链而不是<User Code Is Here>
放到正确的位置:
-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
目的是创建所有触发器或不创建任何触发器,如果失败,则在CATCH代码块中打印消息。
已编辑
错误是:
BEGIN
上: SQL80001:“ BEGIN”附近的语法不正确。期待EXTERNAL。 GO
上: SQL80001:'GO'附近的语法不正确。 END TRY
: SQL80001:“ TRY”附近的语法不正确。期待会话。 END CATCH
: SQL80001:“ CATCH”附近的语法不正确。期待会话。 答案 0 :(得分:3)
您需要在单独的范围/批处理中运行每个create table
语句(因为它必须是批处理中的第一条语句)。因此,您还必须在触发器定义中转义所有引号:
BEGIN TRY
BEGIN TRANSACTION;
exec sp_executesql N'CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
//An empty string in here has to be '''' to escape the quotes
SET NOCOUNT OFF;
END'
exec sp_executesql N'CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END'
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
事务与批处理和嵌套作用域正交,因此事务也涵盖了每个EXEC
内部发生的所有活动。