C# SQL While循环还是c linq foreach?
我有一个用SQL编写的信用卡支付过程存储过程。这是在使用SQL的同时循环50万条付款记录。这太慢了,因为我必须为每个付款记录循环另一组数据,并相应地更新一组表。这意味着sql中的while循环中包含while循环 为了提高性能,我必须用c语言重新编写。我们正在使用LINQ和实体框架。有人能告诉我这是否有用吗 谢谢 使用修改后的存储过程更新我的问题。我已经替换了对我的表的引用,并删除了部分代码。但如果不清楚,请告诉我C# SQL While循环还是c linq foreach?,c#,sql-server,linq,C#,Sql Server,Linq,我有一个用SQL编写的信用卡支付过程存储过程。这是在使用SQL的同时循环50万条付款记录。这太慢了,因为我必须为每个付款记录循环另一组数据,并相应地更新一组表。这意味着sql中的while循环中包含while循环 为了提高性能,我必须用c语言重新编写。我们正在使用LINQ和实体框架。有人能告诉我这是否有用吗 谢谢 使用修改后的存储过程更新我的问题。我已经替换了对我的表的引用,并删除了部分代码。但如果不清楚,请告诉我 CREATE PROCEDURE [dbo].[USP_ProcessPayme
CREATE PROCEDURE [dbo].[USP_ProcessPayments]
(
@UserKey int
)
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #TempUserPayments
(
-- with Columns declared
)
INSERT INTO #TempUserPayments
SELECT DISTINCT up.*, ROW_NUMBER() OVER(ORDER BY up.UserKey DESC, up.DateReceived) AS RN --generate row number
FROM UserPayment up
where up.UserKey = @UserKey
CREATE INDEX UP_1 on #TempUserPayments (RN);
DECLARE @LOOPCOUNTER INT, @ROWCOUNTER INT, @REQUESTEDAMOUNT MONEY, @UPDATEDREQUESTEDAMOUNT MONEY, @AMOUNT MONEY,
@AMOUNTNOTAPPLIED MONEY, @APPLIEDAMOUNT MONEY, @SYSTEMKEY INT, @LOOPCOUNTER_PR INT, @ROWCOUNTER_PR INT, @IS_UPDATE BIT
SELECT @ROWCOUNTER = COUNT(*) from #TempUserPayments;
SET @LOOPCOUNTER = 1
WHILE (@LOOPCOUNTER <= @ROWCOUNTER)
BEGIN
SELECT *,
ROW_NUMBER() OVER (ORDER BY mp.Month DESC, mp.PayPriority) AS RN_PR
INTO #TempPR
FROM Requests pr
INNER JOIN Premium mp ON mp.PremiumKey = pr.PremiumKey
--Joing couple of other tables here
ORDER BY mp.[Month] DESC, mp.PayPriority
CREATE INDEX PR_1 on #TempPR (RN_PR);
SELECT @SYSTEMKEY = SystemKey FROM #TempUserPayments WHERE RN = @LOOPCOUNTER;
SELECT @ROWCOUNTER_PR = COUNT(*) from #TempPR;
SET @LOOPCOUNTER_PR = 1
WHILE (@LOOPCOUNTER_PR <= @ROWCOUNTER_PR)
BEGIN
SET @IS_UPDATE = 0;
IF(@APPLIEDAMOUNT IS NULL OR (@REQUESTEDAMOUNT <> @APPLIEDAMOUNT AND @APPLIEDAMOUNT < @REQUESTEDAMOUNT))
BEGIN
IF(@SYSTEMKEY = 1 OR @SYSTEMKEY = 3)
BEGIN
--Check all the conditions here
SET @IS_UPDATE = 1;
END
IF(@IS_UPDATE = 1)
BEGIN
--Update bunch of requets tables ---
INSERT INTO userpaid
(
--Column names --
)
VALUES
(
--Values --
)
END
END
-- END
SET @LOOPCOUNTER_PR = @LOOPCOUNTER_PR + 1;
END
SET @LOOPCOUNTER = @LOOPCOUNTER + 1;
DROP TABLE #TempPR;
END
DROP TABLE #TempUserPayments;
结束只是一个观点:对linq做同样的事情可能是最糟糕的,因为它至少增加了网络I/O。相反,我会在这里发布该过程,并询问如何通过折磨行来删除RBAR方法行。值得怀疑的是,您所做的只是添加IO时间以从数据库获取数据,然后更新数据。您确定没有基于集合的方法来处理数据吗?如果你能想出一种不在sqlI中循环的方法,那么处理速度会更快。我必须对多个请求应用这些支付。您必须不断更新这些付款中未应用的金额,并查看是否还有剩余金额和剩余请求等…这似乎是一个连续的总数。哪个SQL Server版本?只是一个观点:对linq做同样的事情可能是最糟糕的,因为它至少增加了网络I/O。相反,我会在这里发布该过程,并询问如何通过折磨行来删除RBAR方法行。值得怀疑的是,您所做的只是添加IO时间以从数据库获取数据,然后更新数据。您确定没有基于集合的方法来处理数据吗?如果你能想出一种不在sqlI中循环的方法,那么处理速度会更快。我必须对多个请求应用这些支付。您必须不断更新这些付款中未应用的金额,并查看是否还有剩余金额和剩余请求等…这似乎是一个连续的总数。哪个SQL Server版本?