2012-04-18 21 views
11

che modo SQL Server determinare l'ordine delle colonne quando si esegue una SELECT *?SQL Server Select * Nome colonna ordinare

lo so "Order By" è essenziale per ordinare i dati, ma mi aspettavo i nomi delle colonne essere coerenti.

Nota: il mio codice è non in base all'ordine effettivo in cui vengono restituite le colonne. Voglio solo sapere come SQL Server decide di ordinare i nomi delle colonne.

di circa 20 computer la mia squadra sta usando, uno di loro si comporta in modo diverso. Ogni differenza merita di essere investigata. L'ordinamento dei nomi delle colonne sembra essere lo stesso per tutti i computer quando apriamo SQL Server Management Studio. Quando la nostra applicazione fa una domanda è quando vedo la differenza.

Sto usando SQL Server 2008 e SQL Server 2008 R2. La mia applicazione utilizza C# System.Data.SqlClient per accedere al database.

MODIFICA: Il mio problema è risultato che uno dei computer era configurato per accedere come 'sa', anziché dall'utente desiderato. La query stava colpendo direttamente la tabella quando intendevamo che colpisse una vista. Grazie per l'apprendimento aiuto su sys.columns

+5

beh prima le cose, devi sempre specificare le colonne e non usare SELECT *, quindi tu può controllarlo – Taryn

+0

è nell'ordine in qualunque ordine tu li definisca mentre crei la tabella – Devjosh

+0

@bluefeet e altri, questa non è una questione di best practice. È una questione di curiosità su come SQL Server prende determinate decisioni. – Yuck

risposta

13

Sono nell'ordine di column_id dalla vista di sistema sys.columns.

È possibile controllare da:

SELECT column_id, name 
FROM sys.columns 
WHERE object_id = Object_id('MyTableName') 
ORDER BY column_id 

EDIT

Questo è per Dems. Dovresti testare su una tabella più grande, ma sembra che usi l'ordine definito nella tabella, non l'indice:

CREATE TABLE #T (cola int, colb int, colc int) 

INSERT INTO #T 
VALUES 
(1,2,3), 
(2,3,4), 
(4,5,6) 

SELECT * FROM #T 

CREATE INDEX ix_test ON #T (colb, colc, cola) 

SELECT * FROM #t 
WHERE colb > 0 

DROP TABLE #T 
+0

Precisamente quello che stavo cercando. Ottima risposta +1 – Yuck

+0

Le viste di sistema di Yuck contengono le risposte a tutte le domande di vita, devi solo sapere dove guardare! – JNK

+0

Se la tabella avesse un indice di copertura su tutti i campi, ma con i campi in un ordine diverso e quell'indice fosse utilizzato per risolvere la query, questa risposta sarebbe ancora valida? – MatBailie

3

Saranno lo stesso ordine in cui appaiono in SQL Server Management Studio; in sostanza, l'ordine in cui sono stati creati.

La soluzione "corretta" per assicurare un ordine di colonna desiderata è quella di specificare i campi in modo esplicito nell'istruzione SELECT. SELECT * non garantisce l'ordine delle colonne di output.

+1

Quindi viene da 'sys.columns'? C'era un campo chiamato "ORDINAL_POSITION", quindi avrebbe avuto senso. Ma credo che sia stato rimosso - almeno dai DMV. – Yuck

+0

@Yuck 'ORDINAL_POSITION' è ancora in' INFORMATION_SCHEMA.COLUMNS'. – GarethD