發表文章

目前顯示的是有「MSSQL」標籤的文章

OpenRowSet和OpenQuery的問題

這次遇上的問題是,每當執行EXE [某個SP] 時, 程式會告訴你說沒有資料行或是沒有權限。 可是到了目標的SQL Server查了一下,對方的確有開OpenRowSet的權限, 換句話說問題不是出在權限開關那邊。 於是上網查了一下,發現只要在原本的連線字串裡面, 多加兩個指令就能搞定,分別是… SET NOCOUNT OFF SET FMTONLY ON 設定之後就能如預期那樣用SP查出東西了。 但值得注意的是,SET FMTONLY被列入不使用名單, 換句話說,往後新版本的MSSQL可能就會沒有這個指令, 可能的話還是用新指令去替換吧。

欄位資料切分與資料列增生

圖片
如果遇上一張表內的某個欄位儲存了多種狀態,而好死不死的這張表偏偏又是主要資料, 許多欄位不能隨意捨棄時,可以試試看這種做法。 起初的想法就是將欄位內的多筆狀態紀錄切開。 但是切開是切開了,那只是主要Table的其中一個Row啊! 天殺的還有千千萬萬個Row等著處理, 更麻煩的是,就算全切開了,其他欄位也跟人間蒸發, 想要Join找不到欄位Join,就像想吃火鍋端上來的偏偏都是刨冰。 於是就有了「既然要切開,那乾脆把切出來的這個數值掛上名牌」的想法, 如此一來就能知道這個被硬生生拆散的狀態數值的爸媽是誰。 上圖就是切分增生完的狀態。 主要資料表雖然資料量變多了,但資料欄位完整。 這種作法不知道有沒有正統的名稱,抑或根本沒人會這麼作, 但是客官就是要統計資料「鉅細靡遺」,大項也要細目也要, 在當下這顆菜比巴的腦袋裡只想得出這種方法,時間有限,就先這樣幹囉。 要做到這種效果,這裡使用的方法是找一段可以作出Split效果的Function。 這個Function在切分完欄位內的後,回傳的是Table型態,欄位為一個流水號和被切分出的值。 之後在預存程序裏面開始處理主要的Table。 只要利用迴圈和簡單的判斷式子就能作出這種效果, 之後要再Join其他Table也會比較順利,不怕沒欄位可以Join回去。