2013-07-24 70 views
5

我正在权衡使用三种不同方法之一将存储过程中的单个标量值返回到C#例程中的潜在性能影响。谁能告诉我哪些是“更快”,最重要的是,为什么?SQL Server性能结果集vs输出参数与返回值

方法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 

回答

2

返回标量值大于一个结果集更有效,其原因是结果集随着它携带更多的辅助方法,这使得它很重,从而增加了obj传输的等待时间从sql到C#代码/例程。

在你的方法3中:你已经使用了一个变量来返回值,这比发送一个out参数更好,因为在这里你减少了一个对象的遍历在一个路由中(即,当调用存储过程)。

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

要根据业绩是去与方法3,方法2方法1.

希望这是理解概念有帮助订购查询。

+1

另一个精度。使用方法3(RETURN),您仅限于INTEGER类型。如果你想返回另一种数据类型,你应该使用方法2或方法1. –

+0

我感谢所有的帮助。我个人倾向于#2。但是,由于我在#2和#3中都返回了一个INTEGER,所以我可以看到#3的表现最佳。如果我不得不返回某种类型的字符串,我会使用#2。当然,如前所述,只有在需要结果集的情况下,我才会使用#1。 –