我使用存储过程已经超过 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/