小编典典

SQL Server性能ResultSet vs输出参数vs返回值

sql

我正在权衡使用从存储过程向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

阅读 21

收藏
2021-04-07

共1个答案

小编典典

返回标量值比结果集更有效,原因是结果集附带了更多的辅助方法,这使其负担沉重,从而增加了从sql到C#代码/例程的对象传输的延迟。

在您的方法3中:使用了一个变量来返回值,这比发送out参数要好,因为在这里,您减少了沿一条路径(即,在调用存储过程时)至少对一个对象的遍历。

结果集比输出参数更灵活,因为它可以返回多行(显然),因此,如果您需要结果集,那么它是唯一的选择。

要根据方法3,方法2,方法1的性能对查询进行排序。

希望这有助于理解概念。

2021-04-07