2008-12-18 9 views
2

Je cette table dans ma base de données SQL Express 2005:SQL Server 2005: ordre de tri naturel pour les tables 2 colonnes avec contrainte unique

CREATE TABLE [dbo].[test_sort_order](
    [Col1] [int] IDENTITY(1,1) NOT NULL, 
    [Col2] [nchar](50) COLLATE French_CI_AS NULL, 
CONSTRAINT [PK_test_sort_order] PRIMARY KEY CLUSTERED 
(
    [Col1] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY], 
CONSTRAINT [UQ_test_sort_order] UNIQUE NONCLUSTERED 
(
    [Col2] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

Lors de l'exécution d'une plate requête SQL contre elle (généralement SELECT * FROM test_sort_order) Je reçois un résultat ordonné selon la 2ème colonne (Col2)

Je m'attendrais à ce qu'il soit (naturellement) ordonné contre la colonne PK (qui en fait est l'ordre d'insertion des enregistrements) En fait, si vous supprimez la contrainte unique de Col2, c'est ce que vous obtenez. Et les choses deviennent de plus en plus mystérieuses quand vous gardez la contrainte unique et ajoutez une 3ème colonne (n'importe quel type) à cette table puisque le résultat d'un SELECT * est ensuite trié en fonction de l'ordre naturel.

Une idée pourquoi un tel comportement? Et comment s'en débarrasser. Merci

Répondre

3

SELECT est une opération orientée ensemble et, comme les ensembles ne sont pas ordonnés, aucun ordre spécifique dans le jeu de résultats n'est garanti, sauf si vous utilisez explicitement ORDER BY.

Questions connexes