标识函数与 SELECT INTO 或 INSERT 一起使用时的行为包含 ORDER BY 子句的 SELECT 查询

文章翻译 文章翻译
文章编号: 273586 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

当您使用 IDENTITY 函数和 ORDER BY 子句的 SELECT INTO 查询时,生成的标识值不能保证已作为所提供的 ORDER BY 子句的次序相同的顺序。 例如对于如果 IDENTITY 函数启动与 1 的种子和增量为 1,第一行中有序结果集可能有一个值,不同于 1,第二行可能有一个值,不同于 2,并因此按照您预期的那样,顺序可能会出现 forth.While,行为不能保证。TOP 或 SET ROWCOUNT 存在还不能保证中行的顺序。

您是否要为其分配以顺序方式随后在 ORDER BY 子句中订购的 标识 值创建的包含带有 IDENTITY 属性列,然后运行 INSERT 表SELECT … 的 ORDER BY 查询来填充此表。

更多信息

生成的标识值取决于在查询树 (显示计划) 可能会将其更改为并行查询计划或存在的 TOP/SET ROWCOUNT 的优化程序更改由于 GetIdentity() 函数的位置。 同时您可能会看到其中一个 SELECT INTO IDENTITY 函数和 ORDER BY 子句产生中的值的情况下订单所需此行为不能保证,没有警告的情况下可能会更改。 在以下情况下涉及 SELECT INTO 语句和 IDENTITY 函数。

请考虑使用下面的值名为 OldTable 的表。
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

方案 1

在这种情况下 SELECT INTO 查询使用一个标识函数和
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
NewTable 可以将插入的行中的以下一两种方法。 一个 ORDER BY 子句。

方法 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
您可能会注意到 SQL Server 生成的标识值不是作为 ORDER BY 列 (Col1) 相同的顺序在查询中。

方法 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
在这种情况下您可能会注意到 SQL Server 生成的标识值完全相同 (Col1) 中 ORDER BY 列的顺序是在查询中。但是,这是巧合,并不保证每次运行查询时,您将收到的顺序。

方案 2

下面的 SELECT INTO 查询使用 IDENTITY 函数和 ORDER BY 子句使用 TOP 运算符或
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
-
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
NewTable 可以将插入以下某项中的行与三种可能的方法: 一个 SET ROWCOUNT 语句。

方法 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
在这种情况下,您可能会看到 SQL Server 生成的标识值不是作为 ORDER BY 列 (Col1) 相同的顺序在查询中。

方法 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
在这种情况下您可能会注意到 SQL Server 生成的标识值完全相同的顺序与 ORDER BY 列 (Col1) 是在查询中。但是,这是巧合,并不保证每次运行查询时,您将收到的顺序。

方法 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
在这种情况下 SQL Server 生成的标识值不在顺序与在 ORDER BY 列 (Col1) 在查询中的顺序相同。此外,插入的数据不符合所标识函数在查询中指定的种子和增量要求 (SEED = 1,增量 = 1)。

实际,该 标识 函数将生成正确根据种子和增量的参数的标识值。但是,基于 ORDER BY 子句可以排序行之前,发生此事件的标识值生成。因此,当您使用 TOP 运算符或一个 SET ROWCOUNT 语句,插入结果的表 (NewTable) 行看起来有不正确的标识值。SQL Server 生成的标识值可能与种子和增量 标识 函数的参数不匹配。

下面是一个示例,涉及一个 INSERT INTO SELECT FROM 使用 ORDER BY 子句。

请考虑使用下面的值名为 OldTable 表:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


目标表下面命名 NewTable (ID 是标识列)
ID (identity)    Col1     Col2
---------------    -------   ------


下面的 INSERT INTO SELECT FROM 查询使用 ORDER BY 子句将保证的该列中 NewTable ID 是相同 Col1 的顺序。
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1 
ID (identity)    Col1     Col2
-------------    ------   ------
1                1         S
2                2         z
3                7         G
4                11        F
5                17        I

注意具有相同的顺序的 Col1 生成 ID 标识列。然而,INSERT INTO doesn’t 保证 ID 或 Col1NewTable 中的物理顺序。要检索所需顺序中的数据,ORDER BY 子句,需要按照下面的 SELECT 语句所示:
SELECT * from NewTable ORDER BY ID

属性

文章编号: 273586 - 最后修改: 2007年11月2日 - 修订: 4.2
这篇文章中的信息适用于:
  • Microsoft SQL Server 7.0 标准版
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 标准版
关键字:?
kbmt kbhowto kbinfo kbpending KB273586 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 273586
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com