在数据库开发过程中,我们经常会需要在存储过程中组合动态sql语句,以满足开发需要,动态sql语句主要是用到一个系统存储过程: sql_executesql来执行组合的sql语句,如果你对sp_executesql还不了解,请忽略下文,先到网上查清楚 sp_executesql是干嘛用的:),可以访问微软的官方解决:http://msdn2.microsoft.com/zh- cn/library/ms188001.aspx]]>
在数据库开发过程中,我们经常会需要在存储过程中组合动态sql语句,以满足开发需要,动态sql语句主要是用到一个系统存储过程:sql_executesql来执行组合的sql语句,如果你对sp_executesql还不了解,请忽略下文,先到网上查清楚sp_executesql是干嘛用的:),可以访问微软的官方解决:http://msdn2.microsoft.com/zh-cn/library/ms188001.aspx

举个简单例子,我们需要一个存储过程对数据根据条件进行汇总,表结构如下:

 CREATE TABLE tmp_Table(  ID INT,   --ID编号  t_Total INT,  --总量  t_Name VARCHAR(100), --名称  t_Type INT  --类型  )

现在我们要满足以下条件:
1、要求通过存储过程OUTPUT返回“总量、类型、名称”
2、当指定t_Type的值为-1时,我们查询第一条记录;反之则查询指定t_Type的第一条记录

根据条件我们写出存储过程基本结构如下:

 CREATE PROCEDURE p_TestExecuteSql  @t_Type INT,    --指定t_type的值  @ReturnTotal INT,   --返回总量  @ReturnName VARCHAR(100) OUTPUT, --返回名称  @ReturnType INT OUTPUT   --返回类型  BEGIN  --执行相应的sql语句  DECLARE @sql NVARCHAR(1000)    --注意这里一定要是NVARCHAR的类型  SET @sql = N'SELECT TOP 1 @Total = t_Total, @Name = t_Name, @Type = t_Type FROM tmp_Table'  IF t_Type <> -1 SET @sql = @sql + N' WHERE p_Type = ' + CONVERT(NVARCHAR, @t_Type)  EXEC  sp_executesql @sql,  N'@Total INT OUTPUT, @Name VARCHAR(100) OUTPUT, @Type INT OUTPUT',  @ReturnTotal OUTPUT,  @ReturnName OUTPUT,  @ReturnType output  END

我们来分析p_TestExecuteSql这个存储过程几个重点:
1.
 DECLARE @sql NVARCHAR(1000)

定义一个sql语句的变量,长度根据你估计组合的sql语句会有多长,需要注意的是一定要用NVARCHAR类型,关于NVARCHAR类型,请到网上查询相关资料
2.
 EXEC  sp_executesql @sql,  '@Total INT OUTPUT, @Name VARCHAR(100) OUTPUT, @Type INT OUTPUT',  @ReturnTotal OUTPUT,  @ReturnName OUTPUT,  @ReturnType output

你可能不明白@Total,@Name,@Type这些变量并没有申明却为何可以使用,那么你需要了解sp_executesql的工作方式,sp_executesql实质就是把你组合的sql语句重组成一个存储过程再执行。了解这个本质,你就不难明白为什么要这么写了,例如本例,我们调用p_TestExecuteSql这个存储过程如下:
 DECLARE @ReturnTotal INT,@ReturnName VARCHAR(100), @ReturnType INT  exec p_TestExecuteSql 0, @ReturnTotal OUTPUT, @ReturnName OUTPUT, @ReturnType OUTPUT

存储过程p_TestExecuteSql组合sql语句,组合的sql语句如下:
SELECT @Total = t_Total, @Name = t_Name, @Type = t_Type FROM tmp_Table WHERE p_Type = 0

当我们调用sp_executesql执行这条语句时,就相当于sp_executesql为我们创建了一个存储过程再执行,创建的存储过程就像这样:
 CREATE PROCUDRE p_TmpProc  @Total INT OUTPUT,  @Name VARCHAR(100) OUTPUT,  @Type INT OUTPUT  BEGIN  SELECT @Total = t_Total, @Name = t_Name, @Type = t_Type FROM tmp_Table WHERE p_Type = 0  END

  

注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/

转载于:https://www.cnblogs.com/conis/archive/2007/07/16/1720602.html

