Il comportamento della funzione IDENTITY quando utilizzato con SELECT INTO o INSERT Query SELECT che contiene una clausola ORDER BY

Traduzione articoli Traduzione articoli
Identificativo articolo: 273586 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Quando si utilizza una query SELECT INTO con la funzione IDENTITY e una clausola ORDER BY, i valori identity generati non sono necessariamente hanno lo stesso ordine quello fornito con la clausola ORDER BY. Ad esempio, se la funzione IDENTITY viene avviato con un valore iniziale pari a 1 e un incremento di 1, la prima riga nel set di risultati ordinato Ŕ in grado di contenere un valore diverso da 1 e la seconda riga potrebbe Ŕ un valore diverso da 2 e in modo forth.While l'ordinamento venga visualizzati come previsto, il comportamento non Ŕ garantito. La presenza di TOP o SET ROWCOUNT, inoltre, non garantisce l'ordine delle righe.

Se si desidera che i valori IDENTITY da assegnare in modo sequenziale che segue l'ordinamento nella clausola ORDER BY, creare una tabella che contiene una colonna con la proprietÓ IDENTITY e quindi esecuzione un'istruzione INSERT SELECT query ? ORDER BY per popolare questa tabella.

Informazioni

I valori di identitÓ che vengono generati dipendono dalla posizione della funzione GetIdentity() nella struttura di query (showplan), che pu˛ cambiare a causa di query optimizer cambiamenti, piani di query parallele o la presenza di TOP/SET ROWCOUNT. Mentre potrebbe essere visualizzato scenari in cui di SELECT INTO con una funzione IDENTITY e una clausola ORDER BY produrre valori in un ordine che si desidera questo comportamento non Ŕ garantito e pu˛ variare senza preavviso. Gli scenari seguenti riguardano un'istruzione SELECT INTO e una funzione IDENTITY .

Consideri una tabella denominata OldTable con i seguenti valori.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

Scenario 1

In questo scenario, la query SELECT INTO utilizza una funzione IDENTITY e un ORDER BY clausola.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
nuovatabella pu˛ essere inserito con righe in una delle seguenti due modi.

Metodo 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
╚ possibile notare che il valore IDENTITY viene generato non sia nello stesso ordine della colonna ORDER BY ( Col1 ) nella query.

Metodo 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
In questo caso, Ŕ possibile notare che l'IDENTITY valore che SQL Server genera Ŕ nell'ordine esattamente stesso come ORDER BY colonna ( Col1 ) nella query. Tuttavia, questo Ŕ casuali e non Ŕ l'ordine garantito che verrÓ visualizzato ogni volta che viene eseguita la query.

Scenario 2

Le seguenti query SELECT INTO utilizzare la funzione IDENTITY e una clausola ORDER BY con un operatore TOP o con un'istruzione 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
nuovatabella pu˛ essere inserito con righe in una delle seguenti tre modi:

Metodo 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
In questo caso, si potrebbe notare che il valore IDENTITY viene generato non Ŕ nello stesso ordine della colonna ( Col1 ) ORDER BY nella query.

Metodo 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
In questo caso, Ŕ possibile notare che l'IDENTITY valore che SQL Server genera Ŕ esattamente nell'ordine stesso come ORDER BY colonna ( Col1 ) nella query. Tuttavia, questo Ŕ casuali e non Ŕ l'ordine garantito che verrÓ visualizzato ogni volta che viene eseguita la query.

Metodo 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
In questo caso, il valore IDENTITY che viene generato non Ŕ nello stesso ordine come ORDER BY colonna ( Col1 ) nella query. Inoltre, i dati inseriti non soddisfano i requisiti di SEED e il valore di incremento specificati nella funzione IDENTITY nella query (SEED = 1, valore di incremento = 1).

In realtÓ, la funzione IDENTITY genera valori di identitÓ correttamente in base ai parametri SEED e il valore di incremento. Tuttavia, la generazione del valore di identitÓ si verifica prima che le righe vengono ordinate in base alla clausola ORDER BY. Di conseguenza, quando Ŕ utilizzare un operatore TOP o SET ROWCOUNT istruzione, le righe inserite nella tabella risultante ( nuovatabella ) sembrano avere valori di identitÓ non corretto. I valori identity che viene generato potrebbero non corrispondere i parametri SEED e valore di incremento della funzione IDENTITY .

Di seguito Ŕ un esempio che prevede un INSERT INTO SELECT FROM con la clausola ORDER BY.

Se si consideri una tabella denominata OldTable con i seguenti valori:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


Di seguito Ŕ denominata nuovatabella la tabella di destinazione (ID Ŕ una colonna di identitÓ)
ID (identity)    Col1     Col2
---------------    -------   ------


La seguente query INSERT INTO SELECT FROM con una clausola ORDER BY garantirÓ a tale colonna che ID in nuovatabella Ŕ nello stesso ordine in 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 Colonna di identitÓ di ID viene generato per hanno stesso ordine di Col1 . INSERT INTO doesn?t garantisce tuttavia l'ordine fisico delle ID o Col1 in nuovatabella . Per recuperare i dati nell'ordine desiderato, Ŕ necessario disporre come attenendosi alla seguente istruzione SELECT di una clausola ORDER BY:
SELECT * from NewTable ORDER BY ID

ProprietÓ

Identificativo articolo: 273586 - Ultima modifica: venerdý 2 novembre 2007 - Revisione: 4.2
Le informazioni in questo articolo si applicano 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
Chiavi:á
kbmt kbhowto kbinfo kbpending KB273586 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 273586
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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