Sql server 如何使用SQL insert在select语句中插入自动增量值

Sql server 如何使用SQL insert在select语句中插入自动增量值,sql-server,tsql,Sql Server,Tsql,我有以下代码从另一个数据库的表中插入数据,但是如何通过将ID列中的最后一条记录的值增加1来插入主键列?在我的例子中,[WORK ORDER]是一个主键,它不允许null [工单]为nvarchar10 ----------//我试了以下方法--- --> You only do this one time...not with each query create sequence dbo.WorkOrderSequence as int start with 43236 --&

我有以下代码从另一个数据库的表中插入数据,但是如何通过将ID列中的最后一条记录的值增加1来插入主键列?在我的例子中,[WORK ORDER]是一个主键,它不允许null

[工单]为nvarchar10

----------//我试了以下方法---

--> You only do this one time...not with each query
create sequence dbo.WorkOrderSequence
  as int
  start with 43236


--> I took out the part that failed (you got option 1 and 3 kinda
--> mashed together)
insert DB1.dbo.WORKORDERS 
   ([WORK ORDER #],[CUSTOMER],[SO DATE],[SO NUMBER],[ASSY PN-S],[CUSTOMER PN],[SHIP VIA],[PROMISED DATE],[COMMENTS],[PO #],[WO Notes])
select 
  convert(varchar(10), next value for DB1.dbo.WorkOrderSequence ),
  x.Customer_Bill_Name,
  x.TransactionDate,
  x.Reference,
  x.ItemID,
  x.PartNumber,
  x.WhichShipVia,
  x.ShipByDate,
  x.Comment2,
  x.CustomerInvoiceNo,
  x.SalesDescription
from
  openquery
  ([DB29],
    'select distinct           
       Customers.Customer_Bill_Name,
       JrnlHdr.TransactionDate,
       JrnlHdr.Reference, 
       LineItem.ItemID ,
       LineItem.PartNumber, 
       Customers.WhichShipVia, 
       JrnlHdr.ShipByDate, 
       JrnlHdr.Comment2,
       JrnlHdr.CustomerInvoiceNo, 
       LineItem.SalesDescription    
FROM   Customers
INNER JOIN JrnlHdr
ON Customers.CustomerRecordNumber = JrnlHdr.CustVendId
LEFT OUTER JOIN Address
ON Customers.CustomerRecordNumber = Address.CustomerRecordNumber
INNER JOIN JrnlRow
ON JrnlHdr.PostOrder = JrnlRow.PostOrder
INNER JOIN LineItem 
ON JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber
WHERE  JrnlHdr.JrnlKey_Journal = 11 AND JrnlHdr.TransactionDate = CURDATE() 
AND JrnlHdr.PostOrder = JrnlRow.PostOrder  
AND JrnlHdr.CustVendId = Customers.CustomerRecordNumber 
AND JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber 
AND JrnlHdr.POSOisClosed = 0' 
) as x

我已经涉猎了一点SQL,但并没有那么多地创建表。我已经使用了postgreSQL和knex来实现这一点,我相信也应该适合您需要的解决方案是使用独特的价值观。如果这不正确,我深表歉意,因为我还不懂编码,但希望看看这一点会有所帮助,或者看看SQL文档:

选项1

如果您至少使用SQL Server 2012,但未提及特定版本,则可以使用通用序列号生成器。我非常喜欢这种场景。在DB1数据库中,您可以像这样添加序列:

create sequence dbo.WorkOrderSequence
  as int
  start with 5002230 --> pick a starting number greater 
                     --> than any existing [WorkOrder #] 
然后,您可以在insert for select语句中获取下一个数字:

insert DB1.dbo.WORKORDERS 
  ([WORK ORDER #], [CUSTOMER], [SO DATE], [SO NUMBER])
select 
  convert(varchar(10), next value for DB1.dbo.WorkOrderSequence ),
  x.Customer_Bill_Name,
  x.TransactionDate,
  x.Reference
from
  openquery
  ([DB29],
    'select distinct 
       Customers.Customer_Bill_Name, 
       JrnlHdr.TransactionDate,
       JrnlHdr.Reference
     from
       Customers
       inner join 
       JrnlHdr on 
         Customers.CustomerRecordNumber = JrnlHdr.CustVendId
     where
       JrnlHdr.JrnlKey_Journal = 11
       and 
       JrnlHdr.TransactionDate = CURDATE()' 
  ) as x
序列是一个独立的自动递增数字。每次为dbo.WorkOrderSequence使用下一个值时,它都会自动递增。这样,您就不必修改任何表定义

选择2

或者,您可以更改DB1.dbo.WORKORDERS表,以便使用表达式的默认值

alter table dbo.WORKORDERS
  alter column [Work Order #] nvarchar(10) not null
    default( convert( nvarchar(10), next value for dbo.WorkOrderSequence ) )
如果您这样做,那么您可以完全省略插入[Work Order],让默认值发挥作用

选择3

如果你不在2012年,但至少在2008年,你仍然可以到达那里……但这有点棘手,因为你必须获得当前的开始[工作单]:

选择4


如果您使用的是早于2008年的某个存储过程……您可能需要一个存储过程分两步执行插入操作:将工单插入到临时表中,并从当前表的最大值[work Order]开始自动递增[work Order]+1…然后步骤2将使用转换将临时表插入到工单中。

为什么不将[工单]更改为BIGINT并将其设置为自动INCREMENT@Arun但如果我将其更改为bigint并设置autoincrement,它将重置我丢失的所有记录,因此我将丢失历史记录使用row_number如何?你需要去掉distinct,或者做一个派生表,把行号放在表外。谢谢@james,但是工单的格式从500XXX开始,我有2000records@Joe工单是数字的,对吗?我的意思是你说它从500XXX开始,这里X代表一个从0到9的数字,或者它可以是一个字母表?谢谢@clay我喜欢选项1上的选项1和3我必须用序列字段创建WorkOrderSequence表?不-WorkOrderSequence是一个序列对象…从SQL Server 2012开始它是一个新事物。你根本不需要做桌子。看,选项3根本不需要在数据库中添加任何内容。非常感谢!很抱歉耽搁了,我编辑了我的问题,向您展示了我是如何实现选项1的。恐怕您把它弄得一团糟,把选项1和选项3弄混了:-
alter table dbo.WORKORDERS
  alter column [Work Order #] nvarchar(10) not null
    default( convert( nvarchar(10), next value for dbo.WorkOrderSequence ) )
insert DB1.dbo.WORKORDERS 
  ([WORK ORDER #], [CUSTOMER], [SO DATE], [SO NUMBER])
select 
  convert(varchar(10), x.RowNum + y.MaxOrderNum ),
  x.Customer_Bill_Name,
  x.TransactionDate,
  x.Reference
from
  openquery
  ([DB29],
    'select distinct 
       row_number() over( order by JrnlHdr.TransactionDate ) as RowNum,
       Customers.Customer_Bill_Name, 
       JrnlHdr.TransactionDate,
       JrnlHdr.Reference
     from
       Customers
       inner join 
       JrnlHdr on 
         Customers.CustomerRecordNumber = JrnlHdr.CustVendId
     where
       JrnlHdr.JrnlKey_Journal = 11
       and 
       JrnlHdr.TransactionDate = CURDATE()' 
  ) as x
  cross join
  (
    select 
      convert( int, max( [Work Order #] ) ) as MaxOrderNum
    from 
      Db1.dbo.WORKORDERS
  ) as y