2016-11-29 4 views
0

カーソルの邪悪について多くの記事を読んでいますが、カーソルが読み込み専用で転送のみの場合には良い方法です。これがロックを引き起こさないと思うのは正しいですか?レコードのセットをループ/反復してストアドプロシージャを実行

レコードのグループを選択し、行が一定の値を持っている場合は、レコードを繰り返してアクションを実行する必要があります。 acrionはストアドプロシージャになり、現在の行のコピーをいくつかの更新された日付で同じテーブルに挿入します)。これらの行がたくさんある可能性があるので、私は可能な限り効率的な方法を探しています。

誰かがこの種の問題に対して最も効率的なアプローチを提案できますか?

+2

サンプルデータで説明できます – TheGameiswar

+0

カーソルは必ずしもパフォーマンスキラーではありませんが、デバッグは困難です。可能な限りループをセットベースのロジックに変換し、ステージングテーブルを使用してアップデート作業を実行してみてください。 – Eric

+0

* "いくつかの行をとり、いくつかの日付を更新してから、同じテーブルに再挿入したい" *セットベースのロジックで確実に達成できます。ここにはカーソルはほとんど必要ありません。 – iamdave

答えて

0

あなたは

に探し始めることができます

WITH 
    cteTotalSales (SalesPersonID, NetSales) 
    AS 
    (
    SELECT SalesPersonID, ROUND(SUM(SubTotal), 2) 
    FROM Sales.SalesOrderHeader 
    WHERE SalesPersonID IS NOT NULL 
    GROUP BY SalesPersonID 
) 
SELECT 
    sp.FirstName + ' ' + sp.LastName AS FullName, 
    sp.City + ', ' + StateProvinceName AS Location, 
    ts.NetSales 
FROM Sales.vSalesPerson AS sp 
    INNER JOIN cteTotalSales AS ts 
    ON sp.BusinessEntityID = ts.SalesPersonID 
ORDER BY ts.NetSales DESC 

希望します。

関連する問題