SQL Server语言 - 是否可以为存储过程的开始和结束设置逻辑条件



我编写了一个复杂的存储过程,它基于复杂的逻辑在多个表之间移动记录。我已经仔细检查了逻辑的每一小段,但我想对代码有最大的信心。有没有办法声明必须在SP的开头和结尾之间保持的逻辑关系?如果不满足这些条件,我想 SP 将被回滚。

具体来说,我想声明表 A 中由一组逻辑条件挑选出来的记录将位于 SP 末尾的表 B(而不是表 A 中(,而未由这组逻辑条件选取的记录仍将位于 SP 末尾的表 X 中。我使用布尔函数来挑选 A 中符合条件的记录。

我知道我可以用 nUnit 测试其中一些东西,但我想知道是否有办法在 t-SQL 本身中声明和强制执行这种逻辑。

如果您的记录具有包含唯一 ID 的字段,则可以执行从表 A 到 TableB 的简单INSERT + SELECT,然后对插入的原始记录进行简单的DELETE

例如,首先将所有符合选择条件的记录插入 TableB:

INSERT INTO TableB (uniqueID, Field1, Field2, FieldN)
SELECT uniqueID,
       Field1,
       Field2,
       FieldN
FROM   TableA
WHERE  FieldN = SomeCriteria

然后使用字段 uniqueID 作为选择条件从表 A 中删除您刚刚插入到 Table B 中的所有记录,以确定要删除的记录:

DELETE TableA
WHERE  uniqueID IN (SELECT uniqueID
                    FROM   TableB)

如果您将两个语句放在一个事务中,并进行几个错误检查,则应受到保护,以防在执行两个语句时出现问题:

BEGIN TRANSACTION
INSERT INTO TableB (uniqueID, Field1, Field2, FieldN)
SELECT uniqueID,
       Field1,
       Field2,
       FieldN
FROM   TableA
WHERE  FieldN = SomeCriteria;
IF @@ERROR <> 0 THEN
BEGIN
    ROLLBACK TRANSACTION
    RETURN (@@ERROR)
END
DELETE TableA
WHERE  uniqueID IN (SELECT uniqueID
                    FROM   TableB);
if @@ERROR <> 0 THEN
BEGIN
    ROLLBACK TRANSACTION
    RETURN (@@ERROR)
END
COMMIT TRANSACTION 

如果您没有可以唯一标识每个记录的列,则可以使用 EXISTS 而不是 IN 从 TableA 选择要DELETE的记录:

DELETE TableA
WHERE  EXISTS (SELECT *
               FROM   TableB
               WHERE  TableA.field1 = TableB.field1
                      AND TableA.field2 = TableB.field2
                      AND TableA.FieldN = TableB.fieldn);

最新更新