SQL Server新列添加到表但Select *的问题

时间:2010-11-04 11:47:05

标签: sql sql-server sql-server-2005 tsql

上午,

我有一个存储过程从表中返回'SELECT *'。

每当我向表中添加一个新列时,'SELECT *'通常会返回错误列中的一些数据。

这是优化还是缓存问题?如何在不必在存储过程中显式定义返回列名的情况下解决此问题?

谢谢!

3 个答案:

答案 0 :(得分:4)

无论问题的确切性质或解决方案如何,我都建议您不要使用Select * From Table。这效率较低 - 每次运行查询时,都会向DB发送一个额外的请求,以确切确定哪些列'*'构成,然后发送带有特定列信息的正确请求。

答案 1 :(得分:3)

问题的原因可能取决于您正在使用的客户端堆栈。

一般来说,如果执行SELECT *,SQL Server将按照它们添加到表中的顺序返回列。如果查询中涉及多个表,它将按照它们在查询中出现的顺序从每个表中返回列。

如果表列已更改,缓存和优化都不应影响此服务器端,因此可能是您的代码与服务器之间发生的事情,无论您正在使用何种数据访问堆栈。

这是一般建议不要在客户端代码中使用“SELECT *”的原因之一。

答案 2 :(得分:1)

避免此问题的最佳方法是让存储过程返回一组预定义的列(SELECT a, b而不是SELECT *),并使用表连接来检索其余代码。由于存储过程不能成为查询的一部分,因此您可以将存储过程重构为table-valued user-defined functio n并对其执行连接:

SELECT f.a, f.b, t.*
FROM dbo.fn_YourFunction('a', 'b') f
INNER JOIN YourTable t ON f.id = t.id