我有 2 張桌子:items和cost.
- 在表中
items,我有舊專案代碼和新專案代碼 - 在表中
cost,我有專案代碼和成本
我想根據舊專案代碼已經存在的成本在表成本中為新專案代碼創建新行。
例如:


我希望在cost表中運行游標后看到這個結果:

我嘗試運行它,但它一直在運行并且每行重復 100000 次:
DECLARE @item_code_old nvarchar (50)
DECLARE @item_code_new nvarchar (50)
DECLARE CostCURSOR CURSOR FOR
SELECT item_code_old, item_code_new
FROM item
WHERE company = 'AEW' AND item_code_new IS NOT NULL
OPEN CostCURSOR
FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @item_code_old = item_code_old
FROM cost
WHERE company = 'AEW' AND year = 2021
INSERT INTO cost
SELECT
company,
year,
month,
@item_code_new,
unit_cost
FROM
cost
WHERE
company = 'AEW' AND year = 2021
FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new
END
CLOSE CostCURSOR
DEALLOCATE CostCURSOR
我錯過了什么?
uj5u.com熱心網友回復:
你對變數所做的事情并沒有真正意義,你將下一個值提取到 中@item_code_old,但是在每個回圈開始時,你幾乎隨機地為其分配一個值:
SELECT @item_code_old = item_code_old
FROM cost
WHERE company = 'AEW'
AND year = 2021;
然后在插入新成本時,您根本不使用此變數:
INSERT INTO cost
SELECT company, year, month, @item_code_new, unit_cost
FROM cost
WHERE company = 'AEW'
AND year = 2021;
我猜您不需要重新分配的第一步@item_code_old,并且您確實需要將過濾器應用于插入查詢。
話雖如此,這里完全不需要游標(您會發現游標通常是這種情況),您可以使用單個插入來執行此操作,使用如下所示:
INSERT Cost (Company, Year, Month, item_code_old, unit_cost)
SELECT c.company, c.year, c.month, i.item_code_new, c.unit_cost
FROM cost AS c
INNER JOIN Item AS i
ON c.item_code_old = i.item_code_old
WHERE c.company = 'AEW'
AND c.year = 2021
AND i.item_code_new IS NOT NULL;
為了完整起見,您的游標解決方案如下所示,但我要強調這不是一個好方法。游標應該是最后的手段,并且可能是不值得練習的東西,因為它不是您會發現非常有用的東西。與其練習游標,不如練習嘗試找到基于集合的方法,這將顯著更好地利用您的時間。無論如何,咆哮:
DECLARE @item_code_old NVARCHAR(50);
DECLARE @item_code_new NVARCHAR(50);
DECLARE CostCURSOR CURSOR LOCAL FAST_FORWARD FOR
SELECT item_code_old, item_code_new
FROM item
WHERE company = 'AEW'
AND item_code_new IS NOT NULL;
OPEN CostCURSOR;
FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new;
WHILE(@@FETCH_STATUS = 0)
BEGIN
INSERT INTO cost (Company, Year, Month, Item_Code_Old, unit_cost)
SELECT company, year, month, @item_code_new, unit_cost
FROM cost
WHERE company = 'AEW'
AND year = 2021
AND item_code_old = @item_code_old;
FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new;
END;
CLOSE CostCURSOR;
DEALLOCATE CostCURSOR;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/387479.html
標籤:sql-server 查询语句 while 循环 光标
上一篇:Day481&482&483.尚硅谷之高頻重點面試題① -面經
下一篇:從另一個表搜索時替換列值
