El comportamiento de la función IDENTITY cuando se utiliza con INSERT o SELECT INTO Consultas SELECT que contienen una cláusula ORDER BY

Seleccione idioma Seleccione idioma
Id. de artículo: 273586 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Cuando se utiliza una consulta SELECT INTO con la función IDENTITY y una cláusula ORDER BY, no se garantiza que los valores de identidad que se generan tienen el mismo orden que el orden proporcionado por la cláusula ORDER BY. Por ejemplo, si la función IDENTITY se inicia con un valor de inicialización de 1 y un incremento de 1, la primera fila en el conjunto de resultados ordenado podría tener un valor distinto de 1 y la segunda fila puede tener un valor diferente de 2 y por lo que el orden quizás aparezca forth.While como cabría esperar, el comportamiento no está garantizado. También la presencia de TOP o SET ROWCOUNT no garantiza el orden de las filas.

Si desea que los valores IDENTITY para asignarse de forma secuencial que sigue el orden en la cláusula ORDER BY, crear una tabla que contiene una columna con la propiedad IDENTITY y, a continuación, ejecutar una instrucción INSERT SELECT consulta ? ORDER BY para llenar esta tabla.

Más información

Los valores de identidad que se generan dependen de la posición de la función GetIdentity() en el árbol de consulta (plan de presentación), que puede cambiar debido a cambios del optimizador, planes de consultas en paralelo o la presencia de TOP o SET ROWCOUNT. Mientras puede ver situaciones en que un SELECT INTO con una función IDENTITY y una cláusula ORDER BY producen valores en un orden que desee que este comportamiento no está garantizado y puede cambiar sin previo aviso. Los siguientes escenarios implican una instrucción SELECT INTO y una función IDENTITY .

Considere una tabla que se denomina OldTable con los valores siguientes.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

Escenario 1

En este escenario, la consulta SELECT INTO utiliza una función IDENTITY y un ORDER BY cláusula.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
tablanueva pueden insertarse con las filas de una de las siguientes dos formas.

Método 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
Puede observar que el valor IDENTITY que SQL Server genera no es en el mismo orden que la columna ORDER BY ( Col1 ) en la consulta.

Método 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
En este caso, puede observar que la IDENTITY valor que SQL Server genera se encuentra en exactamente el mismo orden como ORDER BY columna ( Col1 ) en la consulta. Sin embargo, esto es coincidental y no es el orden garantizado que recibirá cada vez que se ejecuta la consulta.

Escenario 2

Las siguientes consultas SELECT INTO utilizan la función IDENTITY y una cláusula ORDER BY con un operador TOP o una instrucción SET ROWCOUNT.
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
- o -
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
tablanueva pueden insertarse con las filas de una de las siguientes tres maneras posibles:

Método 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
En este caso, puede ver que el valor IDENTITY que SQL Server genera no es en el mismo orden que la columna ORDER BY ( Col1 ) en la consulta.

Método 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
En este caso, puede observar que la IDENTITY valor que SQL Server genera está exactamente en el mismo orden que la columna ORDER BY ( Col1 ) en la consulta. Sin embargo, esto es coincidental y no es el orden garantizado que recibirá cada vez que se ejecuta la consulta.

Método 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
En este caso, el valor IDENTITY que genera SQL Server no es en el mismo orden que la columna ORDER BY ( Col1 ) en la consulta. Además, los datos insertados no cumplen los requisitos de SEED y INCREMENT especificados en la función IDENTITY en la consulta (SEED = 1, INCREMENT = 1).

En realidad, la función IDENTITY genera valores de identidad correctamente basándose en los parámetros SEED y INCREMENT. Sin embargo, la generación de valor de identidad se produce antes de que las filas se ordenan según la cláusula ORDER BY. Por consiguiente, cuando utilice un operador TOP o SET ROWCOUNT instrucción, las filas insertadas en la tabla resultante ( tablanueva ) parecen tener los valores de identidad incorrecta. Los valores de identidad, que SQL Server genera podrían no coincidir con los parámetros de SEED y INCREMENT de la función IDENTITY .

Aquí es un ejemplo que implica una INSERT INTO SELECT FROM con la cláusula ORDER BY.

Considere una tabla que se denomina OldTable con los valores siguientes:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


A continuación la tabla de destino se denomina tablanueva (ID. es una columna de identidad)
ID (identity)    Col1     Col2
---------------    -------   ------


La siguiente consulta INSERT INTO SELECT FROM con una cláusula ORDER BY garantizará que columna ID en tablanueva en el mismo orden que 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

Nota Columna de identidad ID se genera para tienen mismo orden de Col1 . Sin embargo, INSERT INTO doesn?t garantiza el orden físico de ID o Col1 en tablanueva . Para recuperar los datos en el orden deseado, una cláusula ORDER BY es necesaria como siguiendo la instrucción SELECT:
SELECT * from NewTable ORDER BY ID

Propiedades

Id. de artículo: 273586 - Última revisión: viernes, 2 de noviembre de 2007 - Versión: 4.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 7.0 Standard Edition
  • 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 Standard Edition
Palabras clave: 
kbmt kbhowto kbinfo kbpending KB273586 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 273586

Enviar comentarios

 

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