Xml 在SQL Server中传递大量参数的最佳方法是什么
我试图找出将大量参数传递到存储过程中的最佳方法 我想到的一些方法是:Xml 在SQL Server中传递大量参数的最佳方法是什么,xml,sql-server-2005,ado.net,parameters,Xml,Sql Server 2005,Ado.net,Parameters,我试图找出将大量参数传递到存储过程中的最佳方法 我想到的一些方法是: 创建相关的数据库对象,包括每个项的参数对象,并调用命令对象 传入一个XML文档,并让存储过程将其解压缩。(应用程序将以XML格式显示它们) 如果有人有更好的想法,我愿意听 谢谢。XML处理对于处理大量参数非常方便。您可以轻松地以XML形式传入参数,然后通过XML处理来获取值。如果你的数据已经是.Net,那就更好了 e、 g DECLARE@WidgetsIds xml 设置为@WidgetsIds='3615' 挑选 Para
谢谢。XML处理对于处理大量参数非常方便。您可以轻松地以XML形式传入参数,然后通过XML处理来获取值。如果你的数据已经是.Net,那就更好了 e、 g
DECLARE@WidgetsIds xml
设置为@WidgetsIds='3615'
挑选
ParamValues.ID.value('.','VARCHAR(20'))
从@Widgets.nodes('/Widgets/id')作为参数值(id)
这将返回3行:3、6、15。很容易打开它来提取所需的值并对其进行操作你认为“大数”有多少个参数?另外,为什么存储过程有这么多参数?听起来测试会很有趣 调用存储过程的代码将如何提供它需要在参数中传递的数据?如果数据已经是XML格式的,那么XML可能是传递数据的好方法。如果数据已经在单独的变量中可用,那么参数对象可能更好 还请注意,对于SQL Server 2008,您可以选择将DataTable作为表类型的参数值发送
编辑:设置参数的简便方法 虽然我认为数据集被过度使用和滥用,但以下是一个过程,它将设置存储过程参数对象,并使调用具有多个参数的存储过程变得更加容易:
这将创建一个TableAdapter,其中包含一个调用存储过程的方法。该方法取决于基础结构已经创建的SqlParameter对象。该方法将把传入的SP参数作为方法调用的参数,并将使用调用参数填充SP参数。这一切都是为您而做的,而且是以一种合理高效的方式完成的。如果您可以升级到SQL Server 2008,则有一种新功能称为表值参数,正是为了实现这一目的。请参阅相关章节 它基本上允许您创建一个表值用户定义类型,然后可以将其用作任何存储过程的只读输入参数 从.NET中,您可以简单地使用一个
DataTable
实例,并在该数据表中传递任意数量的行
马克好吧,这可能会被否决,但是。。。只是不要传递那么多参数。与其试图找到一种方法来做一些语言中固有的困难的事情,不如意识到这是语言告诉你需要重新设计你正在做的事情的方式。就像许多昆虫用颜色来表示“不要吃”,当你发现自己在做一些基本的事情,需要很多圈圈才能完成时,也许你需要重新思考自己在做什么
特别是,我认为您可能应该尝试弄清楚为什么存储过程需要这么多参数;您能将其分解为一组更小、更简单的存储过程吗?也许如果你让他们通过临时表交流,你可以得到同样的效果,但是用更少的时间。。。ick.SQL Server杂志2009年2月号有一篇关于使用数组的优秀文章(更多将数组作为输入处理的选项)。本文介绍如何使用CLR分割UDF。这适用于SQL 2005,因为它具有CLR集成。我在这里发布和解释的代码太多了,但是如果你可以访问该杂志的网站,我建议下载他们的功能。它快速而优雅。一个大数字的例子是20到30。在很大程度上,存储过程是在插入/更新数据之前执行一些验证/转换。我没有提到的另一点是,这是针对SQL Server的,但可能会转移到Oracle 11g,但这是一个未来的问题,如果它发生的话,我会考虑。我不知道,可能只有我一个人,但我不认为20到30是如此之大,以至于您应该寻找非标准的传递方法。除非参数的数量是可变的,否则简单的答案是遗留代码,它是一个正在修改的现有应用程序。我们正在更改数据访问层,但由于时间紧迫,在一段时间内还无法对其进行适当重构。@GrumpyMonkey:只是20或30个参数并不是一个很大的数字。坚持使用常规技术。遗憾的是,我们必须在SQL Server 2005上执行此操作。那么,您肯定应该看看u07ch的XML“技巧”——这可能是您在2005年的最佳选择。为此,我想问的一些问题是:;如何提取多个字段,例如ProductID、ProductName、SkwnNumber和handle不同的类型。实际上没有足够的空间,因此此示例可能是移动链接的更好方法-
DECLARE @WidgetsIds xml
SET @WidgetsIds ='<Widgets><id>3</id><id>6</id><id>15</id></Widgets >'
SELECT
ParamValues.ID.value('.','VARCHAR(20)')
FROM @Widgets.nodes('/widgets/id') as ParamValues(ID)