当前位置: 首页 > news >正文

SQL Server2012新特性WITH RESULT SETS

存储过程中返回结果集是很常见的,但如果想要控制部分返回结果集的字段名和数据类型将会是很困难的。SQL Server 2012(版本代号为Denali)引入一个新特性WITH RESULT SETS,可以重新定义存储过程中返回结果的字段名和数据类型。本文将详细的介绍这一新特性。

  认识WITH RESULT SETS子句

  SQL Server 2012(版本代号为Denali)引入EXECUTE语句中的WITH RESULT SETS子句,可以重新定义从存储过程中返回结果的字段名和数据类型。这会使得向拥有特定字段名和数据类型的临时表的结果集中插入记录将变得非常容易,并且不需要依赖存储过程返回了哪些内容。

  WITH RESULT SETS子句同样可以使用在存储过程中,存储过程会返回大量结果集,并且每个结果集都可以自定义各自的字段名和数据类型。

  请注意:

  ·通常情况下,如果想要限制存储过程返回一个结果集,可以使用RESULT SETS NONE子句。

  ·INSERT…EXEC语句中不能指定WITH RESULT SETS选项。

  ·返回列的数量作为结果集的一部分不会改变。

  理论已经足够了,下面围绕这一新特性亲自动手操作一下吧:

  WITH RESULT SETS子句用法实例

  在下面的实例中,首先新建一个表格并插入一些数据,然后创建存储过程——从表中查询数据并返回结果集。如果使用“EXECUTE GetEmployees call”,则返回的结果集的字段名和数据类型是存储过程中的特定格式,就不能控制并改变它。最后是使用了WITH RESULT SETS子句的“EXECUTE GetEmployees call”,可以对返回结果集的字段进行重命名字段名操作并定义不同的数据类型(只能是相互兼容的数据类型):

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employee]')   AND type in (N'U'))
       DROP TABLE [dbo].[Employee]
GO
CREATE TABLE [dbo].[Employee]
(
        [EmpId]   [INT]   NOT NULL IDENTITY PRIMARY KEY,
        [FirstName]  NVARCHAR(100) NOT NULL,
        [MiddleName]  NVARCHAR(100)  NULL,
        [LastName]  NVARCHAR(100)  NOT NULL,
)
GO
INSERT INTO [dbo].[Employee] (FirstName, MiddleName, LastName)
VALUES
       ('Arshad', NULL,'Ali'),
       ('Paul', 'M','John')
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetEmployees]')   AND type in (N'P', N'PC'))
       DROP PROCEDURE [dbo].[GetEmployees]
GO
CREATE PROCEDURE GetEmployees
AS
BEGIN
SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') +' '+ LastName AS Name
FROM dbo.Employee
END
GO
EXECUTE   GetEmployees
GO
EXECUTE   GetEmployees 
WITH RESULT SETS
(
       (
       EmployeeId INT,
       EmployeeName VARCHAR(150)
       ) 
)
GO
 

▲图1. 单一结果集的WITH RESULT SETS实例

  就像我之前所说的那样,不只是返回单一结果集的存储过程可以使用WITH RESULT SETS子句,如上图所示,返回多重结果集的存储过程也同样适用,如下代码所示。下面的实例中存储过程返回两个结果集,每个结果集的每一列的字段名和数据类型可以分别进行重新定义。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetEmployeesWithMultipleResultsets]') AND type in (N'P', N'PC'))
       DROP PROCEDURE [dbo].[GetEmployeesWithMultipleResultsets]
GO
CREATE PROCEDURE GetEmployeesWithMultipleResultsets
AS
BEGIN
SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') +' '+ LastName AS Name
FROM dbo.Employee
    SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') +' '+ LastName AS Name
FROM dbo.Employee
END
GO
EXEC GetEmployeesWithMultipleResultsets
GO
EXECUTE   GetEmployeesWithMultipleResultsets 
WITH RESULT SETS
(
       (
       EmployeeId1 INT,
       EmployeeName1 VARCHAR(150)
       ), 
       (
       EmployeeId2 INT NOT NULL,
       EmployeeFullName2 VARCHAR(150) NOT NULL
       ) 
)
GO
 SQL Server2012新特性WITH RESULT SETS
 

▲图2. 多重结果集的WITH RESULT SETS实例

  结论

  本文介绍了SQL Server 2012的结果集新特性——WITH RESULT SETS,它可以同EXECUTE语句一起用来重新定义存储过程返回结果集的字段名和数据类型。这一新特性同样可以用来分别重新定义/格式化存储过程返回的多重结果集的字段名和数据类型。










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/784379,如需转载请自行联系原作者

相关文章:

  • innodb_buffer_pool_size大小设置
  • 转贴:Ms Sql Server 2008 集成 SP1的方法!!!
  • LVS配置文件详解及相关技巧介绍
  • Python1
  • arp命令
  • 在Spring中整合JUnit单元测试
  • 项目-团队-技术-个人(专业篇)
  • zabbix监控磁盘IO
  • TimSort排序算法及一个问题分析
  • Linux平时常用命令_查看进程_监控日志等命令
  • 参观移动公司机房感想
  • linux head
  • RHCE学习13RHCS集群(RHCS+GFS2+ISCSI)
  • 【BZOJ】2733: [HNOI2012]永无乡
  • 网络通信原理及要素
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • css的样式优先级
  • DataBase in Android
  • hadoop集群管理系统搭建规划说明
  • IDEA常用插件整理
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • oldjun 检测网站的经验
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vim 折腾记
  • 微信小程序填坑清单
  • 我的业余项目总结
  • 我看到的前端
  • 小程序开发中的那些坑
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Nginx实现动静分离
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (算法)Travel Information Center
  • (译) 函数式 JS #1:简介
  • *上位机的定义
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @Transaction注解失效的几种场景(附有示例代码)
  • [.net]官方水晶报表的使用以演示下载
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Avalon] Avalon中的Conditional Formatting.
  • [CC-FNCS]Chef and Churu
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [hdu 4405] Aeroplane chess [概率DP 期望]
  • [Json.net]快速入门
  • [LeetCode] 626. 换座位
  • [LeetCode]Multiply Strings
  • [LeetCode]—Permutations II 求全排列(有重复值)