【问题标题】:How does SQL Server determine the order of the columns when you do a `SELECT *`?当您执行“SELECT *”时,SQL Server 如何确定列的顺序?
【发布时间】:2012-04-18 16:49:28
【问题描述】:

当您执行SELECT * 时,SQL Server 如何确定列的顺序?

我知道“排序依据”对于排序 数据 至关重要,但我希望 列名 保持一致。

注意:我的代码取决于返回列的实际顺序。我只想知道 SQL Server 是如何决定对列名进行排序的。

在我的团队使用的大约 20 台计算机中,其中一台表现不同。任何差异都值得研究。当我们打开 SQL Server Management Studio 时,所有计算机的列名排序似乎都是相同的。当我们的应用程序进行查询时,我就看到了差异。

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

编辑: 我的问题原来是其中一台计算机被配置为以“sa”身份登录,而不是预期用户。当我们打算让它命中视图时,查询直接命中了表。感谢您帮助了解 sys.columns

【问题讨论】:

  • 首先,您应该始终指定列而不使用SELECT *,然后您可以控制它
  • 按照您在创建表格时定义的顺序排列
  • @bluefeet 和其他人,这不是最佳实践问题。这是一个关于 SQL Server 如何做出某些决定的好奇问题。
  • @bluefeet 虽然我在很大程度上同意你的观点,但给出这样的陈述的理由或提供解释它的链接会更有帮助。像几乎所有规则一样,也有例外,为什么不使用 select * from a temporal table that only contains the required and no others, or from a view?
  • @Devjosh - 这不是真的。之后可以更改顺序。

标签: sql sql-server-2008 sql-server-2008-r2


【解决方案1】:

从系统视图sys.columns来看,它们的顺序是column_id

您可以通过以下方式查看:

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

【讨论】:

  • 正是我想要的。很好的答案 +1
  • @Yuck 系统视图包含所有生活问题的答案,你只需要知道在哪里看!
  • 如果表在所有字段中都有一个覆盖索引,但字段顺序不同,并且该索引用于解析查询,那么这个答案是否仍然成立?
  • @Dems 覆盖如INCLUDEd 或关键列?
  • 好吧,要么真的。只是想知道我是否可以在工作中扔一个扳手:)魔鬼的拥护者;)
【解决方案2】:

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

确保所需列顺序的“正确”解决方案是在 SELECT 语句中明确指定字段。 SELECT * 不保证输出列的顺序。

【讨论】:

  • 那来自sys.columns?曾经有一个名为ORDINAL_POSITION 的字段,所以这是有道理的。但我相信它已被删除 - 至少从 DMV 中删除。
  • @Yuck ORDINAL_POSITION 仍在INFORMATION_SCHEMA.COLUMNS
猜你喜欢
  • 2014-11-12
  • 2023-03-13
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多