我使用存储过程超过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的另一项工作。 但幕后会发生什么?它会直接将结果的引用分配给表值参数,还是使用与临时表相同的过程?
我的问题可能不太清楚。但我会努力改进。
答案 0 :(得分:7)
对于初级到中级,您应该始终考虑#temp表和@table变量同一枚硬币的两个面。虽然它们之间存在一些差异,但出于所有实际目的,它们的成本相同且行为几乎完全相同。唯一的主要区别是@table变量不会被处理,因此不会受到回滚的影响。
如果深入研究细节,#temp表的处理成本稍高(因为它们是交易的),但另一方面,@ table变量只有变量范围的生命周期。
关于你提出的其他问题:
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可用的临时表中,将数据插入传递给过程的表值参数中,或重写存储过程作为返回表的函数。
然而,对我来说,你所询问的内容并不是很清楚。