Sql-Server

SELECT * 在生產程式碼中有什麼好的案例?

  • January 3, 2020

出於習慣,我從不SELECT *在生產程式碼中使用它(我只將它用於臨時廢料查詢,通常是在學習對象的模式時)。但是我現在遇到了一個案例,我很想使用它,但如果我這樣做會覺得很便宜。

我的案例是在儲存過程中創建本地臨時表,該表應始終與用於創建它的基礎表匹配,只要儲存過程執行。臨時表是稍後填充的,因此快速創建臨時表而不是冗長的方法SELECT * INTO #TempTable FROM RealTable WHERE 1 = 0尤其適用於具有數百列的表。

如果我的儲存過程的使用者不知道動態結果集,那麼我將服務出售給 是否有任何問題SELECT *

我通常在生產程式碼中厭惡 SELECT *,並且我一直處於使用它導致以後大量返工的情況。不過,您的案例確實看起來很合理。

我發現 SELECT * 是必須的地方 - 以及它的邪惡表親“INSERT INTO tbl”沒有列列表 - 處於歸檔情況,其中行被移動到另一個必須具有相同結構的表中。

INSERT INTO SalesOrderArchive  -- Note no column list
SELECT *
 FROM SalesOrder
WHERE OrderDate < @OneYearAgo

DELETE FROM SalesOrder
WHERE OrderDate < @OneYearAgo

如果將來將新列添加到 SalesOrder,但未添加到 SalesOrderArchive,則 INSERT 將失敗。這聽起來很糟糕,但它實際上是一件非常好的事情!因為替代方案更糟糕。如果所有列都列在 INSERT 和 SELECT 上,那麼 INSERT 會成功,下面的 DELETE 也會成功(實際上是“DELETE *”)。成功的生產程式碼不會引起任何注意,並且可能需要很長時間才能有人注意到新列沒有被歸檔,而是被完全刪除。

引用自:https://dba.stackexchange.com/questions/253873