我有一个while循环,似乎在减慢我的代码的速度。当我运行提供的代码时,很长时间不打印任何内容,然后以非常快的速度运行了大约30倍,然后又停止运行。
如果我没有运行查询就很快,而如果我尝试运行迭代,查询就会发生上述情况。
--LOOP
DECLARE @i int = 1
While @i <= 5
--(SELECT COUNT(*)
-- FROM Pedido)
BEGIN
SELECT 1
--DECLARE @i int = 1
--Temporary table with stock number
IF object_id ('tempdb..#ESTOQUE_UPDATE') is not null DROP TABLE #ESTOQUE_UPDATE
SELECT DISTINCT
P.Item
,(Qtd_Estoques - Qtd_Pedida) AS Qtd_Estoques
INTO
#ESTOQUE_UPDATE
FROM #PEDIDO_RN W
INNER JOIN Pedido P
ON W.Pedido = P.Pedido
INNER JOIN Estoque E
ON P.Item = E.Item
where
W.Id = 1
SET @i = @i+1
END
编辑1 我将添加整个代码以显示为什么使用循环
--SELECT *
-- FROM Pedido P
-- INNER JOIN Estoque E
-- ON P.Item = E.Item
-- ORDER BY P.Prioridade_Calc ASC
DROP TABLE Pedidos_completos
CREATE TABLE Pedidos_completos
(
Pedido VarChar(MAX)
)
-- Bota em ordem os pedidos e coloca na table temporária #PEDIDO_RN
IF object_id ('tempdb..#PEDIDO_RN') is not null DROP TABLE #PEDIDO_RN
SELECT
ROW_NUMBER() OVER (ORDER BY P.Prioridade_Calc) AS Id
,P.Prioridade_Calc
,P.Pedido
INTO #PEDIDO_RN
FROM
Pedido P
GROUP BY P.Prioridade_Calc , P.Pedido
ORDER BY P.Prioridade_Calc
SELECT * FROM #PEDIDO_RN
ORDER BY Id
--LOOP
DECLARE @i int = 1
While @i <= SELECT COUNT(*)
FROM Pedido
BEGIN
--Tabela temporaria com o novo número de estoque
IF object_id ('tempdb..#ESTOQUE_UPDATE') is not null DROP TABLE #ESTOQUE_UPDATE
SELECT DISTINCT
P.Item
,(Qtd_Estoques - Qtd_Pedida) AS Qtd_Estoques
INTO
#ESTOQUE_UPDATE
FROM #PEDIDO_RN W
INNER JOIN Pedido P
ON W.Pedido = P.Pedido
INNER JOIN Estoque E
ON P.Item = E.Item
where
W.Id = @i
SELECT * FROM #ESTOQUE_UPDATE
--Verifica se não existem negativos
DECLARE @flag int
SET @flag = CASE
WHEN (SELECT MIN (E.Qtd_Estoques)
FROM #ESTOQUE_UPDATE E) < 0
THEN 0
ELSE 1
END
--Atualiza a tablea de estoque
IF @flag = 1
BEGIN
UPDATE E
SET
E.Qtd_Estoques = U.Qtd_Estoques
FROM Estoque E
INNER JOIN #ESTOQUE_UPDATE U
ON E.Item = U.Item
END
--Adiciona pedidos dem pedidos completos
IF @flag = 1
BEGIN
INSERT INTO Pedidos_completos
SELECT
Pedido
FROM #PEDIDO_RN
WHERE Id = @i
END
SET @i = @i+1
END
SELECT * FROM Pedidos_completos
SELECT * FROM #ESTOQUE_UPDATE
SELECT * FROM Estoque
在表格结构下方
CREATE TABLE Pedido
(
Pedido VarChar(MAX)
,Produto VarChar(MAX)
,Item VarChar(MAX)
,Prioridade_Calc VarChar(MAX)
,Valor_Total_Pedido VarChar(MAX)
,Qtd_Pedida VarChar(MAX)
,Aglutinacao_Calc VarChar(MAX)
,Valor_Minimo VarChar(MAX)
)
ALTER TABLE Pedido
ALTER COLUMN Valor_Total_Pedido float
ALTER TABLE Pedido
ALTER COLUMN Valor_Minimo float
ALTER TABLE Pedido
ALTER COLUMN Qtd_Pedida int
ALTER TABLE Pedido
ALTER COLUMN Prioridade_Calc int
CREATE TABLE Estoque
(
Item VarChar(MAX)
,Qtd_Estoques VarChar(MAX)
)
ALTER TABLE Estoque
ALTER COLUMN Qtd_Estoques int