Sql server 如何使用SQL insert在select语句中插入自动增量值
我有以下代码从另一个数据库的表中插入数据,但是如何通过将ID列中的最后一条记录的值增加1来插入主键列?在我的例子中,[WORK ORDER]是一个主键,它不允许null [工单]为nvarchar10 ----------//我试了以下方法---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 --&
--> 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