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

Sql 在存储过程中执行多个语句,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我试图在存储过程中执行多个语句。它基本上是一个无服务器架构,我无法生成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 WH

我试图在存储过程中执行多个语句。它基本上是一个无服务器架构,我无法生成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.

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

SET
ALTER
命令之间添加一个
GO
,以开始新的批处理(在SSMS/
sqlcmd
中):


我在上面的SQL中看不到任何
批量
操作?我们是不是遗漏了什么?尝试时出现的错误是什么?
'CREATE/ALTER PROCEDURE'必须是查询批处理中的第一条语句。
@Larnu这是我遇到的特定错误。另外,我只想在SP内执行多个stations。Exec stations可以是SPs,也可以是表脚本。次要的一点是,如果您没有参数化执行的命令,那么实际上没有必要使用
SP_executesql
EXEC(N'somesql')
可能更易于阅读和调试。我建议使用
sp_executesql
@marcGravel是一种良好的做法。考虑到人们经常使用
EXEC('SELECT*FROM'+@SomeVariable+'其中Column='+@OtherVariable)
EXEC{Literal String}
没有参数化选项,其中as
sp_executesql
有参数化选项。@Larnu这是一个有争议的问题,因为表名无法参数化,所以:您使用的示例语句实际上是sp_executesql不是完整答案的语句(是的,
@OtherVariable
可以正确参数化)。还值得注意的是,在它抱怨之前,“CREATE/ALTER PROCEDURE”必须是查询批处理中的第一条语句。
,它告诉您行号:
Msg 111,级别15,状态1,PROCEDURE GenerateScript,第8行[批处理开始行0]
,SSMS在有问题的行上显示红色的曲线。哦,实际上我删除了SPs中的
Go
语句,它也删除了上面的语句。非常感谢。这就是为什么完整的错误消息在您的帖子@AfnanAhmad中非常重要的原因。它们几乎总是提供非常重要的信息。@Larnu收到了。谢谢:-)@如果这解决了问题,请记住将其作为解决方案,以便将来也能帮助其他读者。谢谢
SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

GO
ALTER PROCEDURE [dbo].[GenerateScript] ...