WEB开发网
开发学院数据库MSSQL Server SQL Server 2008的Transact-SQL语言增强 阅读

SQL Server 2008的Transact-SQL语言增强

 2010-06-16 15:44:49 来源:WEB开发网   
核心提示:8.表值参数数据库引擎引入了可以引用用户定义表类型的新参数类型,表值参数可以将多个数据行发送到 SQL Server 语句或例程(比如存储过程或函数),SQL Server 2008的Transact-SQL语言增强(8),而不用创建临时表,表值参数具有更高的灵活性,USE AdventureWorks;GO/* 创建

8.表值参数

数据库引擎引入了可以引用用户定义表类型的新参数类型。表值参数可以将多个数据行发送到 SQL Server 语句或例程(比如存储过程或函数),而不用创建临时表。表值参数具有更高的灵活性,在某些情况下,可比临时表或其他传递参数列表的方法提供更好的性能。表值参数具有以下优势:

首次从客户端填充数据时,不获取锁。

提供简单的编程模型。

允许在单个例程中包括复杂的业务逻辑。

减少到服务器的往返。

可以具有不同基数的表结构。

是强类型。

使客户端可以指定排序顺序和唯一键。

与其他参数一样,表值参数的作用域也是存储过程、函数或动态 Transact-SQL 文本。同样,表类型变量也与使用 DECLARE 语句创建的其他任何局部变量一样具有作用域。

与BULK INSERT操作相比,频繁使用表值参数将比大型数据集要快。大容量操作的启动开销比表值参数大,与之相比,表值参数在插入数目少于 1000 的行时具有很好的执行性能。

下面是SQL Server帮助中的示例,演示了如何执行以下操作:创建表值参数类型,声明变量来引用它,填充参数列表,然后将值传递到存储过程。

USE AdventureWorks;
GO

/* 创建一个table类型 */
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;

/* 添加数据到表值变量 */
INSERT INTO @LocationTVP (LocationName, CostRate)
  SELECT [Name], 0.00
  FROM
  [AdventureWorks].[Person].[StateProvince];

/* 传递表值变量数据给存储过程 */
EXEC usp_InsertProductionLocation @LocationTVP;
GO

9.Transact-SQL 行构造函数

增强后的 Transact-SQL 可以允许将多个值插入单个 INSERT 语句中,语法比较简单。参考下面的代码:
/* 创建一个表 */
CREATE TABLE dbo.T1(
CustName char(20) ,
ProductID int ,
MadeFrom char(20) ,
Sales numeric(20, 2)
)

/* 插入2行数据 */
INSERT INTO dbo.T1
VALUES ('Jane',1,'China',20.00),
    ('Jack',2,'USA',10.00)

上一页  3 4 5 6 7 8 

Tags:SQL Server Transact

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接