2010-11-04 33 views
2

早上,SQL Server新列添加到表,但问题与选择*

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

每当我添加一个新列到表中,“SELECT *”经常返回错误的列的一些数据。

这是优化还是缓存问题?如何解决这个问题,而不必在我的存储过程中显式定义返回列名称?

谢谢!

+7

你的意思是错误的列?什么_exactly_发生?你可以添加例子吗? – Oded 2010-11-04 11:49:56

回答

4

不管你的问题,或给它一个解决方案的确切性质,我建议你不要使用Select * From Table。这效率较低 - 每次运行查询时,都会向DB发送一个额外的请求,以确定列'*'构成的确切值,然后通过特定的列信息发送适当的请求。

3

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

非常笼统地讲,SQL Server将返回列他们加入到表中的顺序,如果你执行SELECT *。如果查询中涉及多个表,它将按照它们在查询中出现的顺序返回每个表中的列。

无论缓存也不应优化影响这个服务器端,如果表中的列已经改变,所以它可能是一些代码和服务器之间发生的事情,在任何数据访问堆栈你碰巧使用。

这是它一般不推荐使用“SELECT *”在客户端代码的原因之一。

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