2014年5月6日 星期二

T-SQL - 自定義資料表型態三兩事

最近忙著用 SQL 寫法規,需要將資料表傳來傳去的,
用 temp table 是另外一件事情,這邊不討論。
由於一開始也沒資料可以測試,
所以都是先閉著眼睛寫 UDFs, SP ...
因為簡化程式,所以開始使用 UDTs

CREATE TYPE SAMPLE_TABLE_TP AS TABLE (
   ACC_DT DATETIME,
   FUND_ID NVARCHAR(20));

以便在程式裡面可以縮減程式以

DECLARE @SAMPLE_TABLE AS SAMPLE_TABLE_TP;

去取代

DECLARE SAMPLE_TABLE TABLE (
   ACC_DT DATETIME,
   FUND_ID NVARCHAR(20));

當然啦!正所謂一懶還有一懶懶!
所以就開始在 UDFs 跟 SP 裡面將 TABLE TYPE 傳來傳去的,
等到正式開始有資料測試的時候發現幾項限制:

UDFs 可以接收的參數可以是 TABLE TYPE,如下:

CREATE FUNCTION FN_TEST (
   @SAMPLE_TABLE AS SAMPLE_TABLE_TP READONLY,

也可以 RETURNS TABLE,但是不能 RETURNS TABLE TYPE
所以可以這樣寫

RETURNS @RTN_TABLE TABLE (  
   ACC_DT DATETIME,
   FUND_ID NVARCHAR(20))

但是沒有辦法寫成這樣

RETURNS SAMPLE_TABLE_TP

如果寫成這樣,會有錯誤訊息,會說要回傳的是一個純量的變數。
但是可以變通的在 Func 裡面利用

DECLARE @SAMPLE_TABLE AS SAMPLE_TABLE_TP;

INSERT INTO @RTN_TABLE
   SELECT * FROM @SAMPLE_TABLE

這樣中間就可以搞出很多變化。

另外上次說可以用

INSERT INTO @SAMPLE_TABLE
   EXEC SP_OOXX

但是等到開始測試的時候跳出了錯誤訊息,
意思是說這種方式不可以巢狀呼叫!(攤)
上網查了一下可以用 Link Server 的方式去避免
Ref:INSERT EXEC 陳述式不可以是巢狀的
就是建立一個自己連到自己的 Link Server ,
霸特...(所有事情遇到霸特都是個轉則啊!)
Link Server 不支援資料表參數!(死棋)(攤)(攤)(攤)

最後只好摸摸鼻子調整程式,將 SP 改回去 UDFs.....
對,是改回去!之前因為 UDFs 不支援回傳資料表型態而改成 SP,
現在再度因為 SP 不能巢狀呼叫再度改回去!
這就是衰咖人篸啊~~~

沒有留言:

張貼留言