InfoQ

新闻

SQL Server中的表值型参数

作者 Al Tenhundfeld译者 张海龙 发布于 2008年9月2日 下午8时21分

社区
.NET
主题
.NET框架,
SQL Server
标签
SQL Server 2008,
ADO.NET
表值型参数(Table-valued parameters)是SQL Server 2008中引入的一种新特性,它提供了一种内置的方式,让客户端应用可以只通过单独的一条参化数SQL语句,就可以向SQL Server发送多行数据。

这一功能的基础是SQL Server 2008中最新的用户自定义表类型(User-Defined Table Types),它允许用户将表的定义注册为全局周知类型。注册之后,这些表类型可以像本地变量一样用于批处理中、以及存储过程的函数体中,很像早期SQL Server版本中通用表变量的强类型化版本。但是,与通用表变量有所不同的是,用户自定义表类型的变量可以作为参数在存储过程和参数化TSQL中使用。

User-defined table type example

用户自定义表类型的使用有许多限制:

  • 一个用户自定义表类型不允许用来定义表的列类型,也不能用来定义一个用户自定义结构类型的字段。
  • 不允许在一个用户自定义表类型上创建一个非聚合索引,除非这个索引是基于此用户自定义表类型创建的主键或唯一约束。
  • 在用户自定义表类型的定义中,不能指定缺省值。
  • 一旦创建后,就不允许再对用户自定义表类型的定义进行修改。
  • 用户自定义函数不能以用户定义表类型中的计算列定义为参数来调用。
  • 一个用户自定义表类型不允许作为表值型参数来调用用户自定义函数。
当用户自定义表类型作为表值型参数时,还有更多限制,例如,在参数化语句或存储过程中,它们是只读的:
不允许更新多行表值型参数中的列值,也不允许插入或删除行。如果想要修改那些已经传入到存储过程或参数化语句中的表值型参数中的数据,只能通过向临时表或表变量中插入数据来实现。
在ADO.NET中,可以利用标准的SqlParameter类型来使用用户自定义表类型:
  • TypeName参数必须设置为用户自定义表类型的名称,例如:dbo.PersonInfo
  • SqlDbType必须设置为SqldbType.Structured
  • Value参数的类型数据必须与用户自定义表类型中的类型相匹配。System.Data.SqlClient中可以通过System.Data.DataTable或IList来支持表值型参数。此外,还可以通过System.Data.Common.DbDataReader及其派生类(如OracleDataReader)将多行数据转为流,然后映射到表值型参数。
在表值型参数出现以前,开发者只能使用一些替代方案来模拟它的能力:
  • 使用一连串的独立参数来表示多列和多行数据的值。使用这一方法,可以被传递的数据总量受限于可用参数的个数。SQL Server的存储过程最多可以使用2100个参数。在这种方法中,服务端逻辑必须将这些独立的值组合到表变量中,或是临时表中进行处理。
  • 将多个数据值捆绑到带限定符的字符串或是XML文档中,然后再将文本值传递到一个存储过程或语句中。这种方式要求存储过程或语句中要有必要的数据结构验证和数据松绑的逻辑。
  • 为多行数据的修改创建一系列独立的SQL语句,就像在一个SqlDataAdapter中调用Update方法时产生的那些一样,这些更新可以被独立地或是分组成批地提交到服务器。不过,尽管成批提交中含有多重语句,但这些语句在服务端都是被分开独立执行的。
  • 使用bcp实用程序或是使用SqlBulkCopy对象将多行数据载入一个表中,尽管这一技术效率很高,但它并不支持在服务端执行,除非数据是被载入到临时表或是表变量中。
查看英文原文Table-Valued Parameters in SQL Server

没有回复

回复

独家内容

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。

揭示常见的重构误区

相对于Java,.NET在持续重构方面所给与的重视仍然少为人知,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Danijel Arsenovski试图为你揭示这些谜题。