2012-04-18 70 views
11

SQL Server如何确定列的顺序,当你做一个SELECT *SQL服务器选择*列名订购

我知道“排序”是订购数据必不可少的,但我预计列名是一致的。

注意:我的代码是而不是,具体取决于列返回的实际顺序。我只想知道SQL Server如何决定排列列名。

约20台电脑我的团队正在使用,其中一人的行为不同。任何差异都值得进行调查。当我们打开SQL Server Management Studio时,所有计算机的列名排序似乎都是一样的。当我们的应用程序进行查询时,当我看到差异时。

我使用SQL Server 2008和SQL Server 2008 R2。我的应用程序使用C#System.Data.SqlClient来访问数据库。

编辑: 我的问题竟然是其中一台电脑被配置为登录为'sa',而不是预期的用户。当我们打算查看视图时,查询就直接敲击表格。感谢您的帮助学习有关SYS.COLUMNS

+5

以及首先第一件事情,你应该总是指定的列,而不是使用SELECT *,那么你可以控制它 – Taryn 2012-04-18 16:51:06

+0

它是按照您在创建表 – Devjosh 2012-04-18 16:51:15

+0

@bluefeet和其他人时定义它们的顺序排列的,这不是最佳实践的问题。这是对SQL Server如何做出某些决定感到好奇的问题。 – Yuck 2012-04-18 16:52:15

回答

13

他们是在column_id从系统的角度sys.columns的顺序。

您可以通过检查:

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

编辑

这是民主党。您应该测试上更大的表,但它看起来像它使用在表中定义的顺序,而不是索引:

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

准确地说,我在找什么。很好的答案+1 – Yuck 2012-04-18 16:54:08

+0

@Yuck系统视图包含所有人生问题的答案,您只需知道在哪里看! – JNK 2012-04-18 16:54:49

+0

如果表的所有字段都有覆盖索引,但字段顺序不同,并且该索引用于解析查询,那么此答案是否仍然适用? – MatBailie 2012-04-18 17:06:41

3

他们将在它们出现在SQL Server Management Studio中的顺序相同;本质上,它们的创建顺序。

用于确保所需的列为了“正确”的解决方法是在你的SELECT语句中明确指定的字段。 SELECT *对输出列的排序不作任何保证。

+1

那么来自'sys.columns'?过去有一个名为'ORDINAL_POSITION'的字段,这样才有意义。但我相信这一点已被删除 - 至少从DMV中被删除。 – Yuck 2012-04-18 16:53:06

+0

@Yuck'ORDINAL_POSITION'仍在'INFORMATION_SCHEMA.COLUMNS'中。 – GarethD 2012-04-18 17:00:40