sql - 在存储过程中执行多个语句
问题描述
我正在尝试在存储过程中执行多个语句。它基本上是一个无服务器架构,我无法生成 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.
解决方案
问题不在于您的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] ...
推荐阅读
- postgresql - 如何在 postgresql 中添加时间为 09.00 点的默认时间戳?
- django - Django Q 对象未正确链接
- ldap - openldap 索引现有值
- graphql - GraphQL 订阅在 Apollo 工作室返回未经授权
- c++ - 尝试在 C++ 原始套接字上分配帧 ethh->h_dest 时出现分段错误
- python - .replace() 字典中字符串的所有实例的最佳方法
- c# - 将 AWS CloudHSM 与 C# 应用程序集成
- swift - 将多个材料文件应用到 MDL 网格
- flutter - chart_flutter PanAndZoomBehavior 在滚动视图中不起作用
- c++ - 内存顺序中的 std::array 和 std::tuple