代码之家  ›  专栏  ›  技术社区  ›  Afnan Ahmad

在存储过程中执行多个语句

  •  0
  • Afnan Ahmad  · 技术社区  · 6 年前

    我试图在存储过程中执行多个语句。它基本上是一个无服务器架构,我无法生成SQL脚本并运行这些脚本来生成SP或表。我唯一的方法就是通过SP或函数运行脚本。有什么线索可以让我以编程方式执行批量语句吗。我尝试了以下SP:

    SET ANSI_NULLS ON   
    SET QUOTED_IDENTIFIER ON
    
    Alter PROCEDURE [dbo].[GenerateScript]   
    
    AS
    BEGIN
    
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Bar1]') AND type in (N'P', N'PC'))
    BEGIN
    EXEC dbo.sp_executesql @statement = N'
    CREATE PROCEDURE [dbo].[Bar1] 
    AS
    BEGIN
    Select Foo from Table 
    END
    ' 
    END
    
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Bar2]') AND type in (N'P', N'PC'))
    BEGIN
    EXEC dbo.sp_executesql @statement = N'
    CREATE PROCEDURE [dbo].[Bar2] 
    AS
    BEGIN
    Select Foo from Table 
    END
    ' 
    END
    
    END
    

    这会产生以下错误:

    'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Thom A    6 年前

    问题不在于你自己 sp_executesql 命令,这是SQL的开始(错误实际上是告诉您问题所在)。正如错误告诉你的那样 CREATE / ALTER PROCEDURE '必须是查询批处理中的第一条语句,但是,批处理中的第一条命令是 SET ANSI_NULLS ON .

    添加 GO SET ALTER 启动新批处理的命令(在SSMS中)/ sqlcmd

    SET ANSI_NULLS ON
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    ALTER PROCEDURE [dbo].[GenerateScript] ...