2012-04-18 15 views
11

W jaki sposób program SQL Server określa kolejność kolumn podczas wykonywania SELECT *?Serwer SQL Wybierz * Sortowanie nazw kolumn

wiem „porządkowania” jest niezbędna do zamawiania dane, ale spodziewałem się nazwy kolumn być spójne.

Uwaga: Mój kod to , a nie w zależności od faktycznej kolejności zwracania kolumn. Chcę tylko wiedzieć, jak SQL Server decyduje się na zamówienie nazw kolumn.

Z około 20 komputerów, z których korzysta moja drużyna, jedna z nich zachowuje się inaczej. Jakakolwiek różnica zasługuje na zbadanie. Zamawianie nazw kolumn wydaje się być takie samo dla wszystkich komputerów po uruchomieniu SQL Server Management Studio. Kiedy nasza aplikacja wysyła zapytanie, widzę różnicę.

Używam programu SQL Server 2008 i SQL Server 2008 R2. Moja aplikacja używa C# System.Data.SqlClient, aby uzyskać dostęp do bazy danych.

EDYTOWANIE: Mój problem polegał na tym, że jeden z komputerów został skonfigurowany do logowania jako "sa" zamiast zamierzonego użytkownika. Zapytanie trafiało bezpośrednio do tabeli, gdy zamierzaliśmy ją wyświetlić. Dzięki za pomoc w nauce o sys.columns

+5

dobrze pierwszych rzeczy, po pierwsze, należy zawsze określić kolumny i nie używać SELECT *, a następnie może kontrolować to – Taryn

+0

jest w kolejności w jakiejkolwiek kolejności, jaką zdefiniujesz podczas tworzenia tabeli – Devjosh

+0

@ bluefeet i innych, nie jest to kwestią najlepszej praktyki. To kwestia ciekawości, w jaki sposób SQL Server podejmuje pewne decyzje. – Yuck

Odpowiedz

13

Są one w kolejności od column_id z widoku systemu sys.columns.

Można to sprawdzić przez:

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

EDIT

To dla Dems. należy przetestować na większej tabeli, ale wygląda na to, że używa kolejności określonej w tabeli, a nie indeks:

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

Dokładnie to, czego szukałem. Świetna odpowiedź +1 – Yuck

+0

@Usoby systemowe zawierają odpowiedzi na wszystkie pytania dotyczące życia, po prostu musisz wiedzieć, gdzie szukać! – JNK

+0

Jeśli tabela zawierała indeks obejmujący we wszystkich polach, ale z polami w innej kolejności i ten indeks został użyty do rozstrzygnięcia zapytania, czy ta odpowiedź nadal byłaby prawdziwa? – MatBailie

3

Będą one tej samej kolejności, w jakiej pojawiają się w Sql Server Management Studio; zasadniczo kolejność, w jakiej zostały utworzone.

"Prawidłowym" rozwiązaniem dla zapewnienia pożądanej kolejności kolumn jest wyraźne określenie pól w instrukcji SELECT. SELECT * nie daje żadnych gwarancji dotyczących porządkowania kolumn wyjściowych.

+1

To pochodzi od 'sys.columns'? Wcześniej istniało pole o nazwie "ORDINAL_POSITION", więc miałoby to sens. Ale uważam, że został usunięty - przynajmniej z DMV. – Yuck

+0

@Iuck 'ORDINAL_POSITION' jest nadal w' INFORMATION_SCHEMA.COLUMNS'. – GarethD