在SQL Server 2008中的SP上使用表类型值参数

日期: 2009-06-23 作者:Eric Johnson翻译:曾少宁 来源:TechTarget中国 英文

自从SQL Server 2000发布之后,我们就有了可以自由支配的表数据类型。但是,主要问题是它无法作为一个参数在存储过程上传入或传出。对此,微软已经听取了数据库管理员和开发员的心声并作出了回应。微软将在2008年Q2末发布的SQL Server 2008具备了完全实现将各种不同表数据类型作为参数传递的能力。

新存储过程的功能,即表类型值参数,可以通过额外的SQL Server调用来节省循环浪费,同时可以减少由于对数据库执行额外的写入来节省总开销。   在本文中,我们将探讨如何输入表类型值参数应用到存储过程中,但是,首先我们必须明确地知道表数据类型是什么以及它是如何工作的。   事实上,表数据……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

自从SQL Server 2000发布之后,我们就有了可以自由支配的表数据类型。但是,主要问题是它无法作为一个参数在存储过程上传入或传出。对此,微软已经听取了数据库管理员和开发员的心声并作出了回应。微软将在2008年Q2末发布的SQL Server 2008具备了完全实现将各种不同表数据类型作为参数传递的能力。新存储过程的功能,即表类型值参数,可以通过额外的SQL Server调用来节省循环浪费,同时可以减少由于对数据库执行额外的写入来节省总开销。

  在本文中,我们将探讨如何输入表类型值参数应用到存储过程中,但是,首先我们必须明确地知道表数据类型是什么以及它是如何工作的。

  事实上,表数据类型使我们可以在代码中创建表变量。同时,它还允许我们在方法中返回表格式的数据,而不需要在方法的最后执行SELECT操作。或许,你会这样认为,“不错啊,只是,我们不是已经有临时表可以实现相同的功能了吗?”答案既不是肯定的也不是否定的。虽然表变量和临时表是类似的,它们两者都允许我们创建一个临时表结构来存储信息,但是,有几个关键的不同点决定我们使用哪个选项。

  临时表vs.表变量

  物理上,临时表存储在磁盘上的tempdb中,而表变量则一部分存储在内存,一部分存储在磁盘上。这个不同点对我们的代码意味着些许不同。因为表变量至少有一部分在内存,它们比临时表运行快速。然而,临时表是在磁盘上的并且看起来就像一个真实的表;因此,我们可以在上面创建索引,这是一个在表变量上无法实现的(除了主键)。

  此外,我们可以创建全局临时表,它们可以在其它的进程中访问,这是另外一个在表变量上无法实现的功能。使用哪一个是由我们的具体情况决定的。因此,表变量是不可以替代临时表的。它们各自都有不同的意图和用途。在探讨了表变量的适用范围之后,让我们来看看SQL Server 2008上可以在全球中提高复杂代码的运行效率的新功能——表类型值参数。

  通过表类型值参数,表面上普通的存储过程会显示出它们超凡的功能。现在,它们可以接收作为一个参数的变量形式的表,这可能是一个前所未有的功能。那么,这对我们又意味着什么呢?对于这个问题的回答,让我们回顾一个常见的定单处理数据库例子。这个数据库包含3个我们很关心的表:定单、定单明细以及客户。

  当一个应用写入到数据库时,需要插入多少次记录才能保存一个完整的定单呢?临时表是3个,每个表对应1个。但是,真实的回答是至少2个并且实际上没有限制最大值。试想,我们只有在客户不存在的前提下为客户添加一个记录,为定单加一个记录以及至少一个定单明细记录。定单明细是真正棘手的问题。可能每个预定的项都要有一个记录,那么,如果客户定了50个项目,那么将会有50个记录。

  使用存储过程来处理这种事,通常需要3个程序:一个是添加或者更新客户,一个是添加定单而另一个是添加定单明细。下面显示的是这些程序(下面的程序并不包含所有我们想看到的参数。只是为了说明问题)。

  这3个过程将允许我们插入所有关于客户、定单和定单明细。在此,我们可以使用表类型值参数来提高程序的效率并最小化到数据库的访问次数。在这种情况下,一个有9个条目的定单会需要11个存储过程调用,并且这很可能意味着代码需要对SQL Server进行11次独立的访问。如果我们使用表类型值参数,那么这个数目会减少为2个。是的,只需要2次SQL Server调用,我们就可以添加所有定单信息。让我们来看看下面用来替代的存储过程sp_add_order and sp_add_order_detail。

  这个选项看起来相当的清晰,不是吗?我们直接从@order and @order_detail参数的查询中插入一条记录到Order和OrderDetail表上。

  我们还必须解决最后一个问题。注意,在最后一个存储过程中,@order和@order_datail的参数是OrderType and OrderDetailType数据类型。它是如何转换成表数据类型的呢?这两个类型是由用户定义的,并且在我们创建过程之前已经设置好了。我们所需要做的就是使用下面的CREATE TYPE语法。

  正如我们所看到的,这里创建了2个用户定义的类型,它们是作为表数据类型的。现在,我们可以在我们的UDT中输入这些参数,同时将表变量作为参数来传递。这在存储过程和用户定义方法中都是适用的。

  有时,我们会需要传递大量参数——特别是这些参数是直接与一个物理表相关的——你会发现表类型值参数是最佳的选择。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐

  • SQL Server 2008将退出微软主流数据库支持

    你的企业是否还在运行SQL Server 2008?请注意微软为SQL Server 2008提供的主流技术支持服务将于今年的7月8日正式结束。

  • SQL Server 自动化管理分区设计方案

    设计自动化的目的是想要交替、重复地使用固定的几个分区来保存数据,当最后一个分区快满的时候,我们会把旧数据分区的数据清空,新数据就可以使用老分区空间了。

  • 数据库临时表有舍才有得

    临时表是系统采取某些作业时所需要用到的一些临时数据。根据其存储的形态不同,可以分为磁盘临时表和内存临时表。

  • SQL Server 2008中的对称密钥加密

    证书和非对称密钥使用数据库级的内部公钥加密数据,并且使用数据库级内部私钥解密数据。而对称密钥相对简单,它们包含一个同时用来加密和解密的密钥。