我有一个旧观点,当我查询它时会发出一些奇怪的数据。它的两个列C和D分别具有来自A列和B列的数据副本。所以C有一份A的数据,而D有一份B的数据。当我提取视图使用的查询并独立运行时,一切都很好。列A,B,C和D具有我期望看到的数据。当我查看视图定义时,我注意到它有一些通配符(*)用于列选择,如下所示:
SELECT
TableX.*,
TableY.*
FROM
X AS TableX INNER JOIN
Y AS TableY ON TableX.PK = TableY.FK
我被告知从不出于其他各种原因在视图中使用通配符,但我想知道为什么它有这种效果?我注意到,当我重新创建视图并在视图上运行select查询时,一切都很好。其中一位高级开发人员告诉我,问题出现是因为Sql Server的一些缓存,但我希望得到更详细的答案。
答案 0 :(得分:4)
一个原因很糟糕,因为如果TableX和TableY具有相同的列名,那么您的结果中会出现列名冲突。
另一个原因是你应该只拉你需要的列。如果表有75列而你只需要4列,那么你需要提取大量不必要的数据,并且必须通过线路将额外的数据发送到客户端应用程序,这样会影响性能。
答案 1 :(得分:2)
来自联机丛书:
如果未使用创建视图 SCHEMABINDING子句,sp_refreshview 应该在进行更改时运行 视图底层的对象 影响视图的定义。 否则,视图可能会产生 查询时出现意外结果。
答案 2 :(得分:1)
答案 3 :(得分:1)
如果要将新列添加到表中,您将加载其他(可能不需要的数据)列。
答案 4 :(得分:0)
如果您选择已使用的名称,则可以通过添加新列来中断随机代码。
将自动从应用程序的随机部分中的数据库中检索新列,以便将其丢弃。即使他们是一个巨大的BLOB。
您无法轻松找到代码中某些列的使用位置。