Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在SQL Server中传递大量参数的最佳方法是什么_Xml_Sql Server 2005_Ado.net_Parameters - Fatal编程技术网

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处理对于处理大量参数非常方便。您可以轻松地以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)