SQL Server中多行插入中标识分配的顺序保证

SQL Server中多行插入中标识分配的顺序保证,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,使用表值构造函数时http://msdn.microsoft.com/en-us/library/dd776382v=sql.100.aspx 要插入多行,是否保证任何标识列的填充顺序与TVC中的行匹配 例如 引擎保证a的值与b的分配顺序相同,即在这种情况下,它们与a=1、b=1和a=2、b=2匹配。这取决于您一次插入记录的时间。例如,插入后,如果删除a=2的记录,然后再次重新插入值b=2,则标识列的值将为maxa+1 展示 DECLARE @Sample TABLE (a int iden

使用表值构造函数时http://msdn.microsoft.com/en-us/library/dd776382v=sql.100.aspx 要插入多行,是否保证任何标识列的填充顺序与TVC中的行匹配

例如


引擎保证a的值与b的分配顺序相同,即在这种情况下,它们与a=1、b=1和a=2、b=2匹配。

这取决于您一次插入记录的时间。例如,插入后,如果删除a=2的记录,然后再次重新插入值b=2,则标识列的值将为maxa+1

展示

 DECLARE @Sample TABLE
 (a int identity(1, 1), b int)

 Insert into @Sample values (1),(2)

a   b
1   1
2   2

 Delete from @Sample where a=2

 Insert into @Sample values (2)
 Select * from @Sample

 a  b
 1  1
 3  2

基于我上面的评论,并且知道insert/select+order by的行为将保证生成标识顺序4:

您可以按以下方式使用表值构造函数来实现您的目标。如果您希望基于类别id生成标识,则不确定这是否满足其他约束

insert into thetable(CategoryId, CategoryName)
select *
from
  (values
    (101, 'Bikes'),
    (103, 'Clothes'),
    (102, 'Accessories')
  ) AS Category(CategoryID, CategoryName)
order by CategoryId

我正在插入一个镜头,我想知道订单是否有保证。比较第4项,该项为插入件提供订单保证。在我插入上面的内容之后,我想知道顺序是否可能是a=1,b=2和a=2,b=1组合将始终保持不变。文档说明,当您使用Insert into…时,插入的行中的Select可能顺序不正确。插入的数据值正确,但顺序不正确。例如,如果u Insert b=1和b=2,则检索到的数据将是a=2 b=2和a=1 b=1。此问题已解决从sql server 2008解决我知道TVC是2008年的一项新功能,但不确定您指的是什么问题。如果您能给我指一些文件或任何其他说明这是保证订单的东西,我会将其标记为正确答案。谢谢。我最近也一直在寻找这些信息,但找不到。sql-92标准以及我们知道t-sql是如何100%遵守这一点的:P要求表值构造函数组合函数像union all一样。Union all不能保证顺序,因此我倾向于认为目前不能保证顺序。演示与所问问题无关。因此,以OP为例,如果OP想要保证每行a和b之间的匹配,他们可以像插入Ab一样从值1、2中选择b,作为v b按b的顺序排列。这就是您所说的吗?注意,您只能通过使用order by来保证获取行的顺序。如果您是从没有顺序的select插入,则无法保证从一开始就以任何特定顺序插入行。使用上面示例中的表达式不会产生保证,除非您显式地包含一些列,这些列将按顺序使用并使用顺序值。在上面的例子中,您将得到101102和103作为命令的顺序
insert into thetable(CategoryId, CategoryName)
select *
from
  (values
    (101, 'Bikes'),
    (103, 'Clothes'),
    (102, 'Accessories')
  ) AS Category(CategoryID, CategoryName)
order by CategoryId