2014年4月15日 星期二

T-SQL - Stored Procedure 回傳 Table 怎麼接?


一直以為回傳 Table 是 UDFs 的專利,
最近因為很不幸的接了一坨【屎】,又重拾 T-SQL 寫東西,
然後因為太久沒寫 T-SQL,又沒有資料可以看,
所以就感覺好像在寫 pseudo code 一般,
先避著眼睛寫,感覺先對了,先不管語法對不對的問題。

等到要把 pseudo code 包成 UDFs 的時候才發現.....
忘了 UDFs 不可以下 UPDATE 了 .....又中招了!
所以只好切一切,把 INSERT, UPDATE 包在 SP 裡面,
不過我還是要回傳 @資料表 啊!
不想再回實體資料表去查,這樣效能應該會比較差,<--非常心虛的說應該
雖然這邊應該是沒有在管的,不過個人是做口碑的.....<--口碑很重要,但是做死自己不應該
再又一陣亂寫的狀況下,居然也沒錯誤訊息!
很心虛的又測試了一下,發現好像真的可以這樣用,
特寫此篇以茲紀念~~~

簡單的說就是
1.宣告一個 @資料表 去接 SP 回傳的資料表。
2.@資料表的 Schema 要跟 SP 回傳的資料表一模模一樣樣。
3.用 INSERT INTO @資料表 EXEC 的方式去呼叫 SP。
4.SP 回傳的可以直接用 SELECT 出來就可以。

--1+2
DECLARE @TMP_LIST TABLE (
   order_dt DATETIME,
   product_name NVARCHAR(20));

--3 重點是這個
INSERT INTO @TMP_LIST
EXEC SP_GET_TMP_LIST @set_dt , @user_id;

--4
CREATE PROC SP_GET_TMP_LIST
   @set_dt DATETIME,
   @user_id NVARCHAR(20)
AS
   SELECT order_dt, product_name FROM ORD 
      WHERE SET_DT = @set_dt AND USER_ID = @user_id;
GO

就這樣~

btw 為什麼一堆人聽不懂 schema ?到底......

1 則留言: