SQL server插入多个行Id时保持不变
我在存储过程中的SQL server中有一个insert查询 该表有3个字段ID、TileID、CountryID,其中TileID和CountryID是从其他表中获取的,通过从表中选择maxID来增加ID 我的问题是:SQL server插入多个行Id时保持不变,sql,sql-server,Sql,Sql Server,我在存储过程中的SQL server中有一个insert查询 该表有3个字段ID、TileID、CountryID,其中TileID和CountryID是从其他表中获取的,通过从表中选择maxID来增加ID 我的问题是: declare @TileSId int SET @TileSId= (SELECT isnull(max(Id),0)+1 from tilesorting) insert [fiesauthentication].[dbo].tilesorting (Id,TileId,
declare @TileSId int
SET @TileSId= (SELECT isnull(max(Id),0)+1 from tilesorting)
insert [fiesauthentication].[dbo].tilesorting (Id,TileId,Nationality)
select @TileSId,t.Id,wc.CountryID from WebstoreCountry wc
left join tile t on t.URL = wc.URL AND t.CompanyId = wc.CompanyID
这里,如果我在select中有多行,那么每个行的ID都是相同的,我需要增加每行的ID
我的输出:
我想要下面这样
你可以试试这个。这将从表中获取最后插入的id,然后为每个新生成的行创建行号。通过添加它们,您将根据需要获得新的递增数字
Begin Try
Begin Transaction t1
declare @TileSId int
SET @TileSId= (SELECT isnull(max(Id),0)+1 from tilesorting WITH (TABLOCKX))
;with cte as
(
select row_number() over (order by t.id) as Slno,t.Id,wc.CountryID
from WebstoreCountry wc
left join tile t on t.URL = wc.URL AND t.CompanyId = wc.CompanyID
)
Insert into tilesorting ( colid, col2 )
select @TileSId + Slno , CountryID from cte
commit transaction t1
End Try
Begin Catch
Rollback transaction t1
End Catch
这里我们使用事务锁定您的表以供进一步使用。有关SQL中事务的更多信息,您可以找到此链接。您可以尝试此链接。这将从表中获取最后插入的id,然后为每个新生成的行创建行号。通过添加它们,您将根据需要获得新的递增数字
Begin Try
Begin Transaction t1
declare @TileSId int
SET @TileSId= (SELECT isnull(max(Id),0)+1 from tilesorting WITH (TABLOCKX))
;with cte as
(
select row_number() over (order by t.id) as Slno,t.Id,wc.CountryID
from WebstoreCountry wc
left join tile t on t.URL = wc.URL AND t.CompanyId = wc.CompanyID
)
Insert into tilesorting ( colid, col2 )
select @TileSId + Slno , CountryID from cte
commit transaction t1
End Try
Begin Catch
Rollback transaction t1
End Catch
这里我们使用事务锁定您的表以供进一步使用。有关SQL中事务的更多信息,请参见此链接。显示执行插入的完整代码。我怀疑这是因为您在计算了一次ID之后插入了一组行,所以这些行都得到了相同的ID。顺便说一句,select maxID+1是生成数字增量的糟糕方法。SQL server有一个内置的自动增量功能,为什么不使用它?@CaiusJard该表是由另一个人创建的,我无权更改它没有显示实际的插入-您是在说第二条SELECT语句吗?无论哪种方式,您都要定义一个值并跨多行应用它。正如@CaiusJard所说,为什么不在表中使用内置的自动增量呢?这是可以做到的,但一般来说这是个坏主意。如果在SELECT语句中生成此值,则每次运行SELECT时此值都会更改。如果它发生了变化,那么它在功能上并不是一个ID。显示执行插入的完整代码。我怀疑这是因为您在计算了一次ID之后插入了一组行,所以这些行都得到了相同的ID。顺便说一句,select maxID+1是生成数字增量的糟糕方法。SQL server有一个内置的自动增量功能,为什么不使用它?@CaiusJard该表是由另一个人创建的,我无权更改它没有显示实际的插入-您是在说第二条SELECT语句吗?无论哪种方式,您都要定义一个值并跨多行应用它。正如@CaiusJard所说,为什么不在表中使用内置的自动增量呢?这是可以做到的,但一般来说这是个坏主意。如果在SELECT语句中生成此值,则每次运行SELECT时此值都会更改。如果它改变了,那么它在功能上就不是一个ID。@CaiusJard:你能解释一下怎么做吗?这里OP已经说过,表结构的改变是不可能的。如果你坚持使用max+1解决方案,那么至少要锁定整个表,这样多个同时插入就不会插入冲突ID;我们已经知道这个id列不被限制为唯一的。@CaiusJard:Ya在这种类型的代码中没有锁定表是我的错,更正了它。ThanksA transaction不会锁定表,除非您将tablockx添加到查询中,而且它不会在事务中获得最大值。@CaiusJard:您能解释一下如何锁定吗?这里OP已经说过,表结构的改变是不可能的。如果你坚持使用max+1解决方案,那么至少要锁定整个表,这样多个同时插入就不会插入冲突ID;我们已经知道这个id列不被限制为唯一的。@CaiusJard:Ya在这种类型的代码中没有锁定表是我的错,更正了它。除非将tablockx添加到查询中,否则ThanksA事务不会锁定表,并且它不会在事务中获得最大值。