BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

SQL Server中的表值型参数

| 作者 Al Tenhundfeld 关注 0 他的粉丝 ,译者 张海龙 关注 0 他的粉丝 发布于 2008年9月3日. 估计阅读时间: 4 分钟 | AICon 关注机器学习、计算机视觉、NLP、自动驾驶等20+AI热点技术和最新落地成功案例。
表值型参数(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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT