【问题标题】:What is the best method in passing a large number of parameters in SQL Server在 SQL Server 中传递大量参数的最佳方法是什么
【发布时间】:2009-05-08 18:48:44
【问题描述】:

我正在尝试找出将大量参数传递到存储过程的最佳方法。

我正在考虑的一些方法是;

  1. 创建相关的数据库对象,包括每个项目的参数对象并调用命令对象

  2. 传入一个 XML 文档并让存储过程将其解包。 (该应用程序已经将它们采用 XML 格式)

如果有人有更好的想法,我很乐意听取他们的意见

谢谢。

【问题讨论】:

    标签: xml sql-server-2005 ado.net parameters


    【解决方案1】:

    XML 处理对于处理大量 数量的参数非常方便。您可以轻松地在 XML 中传递参数,然后进行 xml 处理以获取您的值。如果您的数据已经是 .Net,那就更好了。

    例如

    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) 
    

    这应该返回 3 行:3、6、15。打开它以提取您需要的值并对其进行操作很容易。

    【讨论】:

    • 谢谢你,我想问的一些问题是;您如何提取几个字段,例如 ProductID、ProductName、SKWNumber 并处理不同的类型。
    • 没有足够的空间,所以这个例子可能更好raihaniqbal.org/blog/…
    • 链接似乎已移动 - raihaniqbal.net/blog/2009/04/…
    【解决方案2】:

    如果您可以升级到 SQL Server 2008,则有一个名为 Table-Valued Parameter 的新功能正是用于此目的。请参阅Books Online 部分了解它。

    它基本上允许您创建一个表值用户定义类型,然后可以将其用作任何存储过程的只读输入参数。

    在 .NET 中,您可以简单地使用 DataTable 实例并在该数据表中传递任意数量的行。

    马克

    【讨论】:

    • 遗憾的是,我们必须在 SQL Server 2005 上执行此操作。
    • 好吧,那么您绝对应该看看 u07ch 的 XML“技巧”——这可能是您在 2005 年的最佳选择。
    【解决方案3】:

    好的,这可能会被否决,但是......只是不要传递这么多参数。不要试图找到一种方法来做一些在语言中固有的困难的事情,也许要意识到这是语言告诉你需要重新设计你正在做的事情的方式。就像许多昆虫用颜色来表示“不吃”一样,当你发现自己在做一些需要很多圈子才能完成的基本事情时,也许你需要重新考虑自己在做什么。

    特别是,我认为您可能应该尝试弄清楚为什么存储过程需要这么多参数;你能把它分解成一组更小、更简单的存储过程吗?也许如果你让他们通过临时表进行通信,你可以获得相同的效果,但更少...... ick。

    【讨论】:

      【解决方案4】:

      您认为有多少参数是“大数”?另外,为什么存储过程有这么多参数?听起来测试会很有趣。

      调用存储过程的代码将如何得出它需要传入参数的数据?如果数据已经在 XML 中可用,那么 XML 可能是传递它们的好方法。如果数据已经在单独的变量中可用,那么参数对象可能会更好。

      另请注意,在 SQL Server 2008 中,您可以选择将 DataTable 作为 TABLE 类型的参数值发送。


      编辑:设置参数的简单方法

      虽然我认为 DataSets 被过度使用和滥用,但下面是一个过程,它将设置存储过程参数对象,并使调用具有许多参数的存储过程变得更加容易:

      1. 使用“添加新项”并选择 DataSet 创建一个新的 DataSet。随意命名 DataSet。
      2. 如果您尚未查看服务器资源管理器,请查看它
      3. 添加到您的数据库的连接(如果它还没有)
      4. 扩展连接,直到找到您的存储过程
      5. 将存储过程拖到设计图面上

      这将创建一个带有方法的 TableAdapter 来调用您的存储过程。该方法取决于基础结构已经创建的 SqlParameter 对象。该方法会将传入的SP参数作为方法调用的参数,并会使用调用参数填写SP参数。这一切都是为您完成的,并且以相当有效的方式完成。

      【讨论】:

      • 一个大数字的例子是 20 到 30。在很大程度上,存储过程是在插入/更新数据之前执行一些验证/转换。我没有提到的另一点是,这现在适用于 SQL Server,但可能会转移到 Oracle 11g,但这是未来的担忧,如果它发生,我会看看。
      • 我不知道,可能只有我一个人,但我不认为 20 到 30 大到你应该寻找非标准的传递方法。除非参数的数量是可变的或什么的。
      • 简单的答案是遗留代码,它是一个正在修改的现有应用程序。我们正在更改数据访问层,但由于时间紧迫,它在一段时间内无法正确重构。
      • @GrumpyMonkey:只是 20 或 30 个参数并不是一个很大的数字。坚持常规技术。
      【解决方案5】:

      SQL Server Magazine 2009 年 2 月刊有一篇关于使用数组的优秀文章(更多选项将数组作为输入处理)。本文介绍了使用 CLR 拆分 UDF。这适用于 SQL 2005,因为它具有 CLR 集成。我在这里发布和解释的代码太多了,但是如果您可以访问该杂志的网站,我建议您下载他们的功能来执行此操作。它快速而优雅。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-12
        • 2013-12-29
        • 2015-07-05
        • 1970-01-01
        相关资源
        最近更新 更多