SQL Server中有些SQL语句只能在一个批处理里面完成,例如CREATE SCHEMA语句创建SCHEMA的时候,每个SCHEMA都需要在一个单独的批处理里面完成:

  1. CREATE SCHEMA [raw];
  2. GO
  3.  
  4. CREATE SCHEMA [src];
  5. GO
  6.  
  7. CREATE SCHEMA [app];
  8. GO

所以上面语句中,我们就要在每个CREATE SCHEMA语句后面加上GO关键字,使得每个CREATE SCHEMA语句在单独的批处理中执行,这样三个CREATE SCHEMA语句才不会报错。

但是如果我们想把这三个CREATE SCHEMA语句直接封装在一个存储过程中,又不行了,因为存储过程中是不能够有GO语句的,例如如果我们创建个存储过程dbo.SP_CreateSchemas,将三个CREATE SCHEMA语句直接放进去,如下所示:

  1. CREATE PROCEDURE dbo.SP_CreateSchemas
  2. AS
  3. BEGIN
  4.  
  5. CREATE SCHEMA [raw];
  6. GO
  7.  
  8. CREATE SCHEMA [src];
  9. GO
  10.  
  11. CREATE SCHEMA [app];
  12. GO
  13.  
  14. END
  15. GO

执行上面的创建存储过程时,SQL Server会报语法错误,错误提示如下:

  1. Msg 156, Level 15, State 1, Procedure SP_CreateSchemas, Line 5 [Batch Start Line 0]
  2. Incorrect syntax near the keyword 'SCHEMA'.
  3. Msg 102, Level 15, State 1, Line 14
  4. 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存储过程的代码改为如下:

  1. CREATE PROCEDURE [dbo].[SP_CreateSchemas]
  2. AS
  3. BEGIN
  4.  
  5. DECLARE @sql NVARCHAR(MAX);
  6.  
  7. SET @sql=N'
  8. CREATE SCHEMA [raw];
  9. '
  10. EXEC sp_executesql @sql;
  11.  
  12. SET @sql=N'
  13. CREATE SCHEMA [src];
  14. '
  15. EXEC sp_executesql @sql;
  16.  
  17. SET @sql=N'
  18. CREATE SCHEMA [app];
  19. '
  20. EXEC sp_executesql @sql;
  21.  
  22. END
  23. GO

由于SQL Server的存储过程中是可以多次调用其它存储过程的,所以我们在dbo.SP_CreateSchemas存储过程中,通过调用三次sp_executesql存储过程,每次执行一个CREATE SCHEMA语句,这样相当于就是使用了三个批处理分别执行了三个CREATE SCHEMA语句。这里顺便说一下,sp_executesql存储过程执行字符串SQL语句时,也不能在字符串SQL语句中使用GO关键字,只能够通过多次调用sp_executesql存储过程来代替GO关键字。

执行dbo.SP_CreateSchemas存储过程,现在三个SCHEMA就在数据库中成功创建好了:

  1. EXEC [dbo].[SP_CreateSchemas]

如下所示:

关于sp_executesql存储过程,还可以查看下面两个链接的文章:

使用exec和sp_executesql动态执行SQL语句

sp_executesql (Transact-SQL)

SQL Server使用sp_executesql在存储过程中执行多个批处理的更多相关文章

  1. Sql Server 带参数的存储过程执行方法

    Sql Server 带参数的存储过程执行方法 Visual C# 动态操作 SQL Server 数据库实例教程(4):带参数的存储过程执行方法 上一篇文章介绍了带参数的SQL语句执行方法和不带参数 ...

  2. sql server 常用的系统存储过程

      系统存储过程 说明 sp_databases 列出服务上的所有数据库 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当 ...

  3. SQL Server技术问题之存储过程与sql语句的优缺点

    优点: 1. 允许模块化程序设计.2.可维护性高,只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储过程可独立于程序源代码而单独修改,而不需要更改.测试以及重新部署程序集 ...

  4. [转] sql server 跨数据库调用存储过程

    A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...

  5. ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

    原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 安装ArcSDE for SQL Server,最后一步成功后的界面如下: 在ArcMap中创建ArcSDE ...

  6. 在存储过程中执行3种oracle循环语句

    create or replace procedure pr_zhaozhenlong_loop /* 名称:在存储过程中执行3种循环语句 功能:利用循环给表中插入数据 调用: begin -- Ca ...

  7. SQL Server、Oracle和MySQL中查出值为NULL的替换

    参考文献: http://database.51cto.com/art/200803/67397.htm 正文 在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1 ...

  8. SQL Server 2008 R2 清空数据库中ldf日志文件

    /************************************************************ * Sql Server 2008 R2 清空数据库中ldf日志文件 * 将 ...

  9. SQL Server的非聚集索引中会存储NULL吗?

    原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...

随机推荐

  1. Struts2 常量配置

    除了action的配置,struts还有其他的一些配置,比如编码方式. 这些配置用键值对来表示,键是固定的,是常量,所以也叫做常量配置. 常量配置有5种方式,Struts会按以下顺序依次搜索加载常量( ...

  2. ES6的export与Nodejs的module.exports比较

    首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个 ...

  3. svn导一份历史版本出来

    然后: 点击最上面的Show log ; 选择你要的版本: 右键, export, 然后就可以选择需要导出的文件夹 主要有时候开发新功能然后覆盖到项目里面去了,但是产品可能需要在旧版本上面修改其他东西 ...

  4. 爬取70城房价到oracle数据库并6合1

    学习数据分析,然后没有合适的数据源,从国家统计局的网页上抓取一页数据来玩玩(没有发现robots协议,也仅仅发出一次连接请求,不对网站造成任何负荷) 运行效果 源码 python代码 ''' 本脚本旨 ...

  5. 谁有好的oracle数据库学习书籍,麻烦提供一下,感激不尽

    作为一个IT人员,想深入学习一下oracle,以前都只是懂基本的语法,CRUD 数据库设计,数据库优化,底层完全不懂,哪位仁兄有好的书籍可以推荐一下,感激不尽.

  6. lua 的 cjson 安装,使用

    1. 背景: 虚拟机安装的luajit  没有 cjson 库,就不能对 table 进行 编码操作,手动安装一个. 2. 安装: cjson下载地址:http://www.kyne.com.au/~ ...

  7. DNS解析过程--笔试答题版

    在运维笔试的时候,回答DNS解析的过程,不能写一大堆,一是不美观,二是浪费时间,应该怎么写呢?我觉得这样写比较好. 1.客户端:chche----hosts 2.DNS服务器:cache---递归-- ...

  8. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  9. Java链接Oracle

    首先在Navicat里面链接Oracle: 连接时老报错:ORA-12505, TNS:listener does not currently know of SID given in connect ...

  10. MySQL日记

    MySQL日记 MySQL——day01:https://www.cnblogs.com/noonjuan/diary/2019/07/24/11241543.html MySQL——day02:ht ...