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

Sha*_*pta 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

CREATE PROCEDURE sp_testcall
AS
BEGIN
 @temp = exec sp_test -- I think this would be the way, never tried
END
Run Code Online (Sandbox Code Playgroud)

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

CREATE PROCEDURE sp_test
AS
BEGIN
 SELECT * INTO #tmp FROM tblTest --Considering table has 3 columns.
END
Run Code Online (Sandbox Code Playgroud)

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

我的问题可能不太清楚.但我会尽力改进.

Rem*_*anu 7

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

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

至于你提出的其他问题:

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

Erland Sommarskog详细分析了程序之间共享数据的主题,请参阅如何在存储过程之间共享数据.