动态组合sql语句详解相关推荐

  1. MyBatis SQL语句详解

    MyBatis SQL语句详解 1 CRUD标签 1.1 select 1.2 insert 1.3 update 1.4 delete 1.5 #{ }和${ }的区别 2 动态SQL 2.1 if ...

  2. SQL语句详解(四)——SQL联表查询

    今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询. 一.SQL联表查询简介 在前文SQL语句详解(三)--SQL子查询中,我们给大家介绍了SQL子查询的相关知识和使用示例.实际上 ...

  3. mysql切换用户sql语句,MySQL用户管理及SQL语句详解

    [(none)]>select user,host frommysql.user; #查询用户和主机+---------------+-----------+ | user | host | + ...

  4. oracle分页查询sql语句通用,oracle分页查询sql语句,oracle分页查询sql语句详解

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句 Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点 ...

  5. SQL基础:常用SQL语句详解(转)

    到今天为止,人们对关系数据库做了大量的研究,并开发出关系数据语言,为操作关系数据库提供了方便的用户接口.关系数据语言目前有几十种,具有增加.删除.修改.查询.数据定义与控制等完整的数据库操作功能.通常 ...

  6. 【数据库】MySQL的sql语句详解

    目录 MySQL之sql语句 一, INSERT语句 insert语句的使用: 1,给表中一次性插入一条记录 2,给表中一次性插入多条记录 二, REPLACE语句 REPLACE语句的使用 1,语法 ...

  7. 按日统计注册人数SQL语句详解(自动补齐空缺数据)

    按日统计XX人数其实是一个很常用的功能.比如说按日统计注册人数.按日统计订单数等.原理其实很相似,一通百通. 话不多说,进入正题. 一.最终sql语句展示 我们先来看下最终的sql语句及得到的结果: ...

  8. mysql批量删除数据sql语句_mysql批量删除数据sql语句详解

    1.like与 in批量删除指定记录 like语法 like主要是用来模糊查询了 sql = "delete from A where field like '%ABC%'" 这个 ...

  9. mysql左连接sql语句详解_SQL各种连接查询详解(左连接、右连接..)

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...

  10. Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

    文章目录 内连接 inner join 示例 外连接 outer join left outer join 左外连接 示例 right outer join 右外连接 示例 full outer jo ...

最新文章

  1. 【译】微软出品HashiCorp Terraform 和 Vault 系列视频
  2. 谁是2020年最强Python库?年度Top10出炉
  3. python可以做什么系统-用python做推荐系统(一)
  4. 如何不用 List.clear() 方法 就清空 list 中的 所有元素(中兴面试)
  5. mac mysql prefpane_【MySQL数据库开发之一】Mac下配置安装数据库-MySQL
  6. Spring中配置Hibernate事务的四种方式
  7. 计算机房安全等级标准,电子计算机房的分级标准
  8. 2019年今日头条机试_JAVA后台岗_第一题
  9. Intellij IDEA设置显示行号
  10. c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...
  11. go语言和java比_python与java、php、go的优势对比,各语言不要引起恐慌哈
  12. html%3cform%3e不换行,HTML URL 编码
  13. 14.链表中倒数第k个结点
  14. mitmproxy安装证书_在 macOS 上使用 mitmproxy 透明代理进行网络抓包
  15. 音视频学习之基础概念整理(rgb/yuv,pcm,采样频率,帧率,码率,i帧p帧b帧,dts/pts)
  16. Error:(list) object cannot be coerced to type 'double'的处理
  17. 用blender环绕物体拍摄
  18. stl文件用proe怎么打开_3dMax怎么导入proe的文件渲染?3dmax导入stl文件过程
  19. 12、Storage(存储)(基础知识)
  20. 实战 | flink sql 实时 TopN

热门文章

  1. loadrunner—web_url
  2. sicily 1022. Train Problem
  3. ROS-Academy-for-Beginners 替换自己的地图模型
  4. Logistic回归小结
  5. docker容器运行后退出,怎么才能一直运行?【转】
  6. 使用自定义端口连接SQL Server 的方法
  7. Angular之constructor和ngOnInit差异及适用场景
  8. Linux文件类型 扩展名的作用
  9. python之路 jQuery学习笔记
  10. .net的数据类型说明