如何从我的存储过程中只获取一组数据?

时间:2010-10-12 02:28:32

标签: c# sql sql-server-2000

我正在使用SQL Server 2000.
我的SP产生了以下输出:

alt text

汇总所有Taxable Earnings(最高结果)并将其减去Deductible Expenses(中间结果)的总和,以获得员工的Net Taxable Income

我如何才能获得净应税收入的价值?

这是我的SP

/*
DECLARE @NET_TAXABLE_INCOME AS NUMERIC(19, 2)
EXEC NET_TAXABLE_INCOME '000001', '10/15/2010', @NET_TAXABLE_INCOME OUTPUT
SELECT @NET_TAXABLE_INCOME
*/
CREATE   PROC [dbo].NET_TAXABLE_INCOME
(
    @EMPLOYEENO AS VARCHAR(10),
    @PAYROLLPERIOD_INPUT AS DATETIME,
    @NET_TAXABLE_INCOME AS NUMERIC(19, 2) = NULL OUTPUT
)   
AS
BEGIN
    DECLARE @TAXABALEEARNINGS AS NUMERIC(18, 2)
    EXEC TAXABLE_EARNINGS_BREAKDOWN @EMPLOYEENO, @PAYROLLPERIOD_INPUT, @TAXABALEEARNINGS OUTPUT
    DECLARE @DEDUCTIBLEEXPENSES AS NUMERIC(18, 2)
    EXEC DEDUCTIBLE_EXPENSES_BREAKDOWN @EMPLOYEENO, @PAYROLLPERIOD_INPUT, @DEDUCTIBLEEXPENSES OUTPUT

    SET @NET_TAXABLE_INCOME = @TAXABALEEARNINGS - @DEDUCTIBLEEXPENSES   
    SELECT @NET_TAXABLE_INCOME AS [NET_TAXABLE_INCOME]
END

是否存在导致不打印EXEC的结果的SQL语句?

2 个答案:

答案 0 :(得分:2)

在C#方面,你可以这样做:

SqlDataReader sqlReader = sqlCmd.ExecuteReader();
sqlReader.NextResult(); // Skip first result set.
sqlReader.NextResult(); // Skip second result set.
while (sqlReader.Read())
{
    var netTaxableIncome = sqlReader.GetValue(0);
}

答案 1 :(得分:0)

您可以将执行的存储过程的结果改为临时表。

CREATE TABLE #Tmp (etc etc)

INSERT #Tmp
EXEC DEDUCTIBLE_EXPENSES_BREAKDOWN @EMPLOYEENO, @PAYROLLPERIOD_INPUT, @DEDUCTIBLEEXPENSES OUTPUT

但您也可以将它与EXEC命令结合使用,这就是捕获存储过程输出的答案。您需要做的就是创建一个表,通过INSERT语句接收存储过程的输出:

关键是创建表(在此示例中为临时表),以便它具有正确数量的列和兼容的数据类型来捕获存储过程的输出。

注意:语法是伪造的语法,但我希望你明白这个想法!

这样,您就可以放弃这些结果 - 这就是您的意图,而不会影响您的调用存储过程的输出!!

但是,如果这些存储过程在您的控制之下,您应该考虑是否确实要重用它们/更改然后只返回输出参数而不是结果集。您无需返回您不会使用的数据,至少在这种情况下