SQL Server 2008 中的表值参数
MS SQL Server 2008 的新特性:表值参数。
引言
SQL Server 2008 的一个非常棒的新特性就是表值参数。在 SQL Server 的早期版本中,没有一种原生方法可以将表传递给存储过程或函数。通常的解决方法是传递一个大的 varchar
或 XML 类型,然后对其进行解析。现在,在 SQL Server 2008 中,表参数可用了。
很多时候,我们需要使用单个存储过程来更新具有一对多关系的多张数据库表。在这种情况下,我们最终会连接大量的字符串,并在存储过程中解析该字符串以获取记录。使用 SQL Server 2008,这变得非常简单,我们不再需要编写大量的代码来实现这些需求。
关于表值参数的事实
在开始使用表值参数之前,您需要了解以下几点:
- 有助于满足将“数组”的元素传递给存储过程/函数的需求。
- 表值参数用于将多行数据发送到 Transact-SQL 语句或例程,例如存储过程或函数,而无需创建临时表或许多参数。
- 克服了动态 SQL 方法中的安全性和性能问题。在内部被视为表变量。
- 作用域为批处理。
- 不受回滚影响(超出原子语句的作用域)。
- 没有直方图/分布统计信息。
- 如果未提供参数值,则默认为空表。
示例
CREATE TYPE dbo.OrderIDs AS TABLE
(
pos INT NOT NULL PRIMARY KEY,
orderid INT NOT NULL UNIQUE
)
DECLARE @T AS dbo.OrderIDs;
INSERT INTO @T(pos, orderid) VALUES(1, 10248)
INSERT INTO @T(pos, orderid) VALUES(2, 10250)
INSERT INTO @T(pos, orderid) VALUES(3, 10249);
SELECT * FROM @T;
在上面的代码片段中,我们创建了一个 Table
用户定义类型。在 SQL Server 2008 中,我们可以定义表 UDT(这是 SQL Server 2008 中的一项新功能)。然后,使用新创建的 UDT 创建一个变量,并将一些记录插入到该变量中并对其进行查询。
CREATE PROC dbo.sp_GetOrders
(@T AS dbo.tbl_Order READONLY)
AS
SELECT O.OrderID, O.OrderDate, O.CustomerID
FROM dbo.tbl_Order AS O JOIN @T AS T ON
O.OrderID = T. OrderID
ORDER BY T. RecordID;
GO
DECLARE @MyOrderIDs AS dbo.tbl_Order;
INSERT INTO @MyOrderIDs(pos, orderid) VALUES(1, 10248)
INSERT INTO @MyOrderIDs(pos, orderid) VALUES(2, 10250)
INSERT INTO @MyOrderIDs(pos, orderid) VALUES(3, 10249);
EXEC dbo.sp_GetOrders @T = @MyOrderIDs;
上面的代码片段显示了如何在 SQL 存储过程中将 Table
UDT 用作参数。
结论
因此,现在有了 Table
UDT 以及将表值参数传递给存储过程和函数的能力,我们需要的代码更少,并且还可以获得性能优势。
希望您喜欢这篇文章。祝您编程愉快!!!