如何通过Sql Server和.Net处理存储过程

时间:2010-08-14 18:51:09

标签: c# sql database stored-procedures temp-tables

我使用存储过程超过1。5年。但我从未考虑过如何从UI或其他存储过程中检索数据。

当我编写一个简单的存储过程时。 例如

CREATE PROCEDURE sp_test
AS
BEGIN
 SELECT * FROM tblTest --Considering table has 3 columns.
END

C#如何将此结果导入DataTable。

每当我必须在另一个过程中使用此过程的结果时,我认为我们必须使用table数据类型创建一个表值参数,并将其结果分配给表变量。我从未尝试过。

CREATE PROCEDURE sp_testcall
AS
BEGIN
 @temp = exec sp_test -- I think this would be the way, never tried
END

如果上面的示例代码为true,那么使用上述方法和查询将记录插入临时表有什么区别?

CREATE PROCEDURE sp_test
AS
BEGIN
 SELECT * INTO #tmp FROM tblTest --Considering table has 3 columns.
END

似乎将结果复制到临时表中需要sql server的另一项工作。 但幕后会发生什么?它会直接将结果的引用分配给表值参数,还是使用与临时表相同的过程?

我的问题可能不太清楚。但我会努力改进。

2 个答案:

答案 0 :(得分:7)

对于初级到中级,您应该始终考虑#temp表和@table变量同一枚硬币的两个面。虽然它们之间存在一些差异,但出于所有实际目的,它们的成本相同且行为几乎完全相同。唯一的主要区别是@table变量不会被处理,因此不会受到回滚的影响。

如果深入研究细节,#temp表的处理成本稍高(因为它们是交易的),但另一方面,@ table变量只有变量范围的生命周期。

关于你提出的其他问题:

  • 表值参数始终是只读的,您无法修改它们(插入/更新/删除它们)
  • 将过程的结果集添加到表中(真实表,#temp表或@tabel变量,无关紧要)只能使用INSERT INTO <table> EXEC sp_test
  • 来完成
  • 根据经验,产生另一个程序所需结果的程序可能更好地作为用户定义函数

Erland Sommarskog详细分析了程序间数据共享的主题,见How to Share Data Between Stored Procedures

答案 1 :(得分:2)

select表示“将数据返回给客户”。 C#是一个客户端,因此它获取数据 再说一遍,它不是C#,它是ADO.NET。有一个数据提供程序知道如何使用网络/内存/其他协议与SQL服务器通信并读取它生成的数据流。这个特定的客户端(ADO.NET)使用接收到的数据构建某些类,例如DataTable,其他提供者可以做一些完全不同的事情。
所有这些都与SQL Server级别无关,因为就服务器而言,数据已经使用建立连接的协议发送出去,就是这样。

从内部来看,让存储过程简单地将select数据返回到其他任何内容都没有多大意义。
当您需要这样做时,您可以明确地告诉SQL Server您想要什么,例如将数据插入到两个相关SP可用的临时表中,将数据插入传递给过程的表值参数中,或重写存储过程作为返回表的函数。

然而,对我来说,你所询问的内容并不是很清楚。