以Microsoft SQL Server 2008丁,你可以实现将表格变量传递至囤过程遭到,尽管变量能够让声称,那么她就是得为传送。下边我们来具体介绍怎么样拿表格变量(包括内含的数据)传递到囤过程和力量中失。 

 

传送表值参数 用户时时会师遇上许多索要拿数值容器而非单个数值放到存储过程里的状。对于大部分之编程语言而言,把容器数据结构传递及例程里仍然传递出去是坏广泛而非凡必要的功力。TSQL也非异。SQL Server 2000经OPENXML可以兑现此职能,用户可以管数量存储吗VARCHAR数据类型然后开展传递。到了SQL Server 2005,随着 XML数据类型以及XQuery的起,这一个效果转移得易一点。但用户仍需要针对XML数据开展组装及粉碎才会运用它,因而这一个效用使用起来并无略。SQL Server 2008即使会管表值数据类型传递及囤过程以及职能中,从而大大地简化了编程的劳作,因为程序员无需另行消费情绪去组建和解析XML数据了。该效能还足以让客户方开发员传递客户方数据表格到数据库中。 

怎么着传递表格参数? 以销售呢例,首先创建一个 my SalesHistory表格,里面含有了产品销售的信息。写以下脚本就可以数据库里制造而选用的报表:

 

IF OBJECT_ID(‘SalesHistory‘)>0 

DROP TABLE SalesHistory; 

GO 

CREATE TABLE [dbo].[SalesHistory] (

[SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 

[Product] [varchar](10) NULL, 

[SaleDate] [datetime] NULL, 

[SalePrice] [money] NULL ) 

GO

确立表值参数第一步是成立确切的表类型,那等同步非常重大,因为这么你不怕得以数据库发动机里定义表格的协会,让你可当用之时节以经过代码里下该表。下边的代码创设 SalesHistoryTableType 表格类型定义: 

 

CREATE TYPE SalesHistoryTableType AS TABLE (

[Product] [varchar](10) NULL, 

[SaleDate] [datetime] NULL, 

[SalePrice] [money] NULL ) 

GO

万一想只要查系统里其他连串的表类型定义,你可以实施下这查询命令,查看系统目录: SELECT * FROM sys.table_types大家要定义用来拍卖表值参数的蕴藏过程。下边这么些序会承受指定SalesHistoryTableType类型的表值参数,并加载到SalesHistory中,表值参数在Product列中之价值吗“BigScreen”:

 

CREATE PROCEDURE usp_InsertBigScreenProducts ( 

@TableVariable SalesHistoryTableType READONLY ) 

AS 

BEGIN 

INSERT INTO SalesHistory ( Product, SaleDate, SalePrice ) 

SELECT Product, SaleDate, SalePrice 

FROM @TableVariable WHERE Product = ‘BigScreen‘ 

END 

GO

 

传递的表变量还好据此做其余其他表格的查询数据。 传递表值参数功用的受制性 在传递表值变量到程序中时必动 READONLY从句。表格变量里的多寡不可能开修改——除了修改你得拿数据用于其他其他的操作。另外,你啊非可以管表格变量用做OUTPUT参数——只可以用做input参数。 使用自己之初表格变量类型 首先,要阐明一个变量类型SalesHistoryTableType,不需再同软定义表格结构,因为当开创是表格类型的上曾定义了了。 以下是代码有:

 

DECLARE @DataTable AS SalesHistoryTableType

–The following script adds 1,000 records into my @DataTable table variable:

DECLARE @i SMALLINT

SET @i = 1

WHILE (@i <=1000)

BEGIN

INSERT INTO @DataTable(Product,SaleDate,SalePrice)

VALUES(‘Computer’,DATEADD(mm,@i,’3/11/1919′),DATEPART(ms,GETDATE()) + (@i + 57))

INSERT INTO @DataTable(Product, SaleDate, SalePrice)

VALUES(‘BigScreen’, DATEADD(mm, @i, ‘3/11/1927’), DATEPART(ms, GETDATE()) + (@i + 13))

INSERT INTO @DataTable(Product, SaleDate, SalePrice)

VALUES(‘PoolTable’, DATEADD(mm, @i, ‘3/11/1908’), DATEPART(ms, GETDATE()) + (@i + 29))

SET @i = @i + 1

END

 

只要把数量加载到表格变量里,就可管结构传递及囤过程遭到。 注意:当表格变量作为参数传递后,表格会在囤于tempdb系统数据库里,而不是传递整个数据集在内存里。因为如此保证高速处理大批量数码。所有服务器方的表格变量参数传递都是因而动reference调用tempdb中的表。 EXECUTE usp_InsertBigScreenProducts @TableVariable = @DataTable想要是查询程序是否与预期效果一样,可以执行以下查询来拘禁记录是否都插入到 SalesHistory表格中: SELECT * FROM SalesHistory结论: 虽然SQL Server 2008数据库的参数传递效能的以还有局部局限性,比如不可知修改参数中之多少与将变量用于output,但其既死特别程度之滋长了先后性能,它可以缩短server往返旅程数、利用表格限制并扩充编程在数据库招擎中的效益。

相关文章

网站地图xml地图