O comportamento da função IDENTITY quando utilizado com SELECT INTO ou INSERT SELECT consultas que contêm uma cláusula ORDER BY

Traduções de Artigos Traduções de Artigos
Artigo: 273586 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Quando utiliza uma consulta SELECT INTO com a função IDENTITY e uma cláusula ORDER BY, os valores de identidade que são gerados não são garantidos para que a mesma ordem que a ordem pela qual é fornecido pela cláusula ORDER BY. Por exemplo, se a função IDENTITY começar com uma base de 1 e um incremento de 1, a primeira linha no conjunto de resultados ordenada pode ter um valor diferente de 1 e a segunda linha pode ter um valor diferente de 2 e para que forth.While a ordenação poderá aparecer como previsto, o comportamento não está assegurado. A presença de TOP ou SET ROWCOUNT também não garante a ordem das linhas.

Se pretender que os valores IDENTITY devem ser atribuídos de forma sequencial que se segue a ordenação na cláusula ORDER BY, criar uma tabela que contém uma coluna com a propriedade IDENTITY e em seguida, execute um INSERT SELECT ? ORDER BY consulta para preencher esta tabela.

Mais Informação

Os valores de identidade que são gerados dependem a posição da função GetIdentity() na árvore da consulta (showplan), que pode alterar devido a alterações de optimização, planos de consulta paralela ou a presença de TOP/SET ROWCOUNT. Enquanto poderá ver cenários em que um SELECT INTO com uma função IDENTITY e uma cláusula ORDER BY produzir valores de uma encomenda que pretendam este comportamento não é garantida e poderá ser alterado sem aviso prévio. Os seguintes cenários envolvem uma instrução SELECT INTO e uma função IDENTITY .

Considere uma tabela denominada OldTable com os seguintes valores.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

Cenário 1

Neste cenário, a consulta SELECT INTO utiliza uma função IDENTITY e um ORDER BY cláusula.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
novatabela pode ser inserido com linhas de uma das seguintes duas formas.

Método 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
Poderá notar que o IDENTITY valor que gera o SQL Server não é pela mesma ordem, a coluna ORDER BY ( Col1 ) na consulta.

Método 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
Neste caso, poderá notar o IDENTITY valor que SQL Server gera consta exactamente a mesma ordem, a coluna ORDER BY ( Col1 ) na consulta. No entanto, esta é coincidental e não é garantido ordem que receberá sempre que a consulta for executada.

Cenário 2

As consultas seguintes SELECT INTO utilizam a função IDENTITY e uma cláusula ORDER BY, com um operador TOP ou uma instrução SET ROWCOUNT.
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
- ou -
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
novatabela pode ser inserido com linhas de uma das seguintes três formas possíveis:

Método 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
Neste caso, poderá ver que o IDENTITY valor que gera o SQL Server não é pela mesma ordem, a coluna ORDER BY ( Col1 ) na consulta.

Método 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
Neste caso, poderá notar o IDENTITY valor que SQL Server gera consta exactamente a mesma ordem em que a coluna ORDER BY ( Col1 ) na consulta. No entanto, esta é coincidental e não é garantido ordem que receberá sempre que a consulta for executada.

Método 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
Neste caso, o valor IDENTITY que gera o SQL Server não é pela mesma ordem, a coluna ORDER BY ( Col1 ) na consulta. Além disso, os dados inseridos não com os requisitos de base e INCREMENTO especificados na função IDENTITY na consulta (PROPAGAÇÃO = 1, INCREMENTO = 1).

Na realidade, a função IDENTITY gera identidade valores correctamente com base nos parâmetros de base e INCREMENTO. No entanto, a geração de valor de identidade ocorre antes das linhas são ordenadas com base na cláusula ORDER BY. Por conseguinte, quando utiliza um operador TOP ou um ROWCOUNT SET instrução, linhas inseridas na tabela resultante ( novatabela ) parecem ter valores de identidade incorrecto. Os valores de identidade que do SQL Server gera podem não corresponder aos parâmetros base e INCREMENTO da função IDENTITY .

Eis um exemplo que envolve um INSERT INTO SELECT FROM com cláusula ORDER BY.

Considere uma tabela denominada OldTable com os seguintes valores:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


Abaixo da tabela de destino chama novatabela (ID é uma coluna de identificação)
ID (identity)    Col1     Col2
---------------    -------   ------


A consulta seguinte INSERT INTO SELECT FROM com uma cláusula ORDER BY irá garante a coluna que ID no novatabela está a ser a mesma ordem 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 Coluna de identidade de ID é gerada para que a mesma ordem de Col1 . No entanto, INSERT INTO doesn?t garante a ordem física dos ID ou Col1 em novatabela . Para obter os dados na ordem pretendida, uma cláusula ORDER BY é necessária tal como mostrado, seguindo a instrução SELECT:
SELECT * from NewTable ORDER BY ID

Propriedades

Artigo: 273586 - Última revisão: 2 de novembro de 2007 - Revisão: 4.2
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbhowto kbinfo kbpending KB273586 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 273586

Submeter comentários

 

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