SQLSERVER 2012 可编程性新特性_WITH RESULT SETS

摘要:SQLSERVER 2012 可编程性新特性_WITH RESULT SETS

SQL2012新增了可以使用 WITH RESULT SETS 选项定义结果集的元数据的功能。我们知道,存储过程中返回结果集是很常见的,但如果想要控制部分返回结果集的字段名和数据类型将会是很困难的。SQL Server 2012引入一个新特性WITH RESULT SETS,可以重新定义存储过程中返回结果的字段名和数据类型。这会使得向拥有特定字段名和数据类型的临时表的结果集中插入记录将变得非常容易,并且不需要依赖存储过程返回了哪些内容。

 

使用 EXECUTE 传递单个参数

uspGetEmployeeManagers 存储过程需要一个参数 (@EmployeeID)。 以下示例执行 uspGetEmployeeManagers 存储过程,以 Employee ID 6 作为参数值。

 
USE AdventureWorks2012;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO

 

然后我们使用WITH RESULT SETS定义结果集:

1.使用 EXECUTE 重新定义单个结果集

前面的一些示例执行 EXEC dbo.uspGetEmployeeManagers 6;,将返回 7 个列。 以下示例说明如何使用 WITH RESULT SET 语法更改返回的结果集的名称和数据类型。

 
USE AdventureWorks2012;
GO

EXEC uspGetEmployeeManagers 16
WITH RESULT SETS
( 
   ([Reporting Level] int NOT NULL,
    [ID of Employee] int NOT NULL,
    [Employee First Name] nvarchar(50) NOT NULL,
    [Employee Last Name] nvarchar(50) NOT NULL,
    [Employee ID of Manager] nvarchar(max) NOT NULL,
    [Manager First Name] nvarchar(50) NOT NULL,
    [Manager Last Name] nvarchar(50) NOT NULL )
);

2.使用 EXECUTE 重新定义两个结果集

在执行返回多个结果集的语句时,请定义每个预期结果集。 以下示例在 AdventureWorks2012 中创建一个返回两个结果集的过程。 然后使用 WITH RESULT SETS 子句执行该过程并指定两个结果集定义。

 
USE AdventureWorks2012;
GO

--Create the procedure
CREATE PROC Production.ProductList @ProdName nvarchar(50)
AS
-- First result set
SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE Name LIKE @ProdName;
-- Second result set 
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders
    FROM Production.Product AS P
    JOIN Sales.SalesOrderDetail AS S
        ON P.ProductID  = S.ProductID 
    WHERE Name LIKE @ProdName
    GROUP BY Name;
GO

-- Execute the procedure 
EXEC Production.ProductList '%tire%'
WITH RESULT SETS 
(
    (ProductID int,   -- first result set definition starts here
    Name Name,
    ListPrice money)
    ,                 -- comma separates result set definitions
    (Name Name,       -- second result set definition starts here
    NumberOfOrders int)
);

更详细的资料,请参阅官方解释:http://msdn.microsoft.com/zh-cn/library/ms188332(v=SQL.110).aspx