我的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语法中实现插入? 谢谢!
答案 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
块以捕获许多错误并将逻辑封装在存储过程中。
作为旁注:您的数据结构很好。您可能希望明确invoice
是invoices
表的主键。