同时插入2个表,但如果有错误则停止

时间:2015-12-06 09:24:09

标签: c# sql sql-server visual-studio

我的SQL Server,Invoices和InvoiceDetails中有两个表。 发票:

Invoice  |  Date         |  Total     | Salesman
1001     |  10/10/2015   |  1000.00   |  101

InvoiceDetails:

ID  | Invoice          | ProductID  | Date       |Total   | Salesman
1   |  1001            | 1          | 10/10/2015 | 200.00 | 101
2   |  1001            | 2          | 10/10/2015 | 200.00 | 101
3   |  1001            | 3          | 10/10/2015 | 100.00 | 101
4   |  1001            | 4          | 10/10/2015 | 500.00 | 101

我想同时填写这两个表,这意味着只有一个SQL查询。我可以使用两个插入语句如下:

INSERT INTO InvoicesDetails(data) VALUES(data_to_insert)
INSERT INTO Invoices(data) VALUES(data_to_insert)

我需要先插入InvoicesDetails,然后再将其插入发票中。但问题是,如果最后一个事务没有成功记录到InvoiceDetails表中怎么办?在发票表中,特定的发票1001将总共有1,000.00,但在InvoiceDetails中,它只是500.00,因为它没有成功插入500.00的最后一笔交易。

在这种情况下,如何在一个sql语法中实现插入? 谢谢!

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,这是交易点 - 要么两者都发生了变化,要么都没有。这些在文档(here)中有详细描述。

在您的情况下,代码看起来像:

BEGIN TRANSACTION insertboth
    INSERT INTO InvoicesDetails(data) VALUES(data_to_insert);
    INSERT INTO Invoices(data) VALUES(data_to_insert);
COMMIT TRANSACTION insertboth;

我建议除了事务之外,还要包含TRY / CATCH块以捕获许多错误并将逻辑封装在存储过程中。

作为旁注:您的数据结构很好。您可能希望明确invoiceinvoices表的主键。