SQL Server使用sp_executesql在存储过程中执行多个批处理
SQL Server中有些SQL语句只能在一个批处理里面完成,例如CREATE SCHEMA语句创建SCHEMA的时候,每个SCHEMA都需要在一个单独的批处理里面完成:
CREATE SCHEMA [raw];
GO CREATE SCHEMA [src];
GO CREATE SCHEMA [app];
GO
所以上面语句中,我们就要在每个CREATE SCHEMA语句后面加上GO关键字,使得每个CREATE SCHEMA语句在单独的批处理中执行,这样三个CREATE SCHEMA语句才不会报错。
但是如果我们想把这三个CREATE SCHEMA语句直接封装在一个存储过程中,又不行了,因为存储过程中是不能够有GO语句的,例如如果我们创建个存储过程dbo.SP_CreateSchemas,将三个CREATE SCHEMA语句直接放进去,如下所示:
CREATE PROCEDURE dbo.SP_CreateSchemas
AS
BEGIN CREATE SCHEMA [raw];
GO CREATE SCHEMA [src];
GO CREATE SCHEMA [app];
GO END
GO
执行上面的创建存储过程时,SQL Server会报语法错误,错误提示如下:
Msg 156, Level 15, State 1, Procedure SP_CreateSchemas, Line 5 [Batch Start Line 0]
Incorrect syntax near the keyword 'SCHEMA'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near 'END'.
原因就是在存储过程中,是不能有GO关键字的。
那么怎么才能在SQL Server的存储过程中,执行多个批处理才能执行的语句呢?
这时候我们可以用到sp_executesql存储过程,sp_executesql这个存储过程我相信熟悉SQL Server的开发人员都不会陌生,它可以用来执行由字符串拼接而成的SQL语句。而sp_executesql存储过程执行SQL语句的时候,还有个特点,那就是sp_executesql存储过程会将字符串拼接而成的SQL语句在一个单独的批处理中执行。
所以本例中如果我们要在一个存储过程中执行三个CREATE SCHEMA语句,可以通过调用三次sp_executesql存储过程来实现,我们将上面dbo.SP_CreateSchemas存储过程的代码改为如下:
CREATE PROCEDURE [dbo].[SP_CreateSchemas]
AS
BEGIN DECLARE @sql NVARCHAR(MAX); SET @sql=N'
CREATE SCHEMA [raw];
'
EXEC sp_executesql @sql; SET @sql=N'
CREATE SCHEMA [src];
'
EXEC sp_executesql @sql; SET @sql=N'
CREATE SCHEMA [app];
'
EXEC sp_executesql @sql; END
GO
由于SQL Server的存储过程中是可以多次调用其它存储过程的,所以我们在dbo.SP_CreateSchemas存储过程中,通过调用三次sp_executesql存储过程,每次执行一个CREATE SCHEMA语句,这样相当于就是使用了三个批处理分别执行了三个CREATE SCHEMA语句。这里顺便说一下,sp_executesql存储过程执行字符串SQL语句时,也不能在字符串SQL语句中使用GO关键字,只能够通过多次调用sp_executesql存储过程来代替GO关键字。
执行dbo.SP_CreateSchemas存储过程,现在三个SCHEMA就在数据库中成功创建好了:
EXEC [dbo].[SP_CreateSchemas]
如下所示:

关于sp_executesql存储过程,还可以查看下面两个链接的文章:
SQL Server使用sp_executesql在存储过程中执行多个批处理的更多相关文章
- Sql Server 带参数的存储过程执行方法
Sql Server 带参数的存储过程执行方法 Visual C# 动态操作 SQL Server 数据库实例教程(4):带参数的存储过程执行方法 上一篇文章介绍了带参数的SQL语句执行方法和不带参数 ...
- sql server 常用的系统存储过程
系统存储过程 说明 sp_databases 列出服务上的所有数据库 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当 ...
- SQL Server技术问题之存储过程与sql语句的优缺点
优点: 1. 允许模块化程序设计.2.可维护性高,只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储过程可独立于程序源代码而单独修改,而不需要更改.测试以及重新部署程序集 ...
- [转] sql server 跨数据库调用存储过程
A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...
- ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接
原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 安装ArcSDE for SQL Server,最后一步成功后的界面如下: 在ArcMap中创建ArcSDE ...
- 在存储过程中执行3种oracle循环语句
create or replace procedure pr_zhaozhenlong_loop /* 名称:在存储过程中执行3种循环语句 功能:利用循环给表中插入数据 调用: begin -- Ca ...
- SQL Server、Oracle和MySQL中查出值为NULL的替换
参考文献: http://database.51cto.com/art/200803/67397.htm 正文 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1 ...
- SQL Server 2008 R2 清空数据库中ldf日志文件
/************************************************************ * Sql Server 2008 R2 清空数据库中ldf日志文件 * 将 ...
- SQL Server的非聚集索引中会存储NULL吗?
原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...
随机推荐
- Java面向对象之泛型
主要介绍: 认识泛型 构造方法中使用泛型 设置多个泛型 通配符 泛型接口 泛型方法 泛型数组 一.认识泛型 具体实例如下: package com.huolongluo.newfeatures; /* ...
- SSH开发模式——Struts2进阶
在之前我有写过关于struts2框架的博客,好像是写了三篇,但是之前写的内容仅仅是struts2的一些基础知识而已,struts2还有很多有趣的内容等待着我们去发掘.我准备再写几篇关于struts2的 ...
- 使用 Docker Alpine 镜像安装 nginx
微镜像Alpine,Alpine Linux 是一款独立的⾮商业性的通⽤ Linux 发行版,Alpine Linux 围绕 musl libc 和 busybox 构建,尽管体积很小,Apline ...
- K8s集群中设置harbor仓库认证
一,获取harbor的登陆用户名和密码(demo_user/demo_pwd) 二,使用kubectl命令生成secret(不同的namespace要分别生成secret,不共用) kubectl c ...
- 201871010104-陈园园 《面向对象程序设计(java)》第十四周学习总结
201871010104-陈园园 <面向对象程序设计(java)>第十四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010107-公海瑜《面向对象程序设计(java)》第十六周学习总结
201871010107-公海瑜<面向对象程序设计(java)>第十六周学习总结 项目 内容 这个作业属于哪 ...
- 201871010132--张潇潇--《面向对象程序设计(java)》第十六周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.c ...
- 使用教育邮箱免费申请JetBrains套装(IntelliJ, PhpStorm, WebStorm...)
想下个PhpStorm来写php,发现可以使用教育账号白嫖. 申请步骤 打开 申请页面 ,点击 “APPLY NOW” 开始申请. 填写姓名,以及学校提供给你的邮箱(edu后缀邮箱,或.end.cn) ...
- workerman docker 运行试用
看到别人项目使用了workerman 作为webserver ,看了下介绍发现此框架还是挺强大的,比较喜欢使用 docker运行软件,所以基于php 7.3 的基础镜像简单使用下 环境准备 项目使用了 ...
- JAVA并归排序(数组+链表)
并归排序与快速排序相似,靠分治思想突破了排序算法 O(n2) 的瓶颈. 我们看回顾一下几大排序算法的时间.空间复杂度: 排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 O(n ...