Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server插入多个行Id时保持不变_Sql_Sql Server - Fatal编程技术网

SQL server插入多个行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,

我在存储过程中的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,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事务不会锁定表,并且它不会在事务中获得最大值。