私は毎回テーブルを落として再作成するコードを持っています。そしてカーソルを使って、実行中の総在庫量を計算します。カーソルのコードは、(テーブル名が隠さ)以下の通りです:実行中の合計を計算するには、このカーソルを書き換えることができますか?
DECLARE @Cust_Name nvarchar(250),
@Cust_Postcode nvarchar(50),
@MatchCode_Product nvarchar(50),
[email protected] int,
@DateKey nvarchar(8),
@Ordered int
DECLARE StockCursor CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT
Cust_Name, Cust_Postcode, MatchCode_Product, DateKey
FROM
WRK_TFT_DEPOT_STOCK
WHERE
Cust_Name NOT LIKE {redacted}
OPEN StockCursor
FETCH NEXT FROM StockCursor INTO @Cust_Name, @Cust_Postcode, @MatchCode_Product, @DateKey
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE
WRK_TFT_DEPOT_STOCK
SET
Ordered = isnull((
SELECT
sum(cast(MO.Quantity as int))
FROM
{redacted }DE
INNER JOIN {redacted} MO
ON DE.Order_No = MO.Order_No
WHERE
DE.Cust_Name = @Cust_Name
AND
DE.Cust_Postcode = @Cust_Postcode
AND
MatchCode_Product = @MatchCode_Product
AND
CAST(Year(DE.Delivery_Date) AS VARCHAR) + RIGHT('0' + CAST(Month(DE.Delivery_Date) AS VARCHAR), 2) +
RIGHT('0' + CAST(Day(DE.Delivery_Date) AS VARCHAR), 2) <= @DateKey
AND DE.Cust_Name NOT LIKE {redacted}
),0)
WHERE
Cust_Name = @Cust_Name
AND
Cust_Postcode = @Cust_Postcode
AND
MatchCode_Product = @MatchCode_Product
AND
DateKey = @DateKey
FETCH NEXT FROM StockCursor INTO @Cust_Name, @Cust_Postcode, @MatchCode_Product, @DateKey
END
CLOSE StockCursor
DEALLOCATE StockCursor
UPDATE
WRK_TFT_DEPOT_STOCK
SET
Stock = StartStock + Ordered
コードが正常に動作しますが、それとの私の問題は、それが実行に年齢を取ることであり、それを実行するのにかかる時間として時間の経過とともに増加しています私は日々のデータをソーステーブルにロードしています。
誰かがこれをより効率的に書き直してくれますか?その周りを見てから、窓関数が多く役立つように見えますが、私はそれらに精通していません。
「証券」は実行中の合計である列は、「StartStockは」「順序」初期量とある
は、我々はそれがに来るときに追加するために必要なものである
? –
再帰的CTEは、カーソルの最良の代替手段です。https://stackoverflow.com/questions/6824669/why-is-cte-better-than-cursor-derived-table-subqueries-temp-table-etc –
@RigertaDemiri SQL Server 2012 – GraveyardWorker21005