【发布时间】:2010-10-05 11:23:49
【问题描述】:
如何将数据集对象传递给存储过程?数据集包含多个表,我需要能够从 SQL 中访问它们。
【问题讨论】:
标签: asp.net sql sql-server-2005 tsql stored-procedures
如何将数据集对象传递给存储过程?数据集包含多个表,我需要能够从 SQL 中访问它们。
【问题讨论】:
标签: asp.net sql sql-server-2005 tsql stored-procedures
您可以使用表值参数在 SQL 2008 http://msdn.microsoft.com/en-us/library/bb675163.aspx 中传递单个表
或
参考这篇文章并使用SQL CLR过程传递数据集http://blogs.msdn.com/b/jpapiez/archive/2005/09/26/474059.aspx
【讨论】:
看起来您可以使用 SQL Server 2008 或更高版本(至少使用 DataTable)执行此操作。以下是链接:
http://www.eggheadcafe.com/community/aspnet/10/10138579/passing-dataset-to-stored-procedure.aspx
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
【讨论】:
WriteXml 方法)然后将 XML 作为字符串参数传递来解决此问题。这意味着您必须在存储过程中进行 XML 处理。
正如MusiGenesis 回答中的article 所述
在 SQL Server 2005 及更早版本中,它是 无法传递表变量 作为存储过程的参数。 当多行数据到 SQL 服务器需要发送多行 数据到 SQL Server,开发人员要么 必须一次发送一排或来 与其他解决方法一起满足 要求。虽然是 VB.Net 开发人员 最近通知我有一个 .Net 中可用的 SQLBulkCopy 对象 向 SQL 发送多行数据 服务器一下子,数据还是不行 传递给存储过程。
这里有两种方法很明显
参数化您的处理过程
您可能会重新评估您是否真的需要传递一个通用表变量。虽然有时这是无法避免的,但这是 MS SQL Server 所具有的一组功能的后期添加的部分原因是因为通常您可以通过构建存储过程和数据处理流程来绕过它。
如果您能够“参数化”您的流程,那么您应该能够让存储过程根据有限数量的参数检索完整的数据集。
这会降低过程的灵活性,但也会使其更受控制,这不是一件坏事(类似于仅在存储过程级别与应用程序接口的数据库更健壮,这种方法也是,通过限制灵活性减少了可能的情况的数量,从而减少了可能未处理的情况的数量。阅读:安全漏洞和一般错误)
临时表
除了上述之外,还有一些使用临时表的方法,它可能或多或少复杂,具体取决于您对数据所需的共享范围(共享可以在数据库用户、应用程序用户、连接、进程等之间进行。 .).
很好的副作用是这种方法将允许进程持久化(这使您更接近于撤消、重做和继续中断工作的能力)。
【讨论】: