设为首页 收藏本站
查看: 779|回复: 0

[经验分享] SQL Server 2008中的表值型参数

[复制链接]

尚未签到

发表于 2016-11-4 03:44:12 | 显示全部楼层 |阅读模式
  SQL Server 2008中的表值型参数

作者:Al Tenhundfeld 译者 张海龙 

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


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

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



用户自定义表类型的使用有许多限制:
一个用户自定义表类型不允许用来定义表的列类型,也不能用来定义一个用户自定义结构类型的字段。
不允许在一个用户自定义表类型上创建一个非聚合索引,除非这个索引是基于此用户自定义表类型创建的主键或唯一约束。
在用户自定义表类型的定义中,不能指定缺省值。
一旦创建后,就不允许再对用户自定义表类型的定义进行修改。
用户自定义函数不能以用户定义表类型中的计算列定义为参数来调用。
一个用户自定义表类型不允许作为表值型参数来调用用户自定义函数。

当用户自定义表类型作为表值型参数时,还有更多限制,例如,在参数化语句或存储过程中,它们是只读的:

不允许更新多行表值型参数中的列值,也不允许插入或删除行。如果想要修改那些已经传入到存储过程或参数化语句中的表值型参数中的数据,只能通过向临时表或表变量中插入数据来实现。

在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对象将多行数据载入一个表中,尽管这一技术效率很高,但它并不支持在服务端执行,除非数据是被载入到临时表或是表变量中。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295307-1-1.html 上篇帖子: JSP, J2SDK, Tomcat, 连接SQL Server 2000 全套系统配置 下篇帖子: SQL Server数据库简体繁体数据混用的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表