标签:
表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据。
表值参数与 OLE DB 和 ODBC 中的参数数组类似,但具有更高的灵活性,且与 Transact-SQL 的集成更紧密。表值参数的另一个优势是能够参与基于数据集的操作。
(注意:Transact-SQL 通过引用向例程传递表值参数,以避免创建输入数据的副本。)
在 Transact-SQL 中创建和使用表值参数
表值参数具有两个主要部分:SQL Server 类型以及引用该类型的参数。若要创建和使用表值参数,请执行以下步骤:
若要在 SQL Server Native Client 中使用表值参数,请参阅Table-Valued Parameters (SQL Server Native Client)。
若要在 ADO.NET 中使用表值参数,请参阅 ADO.NET 文档。
表值参数具有更高的灵活性,在某些情况下,可比临时表或其他传递参数列表的方法提供更好的性能。表值参数具有以下优势:
表值参数有下面的限制:
就像其他参数一样,表值参数的作用域也是存储过程、函数或动态 Transact-SQL 文本。同样,表类型变量也与使用 DECLARE 语句创建的其他任何局部变量一样具有作用域。可以在动态 Transact-SQL 语句内声明表值变量,并且可以将这些变量作为表值参数传递到存储过程和函数。
表值参数的权限使用下列 Transact-SQL 关键字来遵循 SQL Server 的对象安全模式:CREATE、GRANT、DENY、ALTER、CONTROL、TAKE OWNERSHIP、REFERENCES、EXECUTE、VIEW DEFINITION 和 REVOKE。
若要获取与表值参数关联的信息,可以查询下列目录视图:sys.parameters (Transact-SQL)、sys.types (Transact-SQL) 和 sys.table_types (Transact-SQL)。
表值参数的使用方法与其他基于数据集的变量的使用方法相似;但是,频繁使用表值参数将比大型数据集要快。大容量操作的启动开销比表值参数大,与之相比,表值参数在插入数目少于 1000 的行时具有很好的执行性能。
重用的表值参数可从临时表缓存中受益。这一表缓存功能可比对等的 BULK INSERT 操作提供更好的伸缩性。使用小型行插入操作时,可以通过使用参数列表或批量语句(而不是 BULK INSERT 操作或表值参数)来获得小的性能改进。但是,这些方法在编程上不太方便,并且随着行的增加,性能会迅速下降。
表值参数在执行性能上与对等的参数阵列实现相当甚至更好。
下表说明根据插入操作的速度应使用哪种技术。
数据源 | 服务器逻辑 | 行数 | 最佳技术 |
---|---|---|---|
服务器上带格式的数据文件 |
直接插入 |
< 1000 |
BULK INSERT |
服务器上带格式的数据文件 |
直接插入 |
> 1000 |
BULK INSERT |
服务器上带格式的数据文件 |
复杂 |
< 1000 |
表值参数 |
服务器上带格式的数据文件 |
复杂 |
> 1000 |
BULK INSERT |
远程客户端进程 |
直接插入 |
< 1000 |
表值参数 |
远程客户端进程 |
直接插入 |
> 1000 |
BULK INSERT |
远程客户端进程 |
复杂 |
< 1000 |
表值参数 |
远程客户端进程 |
复杂 |
> 1000 |
表值参数 |
下面的示例使用 Transact-SQL 并演示如何执行以下操作:创建表值参数类型,声明变量来引用它,填充参数列表,然后将值传递到存储过程。
USE AdventureWorks;
GO
/*创建表值参数类型 */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO
/* 创建一个过程来获得该表值参数数据 */
CREATE PROCEDURE usp_InsertProductionLocation
@TVP LocationTableType READONLY
AS
SET NOCOUNT ON
INSERT INTO [AdventureWorks].[Production].[Location]
([Name]
,[CostRate]
,[Availability]
,[ModifiedDate])
SELECT *, 0, GETDATE()
FROM @TVP;
GO
/*声明一个变量来引用该类型*/
DECLARE @LocationTVP
AS LocationTableType;
/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
SELECT [Name], 0.00
FROM
[AdventureWorks].[Person].[StateProvince];
/* 把表变量的数据传递给存储过程 */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
|
标签:
原文地址:http://www.cnblogs.com/TF12138/p/4179946.html