SQL Server2012新特性WITH RESULT SETS

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

存储过程中返回结果集是很常见的,但如果想要控制部分返回结果集的字段名和数据类型将会是很困难的。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,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 存储 数据库
SQL学习一:ACID四个特性,CURD基本操作,常用关键字,常用聚合函数,五个约束,综合题
这篇文章是关于SQL基础知识的全面介绍,包括ACID特性、CURD操作、常用关键字、聚合函数、约束以及索引的创建和使用,并通过综合题目来巩固学习。
35 1
|
6月前
|
SQL XML Java
MyBatis的强大特性--动态SQL
MyBatis的强大特性--动态SQL
83 2
|
6月前
|
SQL 关系型数据库 MySQL
TiDB特有的SQL语法和特性
【2月更文挑战第28天】本章将深入探讨TiDB特有的SQL语法和特性,这些功能和优化是TiDB相较于传统关系型数据库所独有的。通过了解这些特性,读者将能更充分地利用TiDB的优势,优化数据库性能,提升业务处理效率。
|
SQL 存储 Oracle
【数据库05】玩转SQL的高阶特性 2
【数据库05】玩转SQL的高阶特性
|
SQL 存储 Java
【数据库05】玩转SQL的高阶特性 1
【数据库05】玩转SQL的高阶特性
|
消息中间件 SQL 存储
Flink1.9新特性解读:通过Flink SQL查询Pulsar
Flink1.9新特性解读:通过Flink SQL查询Pulsar
465 0
Flink1.9新特性解读:通过Flink SQL查询Pulsar
|
SQL Oracle 关系型数据库
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
417 0
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
|
SQL 关系型数据库 Linux
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
之前一直使用的PostgreSQL 9.6系列版本,由于官方不再维护了,就准备换成最新稳定版本的,查看了一下官方版本说明,发现13系列版本是目前稳定性较好的版本,于是兴冲冲的更换了过来,但随之而来的就是一些新特性,其中就比如表中的OID字段,这个字段是对象标识符,之前能用于行标记,现在发现只有表才具有这个隐藏字段,行数据没有这个支持了,于是就需要将老版本的表进行关闭掉这个字段。下面我们就开始关闭之旅。
166 0
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
|
SQL Java API
Flink 1.13.0 sql-client 新特性及源码分析
在 Flink 1.13.0 版本中增加了很多新特征,具体可以参考前面一篇文章,其中很重要的一点是对 sql-client 功能做了加强,支持了初始化脚本和执行 SQL 文件,SQL 客户端是直接运行和部署 SQL 流和批处理作业的便捷方法,而无需从命令行或作为 CI 的一部分来编写任何代码,这个版本大大改进了 SQL 客户端的功能。现在,SQL 客户端和SQL 脚本都支持 Java 应用程序可用的几乎所有操作(通过编程方式从 TableEnvironment 启动查询时)。这意味着 SQL 用户在其 SQL 部署中需要粘贴的代码变的更少.由于篇幅的原因这篇文章只会介绍 SQL CLIENT
Flink 1.13.0 sql-client 新特性及源码分析
|
SQL 分布式计算 Spark
SPARK SQL中 Grouping sets转Expand怎么实现的(逻辑计划级别)
SPARK SQL中 Grouping sets转Expand怎么实现的(逻辑计划级别)
549 0
下一篇
无影云桌面