0

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

具体来说,我想声明由一组逻辑条件挑选出的表 A 中的记录将在 SP 末尾的表 B 中(而不是在表 A 中),并且那些逻辑条件集没有挑选出的记录条件仍将在 SP 末尾的表 X 中。我使用布尔函数来挑选 A 中符合条件的记录。

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

4

1 回答 1

1

如果您的记录有一个包含唯一 ID 的字段,您可以从 TableA 到 TableB 执行一个简单的INSERT+ SELECT,然后DELETE插入一个简单的原始记录。

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

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

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

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来代替从 TableAIN中选择记录:DELETE

DELETE TableA
WHERE  EXISTS (SELECT *
               FROM   TableB
               WHERE  TableA.field1 = TableB.field1
                      AND TableA.field2 = TableB.field2
                      AND TableA.FieldN = TableB.fieldn);
于 2013-02-06T03:32:51.800 回答