Pha*_*lon 8 sql sql-server sql-server-2012
在表中插入多行时,是否可以保证它们按照我指定的顺序进入?例如,请采取以下措施:
DECLARE @blah TABLE
(
ID INT IDENTITY(1, 1),
Name VARCHAR(100) NOT NULL
);
INSERT INTO @blah (Name)
VALUES('Timmy'),
('Jonny'),
('Sally');
SELECT * FROM @blah
Run Code Online (Sandbox Code Playgroud)
有没有Sally更高主键的保证Timmy?
之前曾问过非常相似的问题.
您可以指定ORDER BY的INSERT.
如果你这样做,其中的顺序IDENTITY生成值是保证符合规定ORDER BY的INSERT.
使用你的例子:
DECLARE @blah TABLE
(
ID INT IDENTITY(1, 1) NOT NULL,
Name VARCHAR(100) NOT NULL
);
INSERT INTO @blah (Name)
SELECT T.Name
FROM
(
VALUES
('Timmy'),
('Jonny'),
('Sally')
) AS T(Name)
ORDER BY T.Name;
SELECT
T.ID
,T.Name
FROM @blah AS T
ORDER BY T.ID;
Run Code Online (Sandbox Code Playgroud)
结果是:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
Run Code Online (Sandbox Code Playgroud)
也就是说,Name已经排序并且已根据此顺序生成ID.保证Jonny将拥有最低ID,Timmy将拥有最高ID,Sally将拥有他们之间的ID.生成的ID值之间可能存在间隙,但保证了它们的相对顺序.
如果没有指定ORDER BY的INSERT,则导致IDENTITY在不同的顺序生成的ID.
请注意,即使使用ORDER BYin ,也无法保证表中行的实际物理顺序INSERT,唯一的保证是生成的ID.
在一个问题INSERT INTO作为SELECT与ORDER BY来自MS的Umachandar Jayachandran说:
唯一的保证是将根据ORDER BY子句生成标识值.但是无法保证将行插入表中的顺序.
他给出了SQL Server中Ordering保证的链接,SQL Server Engine Team的Conor Cunningham说:
- 使用SELECT和ORDER BY来填充行的INSERT查询保证了如何计算标识值,但不保证插入行的顺序
在该帖子的评论中有一个指向MS知识库文章的链接:与SELECT INTO或INSERT一起使用时IDENTITY函数的行为.包含ORDER BY子句的SELECT查询,更详细地解释了它.它说:
如果希望按照子句中
IDENTITY的排序顺序分配值ORDER BY,请创建一个包含具有该IDENTITY属性的列的表,然后运行INSERT ... SELECT ... ORDER BY查询以填充此表.
我会将此KB文章视为官方文档,并认为此行为得到保证.
| 归档时间: |
|
| 查看次数: |
2096 次 |
| 最近记录: |