【发布时间】:2009-05-08 18:48:44
【问题描述】:
我正在尝试找出将大量参数传递到存储过程的最佳方法。
我正在考虑的一些方法是;
创建相关的数据库对象,包括每个项目的参数对象并调用命令对象
传入一个 XML 文档并让存储过程将其解包。 (该应用程序已经将它们采用 XML 格式)
如果有人有更好的想法,我很乐意听取他们的意见
谢谢。
【问题讨论】:
标签: xml sql-server-2005 ado.net parameters
我正在尝试找出将大量参数传递到存储过程的最佳方法。
我正在考虑的一些方法是;
创建相关的数据库对象,包括每个项目的参数对象并调用命令对象
传入一个 XML 文档并让存储过程将其解包。 (该应用程序已经将它们采用 XML 格式)
如果有人有更好的想法,我很乐意听取他们的意见
谢谢。
【问题讨论】:
标签: xml sql-server-2005 ado.net parameters
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。打开它以提取您需要的值并对其进行操作很容易。
【讨论】:
如果您可以升级到 SQL Server 2008,则有一个名为 Table-Valued Parameter 的新功能正是用于此目的。请参阅Books Online 部分了解它。
它基本上允许您创建一个表值用户定义类型,然后可以将其用作任何存储过程的只读输入参数。
在 .NET 中,您可以简单地使用 DataTable 实例并在该数据表中传递任意数量的行。
马克
【讨论】:
好的,这可能会被否决,但是......只是不要传递这么多参数。不要试图找到一种方法来做一些在语言中固有的困难的事情,也许要意识到这是语言告诉你需要重新设计你正在做的事情的方式。就像许多昆虫用颜色来表示“不吃”一样,当你发现自己在做一些需要很多圈子才能完成的基本事情时,也许你需要重新考虑自己在做什么。
特别是,我认为您可能应该尝试弄清楚为什么存储过程需要这么多参数;你能把它分解成一组更小、更简单的存储过程吗?也许如果你让他们通过临时表进行通信,你可以获得相同的效果,但更少...... ick。
【讨论】:
您认为有多少参数是“大数”?另外,为什么存储过程有这么多参数?听起来测试会很有趣。
调用存储过程的代码将如何得出它需要传入参数的数据?如果数据已经在 XML 中可用,那么 XML 可能是传递它们的好方法。如果数据已经在单独的变量中可用,那么参数对象可能会更好。
另请注意,在 SQL Server 2008 中,您可以选择将 DataTable 作为 TABLE 类型的参数值发送。
编辑:设置参数的简单方法
虽然我认为 DataSets 被过度使用和滥用,但下面是一个过程,它将设置存储过程参数对象,并使调用具有许多参数的存储过程变得更加容易:
这将创建一个带有方法的 TableAdapter 来调用您的存储过程。该方法取决于基础结构已经创建的 SqlParameter 对象。该方法会将传入的SP参数作为方法调用的参数,并会使用调用参数填写SP参数。这一切都是为您完成的,并且以相当有效的方式完成。
【讨论】:
SQL Server Magazine 2009 年 2 月刊有一篇关于使用数组的优秀文章(更多选项将数组作为输入处理)。本文介绍了使用 CLR 拆分 UDF。这适用于 SQL 2005,因为它具有 CLR 集成。我在这里发布和解释的代码太多了,但是如果您可以访问该杂志的网站,我建议您下载他们的功能来执行此操作。它快速而优雅。
【讨论】: