2012-04-18 37 views
11

¿Cómo determina SQL Server el orden de las columnas cuando hace un SELECT *?Seleccionar servidor SQL * Ordenar nombre de columna

sé "Orden Por" es esencial para el ordenamiento de los datos, pero espera que los nombres de columna ser consistente.

Nota: Mi código es no según el orden real en que se devuelvan las columnas. Solo quiero saber cómo SQL Server decide ordenar los nombres de las columnas.

De las aproximadamente 20 computadoras que usa mi equipo, una de ellas se comporta de manera diferente. Cualquier diferencia merece ser investigada. El pedido de nombre de columna parece ser el mismo para todas las computadoras cuando abrimos SQL Server Management Studio. Cuando nuestra aplicación hace una consulta es cuando veo la diferencia.

Estoy usando SQL Server 2008 y SQL Server 2008 R2. Mi aplicación usa C# System.Data.SqlClient para acceder a la base de datos.

EDIT: Mi problema resultó ser que uno de los equipos estaba configurado para iniciar sesión como 'sa', en lugar del usuario previsto. La consulta estaba golpeando la mesa directamente cuando intentamos golpear una vista. Gracias por la ayuda aprendiendo sobre sys.columns

+5

bien lo primero es lo primero, siempre se debe especificar las columnas y no utilizar SELECT *, entonces puede controlarlo – Taryn

+0

está en el orden en el orden en que los defina al crear la tabla – Devjosh

+0

@bluefeet y otros, esto no es una cuestión de mejores prácticas. Es una cuestión de curiosidad sobre cómo SQL Server toma ciertas decisiones. – Yuck

Respuesta

13

Son del orden de column_id desde la vista del sistema sys.columns.

Puede comprobarlo por:

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

EDITAR

Esto es para los demócratas. Debe probar en una mesa grande, pero todo apunta a que utiliza el orden definido en la tabla, no el índice:

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 lo que estaba buscando. Gran respuesta +1 – Yuck

+0

Las vistas del sistema @Yuck contienen las respuestas a todas las preguntas sobre la vida, ¡solo tiene que saber dónde mirar! – JNK

+0

Si la tabla tenía un índice de cobertura en todos los campos, pero con los campos en un orden diferente, y ese índice se utilizó para resolver la consulta, ¿esta respuesta seguiría siendo cierta? – MatBailie

3

Tendrán el mismo orden en el que aparecen en Sql Server Management Studio; esencialmente, el orden en que fueron creados.

La solución "correcta" para garantizar el orden de una columna deseada es especificar los campos explícitamente en su instrucción SELECT. SELECT * no garantiza el orden de las columnas de salida.

+1

¿Y eso viene de 'sys.columns'? Solía ​​haber un campo llamado 'ORDINAL_POSITION' por lo que habría tenido sentido. Pero creo que eso fue eliminado, al menos del DMV. – Yuck

+0

@Yuck 'ORDINAL_POSITION' aún se encuentra en' INFORMATION_SCHEMA.COLUMNS'. – GarethD

Cuestiones relacionadas