SQLServer2008表变量参数(表值参数)⽤法
表值参数是 SQL Server 2008 中的新参数类型。表值参数是使⽤⽤户定义的表类型来声明的。使⽤表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多⾏数据。
表值参数与 OLE DB 和 ODBC 中的参数数组类似,但具有更⾼的灵活性,且与 Transact-SQL 的集成更紧密。表值参数的另⼀个优势是能够参与基于数据集的操作。
(注意:Transact-SQL 通过引⽤向例程传递表值参数,以避免创建输⼊数据的副本。)
在 Transact-SQL 中创建和使⽤表值参数
表值参数具有两个主要部分:SQL Server 类型以及引⽤该类型的参数。若要创建和使⽤表值参数,请执⾏以下步骤:
1. 创建表类型并定义表结构。
有关如何创建 SQL Server 类型的信息,请参阅⽤户定义表类型。有关如何定义表结构的详细信息,请参阅 CREATE TABLE
(Transact-SQL)。
2. 声明具有表类型参数的例程。有关 SQL Server 例程的详细信息,请参阅 CREATE PROCEDURE (Transact-SQL) 和 CREATE
FUNCTION (Transact-SQL)。
3. 声明表类型变量,并引⽤该表类型。有关如何声明变量的信息,请参阅 DECLARE @local_variable (Transact-SQL)。
4. 使⽤ INSERT 语句填充表变量。有关如何插⼊数据的详细信息,请参阅使⽤ INSERT 和 SELECT 添加⾏。
5. 创建并填充表变量后,可以将该变量传递给例程。
例程超出作⽤域后,表值参数将不再可⽤。类型定义则会⼀直保留,直到被删除。
若要在 SQL Server Native Client 中使⽤表值参数,请参阅Table-Valued Parameters (SQL Server Native Client)。
若要在 ADO.NET 中使⽤表值参数,请参阅 ADO.NET ⽂档。
优点
表值参数具有更⾼的灵活性,在某些情况下,可⽐临时表或其他传递参数列表的⽅法提供更好的性能。表值参数具有以下优势:
⾸次从客户端填充数据时,不获取锁。
提供简单的编程模型。
允许在单个例程中包括复杂的业务逻辑。
减少到服务器的往返。
可以具有不同基数的表结构。
是强类型。
使客户端可以指定排序顺序和唯⼀键。
限制
表值参数有下⾯的限制:
SQL Server 不维护表值参数列的统计信息。
表值参数必须作为输⼊ READONLY 参数传递到 Transact-SQL 例程。不能在例程体中对表值参数执⾏诸如 UPDATE、DELETE 或INSERT 这样的 DML 操作。
不能将表值参数⽤作 SELECT INTO 或 INSERT EXEC 语句的⽬标。表值参数可以在 SELECT INTO 的 FROM ⼦句中,也可以在INSERT EXEC 字符串或存储过程中。
作⽤域
就像其他参数⼀样,表值参数的作⽤域也是存储过程、函数或动态 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)、pes (Transact-SQL) 和 sys.table_types (Transact-SQL)。
表值参数与 BULK INSERT 操作
表值参数的使⽤⽅法与其他基于数据集的变量的使⽤⽅法相似;但是,频繁使⽤表值参数将⽐⼤型数据集要快。⼤容量操作的启动开销⽐表值参数⼤,与之相⽐,表值参数在插⼊数⽬少于 1000 的⾏时具有很好的执⾏性能。
重⽤的表值参数可从临时表缓存中受益。这⼀表缓存功能可⽐对等的 BULK INSERT 操作提供更好的伸缩性。使⽤⼩型⾏插⼊操作时,可以通过使⽤参数列表或批量语句(⽽不是 BULK INSERT 操作或表值参数)来获得⼩的性能改进。但是,这些⽅法在编程上不太⽅便,并且随着⾏的增加,性能会迅速下降。
表值参数在执⾏性能上与对等的参数阵列实现相当甚⾄更好。
下表说明根据插⼊操作的速度应使⽤哪种技术。
数据源服务器逻辑⾏数最佳技术
服务器上带格式的数据⽂件直接插⼊< 1000BULK INSERT
服务器上带格式的数据⽂件直接插⼊> 1000BULK INSERT
服务器上带格式的数据⽂件复杂< 1000表值参数
服务器上带格式的数据⽂件复杂> 1000BULK INSERT
远程客户端进程直接插⼊< 1000表值参数
远程客户端进程直接插⼊> 1000BULK 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]
sql sever 2008([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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。