当我从 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语句得到的结果:
我从DataTable得到的结果:
我将 C# 中的代码从异步改回,因为我认为这会导致问题。
您正在调用一个名为 sp_SIA_Get_Ratio_Demand_Receipt 的存储过程,但您只向我们展示了一条 SQL SELECT 语句。我们需要查看存储过程的其余部分。可能是 WHERE 子句导致了差异。
要查看发送到 SQL Server 的内容,您可以使用 SQL Server Profiler 等探查器。