2010-11-17 51 views
2

我有一個古老的觀點,當我查詢它時會發出一些奇怪的數據。其中的兩列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 

有人告訴我從來沒有在視圖中其他各種原因使用通配符,但我不知道爲什麼它這種影響?我注意到,當我重新創建視圖並在視圖上運行選擇查詢時,一切正常。其中一位高級開發人員告訴我,由於Sql Server做了一些緩存而出現問題,但我希望能有更詳細的答案。

+0

我同意你應該只拉你需要的列的規則。我理解這背後的推理。我剛剛在處理別人的舊查詢,並想了解實際發生的問題以便使問題出現。我完全打算修復它以顯式設置列。 – skeletank 2010-11-17 22:31:45

回答

2

從聯機叢書:

如果視圖不與 SCHEMABINDING子句創建,更改時 提出的觀點背後的對象sp_refreshview 應該運行 影響視圖的定義。 否則,查詢時查看可能會產生意想不到的結果 。

1
  • 未定義。如果您將依賴特定的列順序,您將得到不可預知的結果。
4

其中一個原因很糟糕,因爲如果TableX和TableY具有相同的列名稱,那麼在結果中將出現列名衝突。

另一個原因是因爲你應該只拉你需要的列。如果表格有75列,而您只需要4列,那麼您需要的大量不必要的數據,而且額外的數據必須通過線路發送到您的客戶端應用程序,因此可能會影響性能。

+0

由於表別名的原因,SQL中不會出現模糊的列引用錯誤。但是如果您按列引用結果集,則會在應用程序代碼(IE:Java)中使用。 – 2010-11-17 22:49:37

1

如果新列將被添加到表中,您將加載額外的(可能不需要的數據)列。

0
  1. 如果您選擇已使用的名稱,則可以通過添加新列來破壞隨機代碼。

  2. 新的列將被自動從數據庫中檢索到,在您的應用程序的隨機部分只是被丟棄。即使他們是一個巨大的BLOB。

  3. 你沒有簡單的方法來找出你的代碼在哪裏使用某個列。