c# - Sql Server和.Net是如何处理一个存储过程的

标签 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。

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

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

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

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

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

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

最佳答案

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

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

关于您的问题提出的其他问题:

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

Erland Sommarskog 详分割析了过程间共享数据的话题,参见 How to Share Data Between Stored Procedures .

关于c# - Sql Server和.Net是如何处理一个存储过程的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484672/

相关文章:

c# - 用于检查修改状态的数据类型或数据结构?

c# - 尝试将重复对象插入集合时,抛出的正确 .NET 异常是什么?

SQL - 控制在连接中返回哪些列

MySQL通过需要递增数字的列连接两个表

mysql - 通过从另一个数据库获取值来更新行

php - 数据库将无法连接

c# - Observable.ObserveOn() 似乎没有效果

c# - 查找具有特定类型的属性并将其返回

mysql - 根据其他两列之间的较大值选择列

java - 使用 SQLite 填充饼图