Sql server 基于查询的列自动递增

Sql server 基于查询的列自动递增,sql-server,ms-access,vba,database-trigger,Sql Server,Ms Access,Vba,Database Trigger,我正在尝试一个真正的新手MS Access表单(链接到),后端有一个SQL Server 因此,我有一个简单的发票表 create table Invoice ( ID INT not null primary key, IssuerID int not null, InvoiceID int not null, CustomerID int not null ) 也许我甚至不需要ID,因为我可以通过成对(IssuerID、InvoiceID)唯一地标识条目 总

我正在尝试一个真正的新手MS Access表单(链接到),后端有一个SQL Server

因此,我有一个简单的发票表

create table Invoice
(
    ID INT not null primary key,
    IssuerID int not null,
    InvoiceID int not null,
    CustomerID int not null
)
也许我甚至不需要ID,因为我可以通过成对(IssuerID、InvoiceID)唯一地标识条目

总而言之,我想将invoice by
IssuerID
添加到一些
CustomerID
中,
InvoiceID
自然应该增加1。我可以做类似的事情

SELECT ISNULL(MAX(InvoiceID), 0) + 1 AS InvoiceID
FROM Invoice
WHERE IssuerID = @sp;
其中
@sp
是某个值

在UI逻辑中,我有一个组合框来选择
IssuerID
(访问),我的问题从这里开始

我使用了一个用于
InvoiceID
的文本框。我希望它通过下一个ID更新表(即,如果IssuerID=5,有3张已开具发票,则下一张发票应编号为4)。 我无法使直接SQL工作,也无法在
IssuerID
combo的更新后使用VBA

因此,我创建了一个视图(在SQL Server中并链接到它),其中包含所有可能的IssuerID及其相应的NextInVoiceID

SELECT         
    IssuerID, NextInvoiceID
FROM     
    (SELECT  
         Issuers.ID AS IssuerID, 
         ISNULL(MAX(Invoice.InvoiceID), 0) + 1 AS NextInvoiceID
     FROM    
         Issuers 
     FULL OUTER JOIN 
         Invoice ON Issuers.ID = Invoice.IssuerID
     GROUP BY 
         Issuers.ID) AS UNDATA
接下来,我可以选择
nextInvoiceID
,但现在我需要它来更新实际列

可以从同一个文本框中进行吗


我是否应该回退,使用一些触发器更新此(InvoiceID)(或者SQL Server中是否有其他可用的自动增量选项)?

Eh。。。我不确定你到底在问什么。也许您只是在寻找使字段自动递增的标识规范(
ID INT not null identity(1,1)主键,
)?或者有什么原因不能这样做吗?InvoiceID仅在IssuerID之前是唯一的,即IssuerID 5发出了3张发票,而IssuerID 6已经是1097,那么IssuerID 5的下一个InvoiceID应该是4而不是1098!因此,它不是主键。在这种情况下,您可以尝试在SQL server中使用insert而不是insert触发器。提供在实际插入插入行之前修改插入行的概述。关于如何构建这样一个触发器的完整演练在这里太广泛了。为什么不使用IssuerID和InvoiceID作为复合主键呢?引入另一个复合主键没有多大意义。