从 T-SQL 存储过程检索到 C# DataTable 的数据存在偏差

问题描述 投票:0回答:1

当我从 T-SQL 存储过程检索数据到 C# DataTable 时,我确实遇到了一个奇怪的问题,我真的不明白。我在 T-SQL 中得到的结果与检索数据后 DataTable 显示的结果不同。不同的数据意味着数据表中的单元格要么缺少行,要么显示不同的数据。

这是我在 C# 中使用的代码

public DataTable  GetData()
{
    string nameOfSp = "sp_SIA_Get_Ratio_Demand_Receipt";

    DataAccess dataAccess = new DataAccess();

    DataTable dt = new DataTable();

    dataAccess.OpenDatabase(DataAccess.ConnectionTo.SQL);

    SqlConnection sqlCon = dataAccess.GetSqlConnection();

    try
    {
        SqlCommand cmd = new SqlCommand(nameOfSp, sqlCon);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = 1000;

        cmd.Parameters.Add("@COMPANY", SqlDbType.VarChar).Value = filter.CompanyNo;
        cmd.Parameters.Add("@YEARWEEK_FROM", SqlDbType.VarChar).Value = filter.YearWeekFrom;
        cmd.Parameters.Add("@YEARWEEK_TO", SqlDbType.VarChar).Value = filter.YearWeekTo;
        cmd.Parameters.Add("@USERNAME", SqlDbType.VarChar).Value = filter.UserName;

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not retrieve data from stored procedure " + ex.Message);
    }

    dataAccess.CloseDatabase();

    return dt;
}

这是 SQL 语句:

ALTER PROCEDURE [dbo].[sp_SIA_Get_Ratio_Demand_Receipt]
    @COMPANY as varchar(4),
    @USERNAME as varchar(50),
    @YEARWEEK_FROM as varchar(6),
    @YEARWEEK_TO as varchar(6)
