台灣最大程式設計社群網站
線上人數
686
 
會員總數:245598
討論主題:189304
歡迎您免費加入會員
討論區列表 >> MS SQL >> 自訂函數, 傳回不同table
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
自訂函數, 傳回不同table
價值 : 300 QP  點閱數:3177 回應數:10

樓主

zl3dk4
初學者
80 6
601 22
發送站內信

請問自訂函數可以根據條件傳回不同的table嗎, 類似以下這樣, 但以下的語法是不可行的

本篇文章發表於2013-11-19 16:03
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

凱爾
捐贈 VP 給 凱爾 檢舉此回應


or 使用Temp Table

http://kyleshen616.blogspot.tw/2013/10/ms-sqltemp-tableifelse-if_29.html
本篇文章回覆於2013-11-19 16:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

zl3dk4
檢舉此回應
不好意思, 有沒有辦法直接返回, 而不是再新增至暫存資料表再返回, 因為資料量有時候不小
本篇文章回覆於2013-11-19 19:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

SAM
捐贈 VP 給 SAM 檢舉此回應
可否請教此需求是怎麼產生的?
本篇文章回覆於2013-11-19 19:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

凱爾
捐贈 VP 給 凱爾 檢舉此回應
那有沒有考慮將兩Table union 或 join 起來在where 篩選呢?

請參考
http://stackoverflow.com/questions/5544269/tsql-if-else-statement-inside-table-valued-functions-cant-go-through
本篇文章回覆於2013-11-19 19:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

zl3dk4
檢舉此回應
to SAM

會有此需求的原因是, 我設定了幾張view, 結構都一樣, 僅篩選條件不一樣

使用者不同的查詢條件會使用不同的view
以下是我寫法

If @Status =1
Select * From ViewForStatus1 Where ...一堆
Else If @Status = 2
Select * From ViewForStatus2 Where ...一堆
Else If @Stauts = 3
Select * From ViewForStatus3 Where ...一堆
Else
Select * From ViewForStatus4 Where ...一堆
End

這樣重覆程式碼的就很多, 所以我才有這樣的需求, 因為sql本身還在學習中, 所以有些需求聽起人感覺很怪, 請見諒~
本篇文章回覆於2013-11-19 20:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

凱爾
捐贈 VP 給 凱爾 檢舉此回應
所以我想你的用意是每次使用者都傳不同的參數,那你要不要考慮所有條件合併,篩選條件可以這樣寫:



這是我之前寫的一個小方法,也可在傳參數時給他預設值 ^^"
本篇文章回覆於2013-11-19 20:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

pilipala
檢舉此回應

這樣重覆程式碼的就很多, 所以我才有這樣的需求,


要利用自訂函數來達到原 PO 需求,1F 作法多重陳述式資料表值函式 (multi-statement table valued function) 就是正解

MSDN CREATE FUNCTION http://technet.microsoft.com/zh-tw/library/ms186755.aspx
中的範例 C.建立多重陳述式資料表值函式 也可以參考


因為資料量有時候不小


擔心效能的問題,請利用 Temp Table,因為資料表值參數(簡稱 TVP)本身沒有 Statistics (統計資訊),Query Optimizer 對於 Cardinality (基數) 的估計不準確,資料量大或要跟其他 Table 進行 JOIN,效能上會有問題,另 Temp Table 相較 TVP 最大的優點是可以建立 Index


and (A = @A or ISNULL(@A,'') = '')


4F 連接網址的解答和 6F 提供的 T-SQL WHERE 語法,在有建立適當索引的情提下,有很高的可能性,會導致 Query Optimizer 使用 Index Scan 而不是 Index Seek 來搜尋資料,無法使用到索引,建議寫 T-SQL 語法時,不要在 WHERE 中寫動態判斷條件語法
本篇文章回覆於2013-11-20 15:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

凱爾
捐贈 VP 給 凱爾 檢舉此回應
謝謝p大,受教了 :P , 不過原PO問題不知道解決了沒?
本篇文章回覆於2013-11-20 16:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

SAM
捐贈 VP 給 SAM 檢舉此回應

我設定了幾張view, 結構都一樣, 僅篩選條件不一樣

使用者不同的查詢條件會使用不同的view
以下是我寫法

If @Status =1
Select * From ViewForStatus1 Where ...一堆
Else If @Status = 2
Select * From ViewForStatus2 Where ...一堆
Else If @Stauts = 3
Select * From ViewForStatus3 Where ...一堆
Else
Select * From ViewForStatus4 Where ...一堆
End


首先抱歉我忘了此版問的是sql的版了,所以您後面where查詢條件一堆都會是寫死的嗎?
不需要前端再傳什麼參數?
本篇文章回覆於2013-11-20 20:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

zl3dk4
檢舉此回應
我的where 後面, 用的類似 凱爾 所寫的那樣

現在還是沒有解決~

本篇文章回覆於2013-11-21 09:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.