首页 > 解决方案 > 在存储过程中执行多个语句

问题描述

我正在尝试在存储过程中执行多个语句。它基本上是一个无服务器架构,我无法生成 SQL 脚本并运行这些脚本来生成 SP 或表。我唯一的方法是通过 SP 或 Functions 运行脚本。有什么线索可以以编程方式执行批量语句。我尝试使用以下 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.

标签: sqlsql-serverstored-procedures

解决方案


问题不在于您的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] ...

推荐阅读