65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server 2008 中的表值参数

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (7投票s)

2009年6月11日

CPOL

2分钟阅读

viewsIcon

71179

MS SQL Server 2008 的新特性:表值参数。

引言

SQL Server 2008 的一个非常棒的新特性就是表值参数。在 SQL Server 的早期版本中,没有一种原生方法可以将表传递给存储过程或函数。通常的解决方法是传递一个大的 varchar 或 XML 类型,然后对其进行解析。现在,在 SQL Server 2008 中,表参数可用了。

很多时候,我们需要使用单个存储过程来更新具有一对多关系的多张数据库表。在这种情况下,我们最终会连接大量的字符串,并在存储过程中解析该字符串以获取记录。使用 SQL Server 2008,这变得非常简单,我们不再需要编写大量的代码来实现这些需求。

关于表值参数的事实

在开始使用表值参数之前,您需要了解以下几点:

  1. 有助于满足将“数组”的元素传递给存储过程/函数的需求。
  2. 表值参数用于将多行数据发送到 Transact-SQL 语句或例程,例如存储过程或函数,而无需创建临时表或许多参数。
  3. 克服了动态 SQL 方法中的安全性和性能问题。在内部被视为表变量。
  4. 作用域为批处理。
  5. 不受回滚影响(超出原子语句的作用域)。
  6. 没有直方图/分布统计信息。
  7. 如果未提供参数值,则默认为空表。

示例

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 以及将表值参数传递给存储过程和函数的能力,我们需要的代码更少,并且还可以获得性能优势。

希望您喜欢这篇文章。祝您编程愉快!!!

© . All rights reserved.