Sql server ms sql server存储过程中哪种类型的“选择”将以c代码返回到数据集?

Sql server ms sql server存储过程中哪种类型的“选择”将以c代码返回到数据集?,sql-server,Sql Server,例如: 以下是存储过程: IF EXISTS ( SELECT 'x' FROM billable_acct_payout (NOLOCK) WHERE i_billable_acct_id = @i_billable_acct_id ) BEGIN SELECT 'PayoutInfo' as 'TableName' ,ba.i_billable_acct_id as 'BillableAcctI

例如: 以下是存储过程:

IF EXISTS (
    SELECT 'x' 
    FROM billable_acct_payout (NOLOCK) 
    WHERE i_billable_acct_id = @i_billable_acct_id
)
    BEGIN
        SELECT 'PayoutInfo'          as 'TableName'
            ,ba.i_billable_acct_id   as 'BillableAcctId' 
...
如上所述,当我调用此存储过程并接收以c代码返回的数据时,如下所示:

DataSet ds = new Dataset();
DataAdapter da...
da.Fill(ds);
现在我知道“IF EXISTS”中的第一个“select”不会返回到我的数据集,但第二个“select”会返回


问题是,如何知道存储中的“选择”过程是否将返回到数据集?

最简单的方法是在Management Studio中执行存储过程,并查看返回的内容

根据经验,以下可能不完整的选择列表不会向C返回任何内容:

IF EXISTS (SELECT ...)

SELECT TOP 1 @variable = Field FROM ...

SET @variable = (SELECT TOP 1 Field FROM ...)

INSERT INTO ... SELECT ...

... WHERE Field IN (SELECT ...)

... WHERE Field = (SELECT TOP 1 ...)

DECLARE ... CURSOR FOR SELECT ...

可以说,每个SELECT(其结果不被周围语句使用)或存储过程本身都会返回给调用者。

如果您获得了数据,则存储过程会将数据返回到数据集

但一般来说,您应该考虑更改这种存储过程。我刚刚在mssql 2000上做了性能测试,我认为大多数结果仍然有效


例如,让存储过程将其结果写入表并查询这些结果表要快得多。我建议您,更改存储过程,添加一个唯一键作为参数,并使用这些参数在结果表中查找结果。

请注意,如果存储过程返回多个结果集,则只有第一个结果集可以在C中使用。-事实并非如此。请看Marsmae,只有第一个可以通过适配器自动填充数据集,但是通常可以使用C中的多个结果集。请参阅MARS:文档中说,在以前的版本中,针对单个连接一次只能执行一个批处理。。因此,我认为这只有在.NET 4.5?@Damien_不信者的情况下才可能实现。我的印象是,NextResult只返回结果集的下一行,而不是一组结果集中的另一个结果集。我想知道,当我观看存储过程本身时,哪些结果将立即返回。我想一定有一些规则。。