2011-12-08 79 views
1

我正在切換某些sql邏輯在應用程序中通過多次來回數據庫調用處理sql存儲過程和函數,因此一次調用可以完成以前許多工作。表列函數混合列

這種邏輯的大部分要求在不同的數據子集之間進行連接,因此我將這些邏輯嵌入到函數中以便於加入。這個過程很順利,但是現在這些功能似乎有點瘋狂,開始混淆我的列。我認爲這是由於修改的結果而發生的,因爲我在進一步開發應用程序時進一步提高了堆棧,但是我不確定。

以下是與語言鎖定有關的列規範。

Column spec

而且下面是從混合起來列苦難的功能。它使用更爲複雜的邏輯調用另一個函數,所以我不會打擾發佈,而是直接調用該函數的結果。

Function spec

最後一個查詢,以兩個有問題的功能,以及使用作爲數據源的內部函數的結果。源函數正確地返回數據,但來自另一個函數的select *會導致數據完全混合,這顯然會導致線下的邏輯完全失敗。

Function results

任何想法,這到底是怎麼回事?是否因爲我懷疑其他變化的結果?如果是這樣,有沒有一種方法可以級聯?

感謝

編輯進一步檢查發現有問題的功能缺失兩列到左邊,儘管SELECT *

+0

名稱在您的查詢中選擇列被忽視的變化。如果你給他們起名,他們會(a)總是按照你定義的順序返回,並且(b)當基礎數據源發生變化時(即你的缺失列/重命名列將立即顯而易見),乾淨地打破。 – tvanfosson

+0

這不是列的順序,而是數據。一個位域中有一個VARCHAR。看看兩個結果集之間的IsLanguageLocked – Hawxby

回答

8

您可能需要使用sp_refreshsqlmodule修復的元數據。最有可能的是,你已經刪除並重新創建了底層函數,而不會對調用函數做同樣的操作。

除此之外,一對夫婦的其他東西要記住的:

  • 切勿使用SELECT *;始終命名列
  • 考慮使用WITH SCHEMABINDING以避免潛在的功能
+0

優秀的答案,似乎是這樣。謝謝! – Hawxby