AS
BEGIN
    SET NOCOUNT ON;

    WITH #MATERIAL (COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, INVENTORY_QTY, INVENTORY_VAL) AS 
    (
        SELECT 
            p.COMPANY_NO, p.ITEM_NO, p.STORAGE_LOCATION, 
            SUM(STOCK_QUANTITY), SUM(STOCK_VALUE)
        FROM  
            tbl_SIA_Sel_PartNos p 
        INNER JOIN 
            [FUM_DWH].[dbo].[View_SCM_FACT_610_WAREHOUSE_STOCK] s ON p.ITEM_NO = s.ITEM_NO
                                                                  AND p.COMPANY_NO = s.COMPANY_NO
                                                                  AND p.STORAGE_LOCATION = s.STORAGE_LOCATION
        WHERE 
            p.USERNAME = @USERNAME
            AND s.YEARWEEK =@YEARWEEK_TO
            AND p.ITEM_NO IN( '50048348') --p.ITEM_NO IN( '50057896','50048348','50293653','50059293')
        GROUP BY 
            p.COMPANY_NO, p.ITEM_NO, p.STORAGE_LOCATION
    )
        
    ,#DEMAND (COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, DEMAND_QTY) AS
    (
        SELECT  
            STRI_COMPANY_NO,
            STRI_ITEM_NO,
            STRI_STORAGE_LOCATION,
            SUM(STRI_QUANTITY * -1) AS DEMAND_QTY
        FROM 
            #MATERIAL m 
        INNER JOIN 
            [FUM_DWH].[dbo].[View_SCM_FACT_620_PAST_STOCK_RECEIPT_ISSUE] p ON m.MATERIAL_NO = p.STRI_ITEM_NO 
                                               AND p.STRI_STORAGE_LOCATION = m.STORAGE_LOCATION
        WHERE 
            STRI_COMPANY_NO = @COMPANY 
            AND CONCAT(STRI_YEAR, FORMAT( STRI_WEEK, '00')) BETWEEN @YEARWEEK_FROM AND @YEARWEEK_TO
            AND STRI_DEBIT_CREDIT = 'H' --nur Abgänge werten
        GROUP BY 
            STRI_ITEM_NO, STRI_COMPANY_NO, STRI_STORAGE_LOCATION
    )
    , #RECEIPT(COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, RECEIPT_QTY) AS
    (
        SELECT  
            STRI_COMPANY_NO,
            STRI_ITEM_NO,
            STRI_STORAGE_LOCATION,
            SUM(STRI_QUANTITY) AS RECEIPT_QTY
        FROM 
            [FUM_DWH].[dbo].[View_SCM_FACT_620_PAST_STOCK_RECEIPT_ISSUE] p 
        INNER JOIN 
            #MATERIAL m ON p.STRI_ITEM_NO = m.MATERIAL_NO 
                        AND p.STRI_STORAGE_LOCATION = m.STORAGE_LOCATION
        WHERE 
            STRI_COMPANY_NO = @COMPANY
            AND CONCAT(STRI_YEAR, FORMAT(STRI_WEEK, '00')) BETWEEN      @YEARWEEK_FROM AND @YEARWEEK_TO
            AND STRI_DEBIT_CREDIT = 'S' --nur Zugänge werten 
        GROUP BY 
            STRI_ITEM_NO, STRI_COMPANY_NO,STRI_STORAGE_LOCATION
    )
    ,#DEMAND_FUT (MATERIAL_NO, STORAGE_LOCATION, DEMAND_QTY, DEMAND_VAL) AS 
    (
        SELECT 
            [ITEM_NO], s.STORAGE_LOCATION,
            SUM([QUANTITY]) * -1 AS DEMAND_QTY,
            SUM([VALUE]) * -1 AS DEMAND_VAL
        FROM 
            [FUM_DWH].[dbo].[View_SCM_FACT_630_FUTURE_STOCK_RECEIPT_ISSUE] s 
        INNER JOIN 
            #MATERIAL m ON m.MATERIAL_NO = s.ITEM_NO 
                        AND m.STORAGE_LOCATION = s.STORAGE_LOCATION 
        WHERE 
            s.COMPANY_NO = @COMPANY
            AND TRANSACTION_DATE BETWEEN GETDATE() AND DATEADD(day, 31, GETDATE())
        GROUP BY 
            ITEM_NO, s.STORAGE_LOCATION
    )
    SELECT  
        m.MATERIAL_NO, 
        ISNULL(SUM(d.DEMAND_QTY), 1) AS PST_DEMAND_QTY, 
        ISNULL(SUM(r.RECEIPT_QTY), 1) AS PST_RECEIPT_QTY, 
        ISNULL(SUM(r.RECEIPT_QTY), 1) / ISNULL(SUM(d.DEMAND_QTY), 1) AS RATIO,
        SUM(m.INVENTORY_QTY) AS INVENTORY_QTY, 
        SUM(m.INVENTORY_VAL) AS INVENTORY_VAL, 
        ISNULL(SUM(f.DEMAND_QTY), 0) AS FUT_DEMAND_QTY, 
        ISNULL(SUM(f.DEMAND_VAL), 0) AS FUT_DEMAND_VAL,
        ISNULL(SUM(m.INVENTORY_QTY) - SUM(f.DEMAND_QTY), 0) AS  RMN_INVENTORY_QTY, 
        ISNULL(SUM(m.INVENTORY_VAL) - SUM(f.DEMAND_VAL), 0) AS RMN_INVENTORY_VAL
    FROM 
        #MATERIAL m 
    LEFT JOIN 
        #DEMAND d ON m.MATERIAL_NO = d.MATERIAL_NO 
                  AND m.STORAGE_LOCATION = d.STORAGE_LOCATION
    LEFT JOIN 
        #RECEIPT r ON m.MATERIAL_NO = r.MATERIAL_NO 
                   AND m.STORAGE_LOCATION = r.STORAGE_LOCATION
    LEFT JOIN 
        #DEMAND_FUT f ON m.MATERIAL_NO = f.MATERIAL_NO 
                      AND m.STORAGE_LOCATION = f.STORAGE_LOCATION
    GROUP BY 
        m.MATERIAL_NO 
    ORDER BY 
        m.MATERIAL_NO -- ISNULL(SUM(r.RECEIPT_QTY), 1) / ISNULL(SUM(d.DEMAND_QTY), 1) DESC
END

我从SQL语句得到的结果:

enter image description here

我从DataTable得到的结果:

enter image description here

我将 C# 中的代码从异步改回,因为我认为这会导致问题。

c# t-sql stored-procedures datatable
1个回答
0
投票

您正在调用一个名为 sp_SIA_Get_Ratio_Demand_Receipt 的存储过程,但您只向我们展示了一条 SQL SELECT 语句。我们需要查看存储过程的其余部分。可能是 WHERE 子句导致了差异。

要查看发送到 SQL Server 的内容,您可以使用 SQL Server Profiler 等探查器。

© www.soinside.com 2019 - 2024. All rights reserved.