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

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 273586
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Quando você usa 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 que a mesma ordem como ordem em que é fornecido pela cláusula ORDER BY. Por exemplo, se a função IDENTITY começar com uma semente de 1 e um incremento de 1, a primeira linha no conjunto de resultados ordenado 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 pode aparecer como esperado, o comportamento não é garantido. A presença de TOP ou SET ROWCOUNT também não garante a ordem das linhas.

Se você desejar que os valores IDENTITY para ser atribuído de maneira seqüencial que segue a ordem na cláusula ORDER BY, crie uma tabela que contém uma coluna com a propriedade IDENTITY e, em seguida, executar um INSERT SELECT … ORDER BY consulta para preencher essa tabela.
Mais Informações
Os valores de identidade que são gerados dependem a posição da função GetIdentity() na árvore de consulta (showplan), que pode alterar devido a alterações otimizador, planos de consulta paralela ou a presença de TOP/SET ROWCOUNT. Enquanto você pode ver cenários em que um SELECT INTO com uma função IDENTITY e uma cláusula ORDER BY produzir valores em uma ordem que você desejar que esse comportamento não é garantida e podem ser alteradas sem aviso. Os cenários a seguir 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

Nesse cenário, a consulta SELECT INTO usa uma função IDENTITY e uma ORDER BY cláusula.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)INTO 	NewTableFROM 	OldTableOrder By Col1
NovaTabela podem ser inseridos com linhas em uma destas duas maneiras.

Método 1

Col1      Col2       ID-------   --------   --------1         A          42         Z          27         G          511        F          317        I          1
Você pode perceber que o valor IDENTITY pelo SQL Server não está na mesma ordem da coluna ORDER BY ( Col1 ) na consulta.

Método 2

Col1     Col2       ID-------  --------   -------1        A          12        Z          27        G          311       F          417       I          5
Nesse caso, você pode observar que o IDENTITY valor que SQL Server gera está em exatamente a mesma ordem como a coluna ORDER BY ( Col1 ) na consulta. Entretanto, esta é uma coincidência e não é a ordem garantida que será exibida toda vez que a consulta for executada.

Cenário 2

As seguintes consultas SELECT INTO usar 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 NewTableFROM OldTableOrder By Col1
- ou -
SET ROWCOUNT 3SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)INTO NewTableFROM OldTableOrder By Col1
NovaTabela podem ser inseridos com linhas em uma destas três maneiras possíveis:

Método 1

Col1   Col2   ID-----  -----  -----1      A      22      Z      17      G      3
Nesse caso, você pode ver que o valor IDENTITY pelo SQL Server não está na mesma ordem da coluna ORDER BY ( Col1 ) na consulta.

Método 2

Col1    Col2     ID------  ------   ------1       A        12       Z        27       G        3
Nesse caso, você pode observar que o IDENTITY valor que SQL Server gera esteja exatamente na mesma ordem como a coluna ORDER BY ( Col1 ) na consulta. Entretanto, esta é uma coincidência e não é a ordem garantida que será exibida toda vez que a consulta for executada.

Método 3

Col1   Col2    ID------ ------  ------1      A       42      Z       27      G       5
Nesse caso, o valor IDENTITY pelo SQL Server não é na mesma ordem da coluna ORDER BY ( Col1 ) na consulta. Além disso, os dados inseridos não atende aos INCREMENT e SEED requisitos especificados na função IDENTITY na consulta (SEED = 1, INCREMENT = 1).

Na verdade, a função IDENTITY gera valores de identidade corretamente com base em parâmetros SEED e INCREMENT. No entanto, a geração de valor de identidade ocorre antes das linhas são classificadas com base na cláusula ORDER BY. Portanto, quando você usar um operador TOP ou um ROWCOUNT SET declaração, as linhas inseridas na tabela resultante ( NovaTabela ) parecem ter valores de identidade incorreta. Os valores de identidade do que SQL Server gera podem não corresponder aos parâmetros INCREMENT e SEED da função IDENTITY .

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

Considere uma tabela que é chamada OldTable com os seguintes valores:
Col1      Col2-------   --------1         S          11        F 7         G          17        I2         z


Abaixo é a tabela de destino chamada NovaTabela (ID é uma coluna de identidade)
ID (identity)    Col1     Col2---------------    -------   ------


A seguinte consulta INSERT INTO SELECT FROM com uma cláusula ORDER BY garante essa coluna que ID no NovaTabela está na mesma ordem que Col1 .
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1 
ID (identity)    Col1     Col2-------------    ------   ------1                1         S2                2         z3                7         G4                11        F5                17        I

Observação Coluna de identidade de identificação é gerada para ter a mesma ordem de Col1 . No entanto, INSERT INTO doesn’t garante a ordem física de identificação ou Col1 em NovaTabela . Para recuperar os dados na ordem desejada, uma cláusula ORDER BY é necessária, conforme mostrado pelo seguinte instrução SELECT:
SELECT * from NewTable ORDER BY ID
@@ identidade identidade sql classificação ordem selecione Inserir

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 273586 - Última Revisão: 12/05/2015 21:44:30 - Revisão: 4.2

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

  • kbnosurvey kbarchive kbmt kbhowto kbinfo kbpending KB273586 KbMtpt
Comentários