由于您没有向我们提供您的情况的完整描述,我们无法给出完整的答案,但是,一般来说,您希望在 SQL 等基于集合的语言中避免循环,而不是游标本身(问题与光标是他们需要循环)。
在您的评论中,您提供了更多信息,因为您希望“循环遍历第一个表,与第二个表进行比较,当比较失败时,我从第一个表中删除记录。本质上,我正在从第一个表中删除记录不再在公司工作的员工。 ”
以下是在 SQL 中执行此操作的方法:
DELETE From FirstTable
WHERE FirstTable.EmployeeID NOT IN
(
SELECT SecondTable.EmployeeID
FROM SecondTable
WHERE SecondTable.Flag = 'Y'
)
不需要循环...
如果问题是您想使用预先存在的存储过程进行删除,那么有几种可能性:
首先,您可以提取存储过程的内容并针对这些前面的 WHERE 条件重新编写它们。我知道这是代码重复,它违反了某些人的 DRY 直觉,但是,我知道 SQL不是面向对象的开发环境,有时代码重复必须发生。
第二个选项是重构存储过程,以便它可以接受 TableParameter 为其 EmployeeId 删除。不过这很复杂,我们需要查看该存储过程来为您提供建议。
第三个选项是使用字符串聚合来构建动态 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 问题,尽管许多人也不喜欢它。我自己更喜欢这个解决方案,主要是因为它的普遍性。