我正在权衡使用三种不同方法之一将存储过程中的单个标量值返回到C#例程的潜在性能影响。谁能告诉我哪些是“更快”,最重要的是,为什么?
方法1:
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
方法2:
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
方法3:
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
答案 0 :(得分:3)
返回标量值比结果集更有效,原因是结果集携带了更多的辅助方法,这使得它很重,从而增加了从sql到C#代码/例程的对象传输的延迟。 / p>
在你的方法3中:你使用了一个变量来返回值,这比发送一个out参数更好,因为在这里你要在一个路径中至少遍历一个对象的遍历(即,在调用存储过程时) 。
结果集比输出参数更灵活,因为它可以返回多行(显然),所以如果你需要一个结果集,那么无论如何它都是唯一的选择。
根据方法3,方法2方法1的性能对查询进行排序。
希望这有助于理解这个概念。