状況の完全な説明を提供していないため、完全な回答を提供することはできませんが、一般的に、カーソル自体ではなく、SQLなどのセットベースの言語で回避したいのはループです(問題Cursosrは、ループが必要なことです)。
コメントでは、「最初のテーブルをループして2番目のテーブルと比較し、比較が失敗した場合は最初のテーブルからレコードを削除します。本質的には、最初のテーブルからレコードを削除します。もはや会社にいない従業員。」
SQLでこれを行う方法は次のとおりです。
DELETE From FirstTable
WHERE FirstTable.EmployeeID NOT IN
(
SELECT SecondTable.EmployeeID
FROM SecondTable
WHERE SecondTable.Flag = 'Y'
)
ループは必要ありません...
問題が、既存のストアドプロシージャを使用して削除を実行することである場合は、いくつかの可能性があります。
まず、ストアドプロシージャの内容を抽出し、これらの先行するWHERE条件に合わせて書き直すことができます。これはコードの重複であり、一部の人々のDRYの本能に違反していることを理解していますが、SQLはオブジェクト指向の開発環境ではなく、コードの重複が発生する場合があることを理解しています。
2番目のオプションは、ストアドプロシージャをリファクタリングして、EmployeeIdの削除対象のTableParameterを受け入れることができるようにすることです。ただし、これは複雑であり、そのストアドプロシージャを確認してアドバイスする必要があります。
3番目のオプションは、文字列集約を使用して動的SQLを構築し、次のように削除する各EmployeeIDのストアドプロシージャを呼び出すことです。
DECLARE @sql As NVarchar(MAX);
SET @sql = N'';
SELECT @sql = @sql + '
EXEC YourProc ''' + CAST(EmployeeID As NVARCHAR(MAX)) + '''; '
FROM FirstTable
WHERE FirstTable.EmployeeID IN
(
SELECT SecondTable.EmployeeID
FROM SecondTable
WHERE SecondTable.Flag = 'Y'
)
EXEC(@sql);
これにより、ループとCusrorの両方の問題が回避されますが、多くの人はそれも嫌います。主にその一般性のために、私はこのソリューションを自分で好みます。