我正在权衡使用三种不同方法之一将单个标量值从存储过程返回到我的 C# 例程的潜在性能影响。谁能告诉我这些中哪个“更快”,最重要的是,为什么?
方法一:
CREATE PROCEDURE GetClientId
@DealerCode varchar(10)
AS
BEGIN
SET NOCOUNT ON
SELECT ClientId
FROM Client
WHERE ClientCode = @DealerCode
END
-- this returns null if nothing is found,
-- otherwise it returns ClientId in a ResultSet
方法二:
CREATE PROCEDURE GetClientId
@DealerCode varchar(10),
@ClientValue int out
AS
BEGIN
SET NOCOUNT ON
set @ClientValue = -1
set @ClientValue = (SELECT ClientId
FROM Client
WHERE ClientCode = @DealerCode)
END
-- this returns -1 for ClientValue if nothing is found,
-- otherwise it returns ClientId
-- the value for ClientValue is a scalar value and not a ResultSet
方法三:
CREATE PROCEDURE GetClientId
@DealerCode varchar(10)
AS
BEGIN
SET NOCOUNT ON
declare @ClientValue int
set @ClientValue =
(SELECT ClientId FROM Client WHERE ClientCode = @DealerCode)
if @ClientValue is null or @ClientValue = 0
return -1
else
return @ClientValue
END
-- this uses the return value of the stored procedure;
-- -1 indicates nothing found
-- any positive, non-zero value is the actual ClientId that was located
最佳答案
返回标量值比结果集更有效,原因是结果集带有更多的辅助方法,这使得它很重,从而增加了对象从 sql 到 C# 代码/例程的传输延迟。
在您的方法 3 中:您使用了一个变量来返回值,这比发送一个 out 参数更好,因为在这里您至少在一条 route 减少了对象的遍历(即,在调用存储过程时)。
结果集比输出参数更灵活,因为它可以返回多行(显然),因此如果您需要结果集,那么无论如何它都是唯一的选择。
按照方法 3、方法 2 和方法 1 根据性能对查询进行排序。
希望这有助于理解这个概念。
关于SQL Server 性能结果集与输出参数与返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17841281/