我真是個不認真記語法的人,
每次都很自然地寫出 RIGHT('ABCD', 2) 這種神人級的語法,
就我要從右邊取出 CD 咩!
剛剛找了一下,發現有個寫法還不錯,
SUBSTR('ABCD', -2, 2)
第二個參數可以應該可以解讀為從右邊數來第二個開始。
(自我解讀 XD)
所以如果我想取得 BC 可以用下面的寫法
SUBSTR('ABCD', -3, 2)
不過這樣的需求應該是比較少才對。
(自己為 :P)
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 @SAMPLE_TABLE
EXEC SP_OOXX
但是等到開始測試的時候跳出了錯誤訊息,
意思是說這種方式不可以巢狀呼叫!(攤)
上網查了一下可以用 Link Server 的方式去避免
Ref:INSERT EXEC 陳述式不可以是巢狀的
就是建立一個自己連到自己的 Link Server ,
霸特...(所有事情遇到霸特都是個轉則啊!)
Link Server 不支援資料表參數!(死棋)(攤)(攤)(攤)
最後只好摸摸鼻子調整程式,將 SP 改回去 UDFs.....
對,是改回去!之前因為 UDFs 不支援回傳資料表型態而改成 SP,
現在再度因為 SP 不能巢狀呼叫再度改回去!
這就是衰咖人篸啊~~~
用 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 @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 不能巢狀呼叫再度改回去!
這就是衰咖人篸啊~~~
T-SQL - 字串轉換小技巧,剔除小數位數
昨天貴公司嘆氣工程師問我一個字串轉換的問題,
因為如果將一個 DECIMAL(20, 5) 的數字轉換成 VARCHAR(20) 的話,
會出現 7500.0000 之類的,但是他只要整數的部分?
因為之前日期轉換的時候可以指定格式,
他問我這個格式要用甚麼?
說真的,我並不是那麼愛寫 SQL ,
更不會去記甚麼指定格式的參數是啥,
然後印象中.....應該只有日期才有吧?
然後就想說是不是該用 POS 之類的函數?
然後嘆氣工程師就說可是 Oracle 都有 ╮(╯3╰)╭
後來就在那邊開玩笑地說,不然用 LEFT(X, 4) 好了 XD
然後靈光乍現想說先轉成 INT 再轉成 VARCHAR 看看,果然就 ok 了。
CONVERT(VARCHAR(20), CONVERT(INT, @NUM))
因為如果將一個 DECIMAL(20, 5) 的數字轉換成 VARCHAR(20) 的話,
會出現 7500.0000 之類的,但是他只要整數的部分?
因為之前日期轉換的時候可以指定格式,
他問我這個格式要用甚麼?
說真的,我並不是那麼愛寫 SQL ,
更不會去記甚麼指定格式的參數是啥,
然後印象中.....應該只有日期才有吧?
然後就想說是不是該用 POS 之類的函數?
然後嘆氣工程師就說可是 Oracle 都有 ╮(╯3╰)╭
後來就在那邊開玩笑地說,不然用 LEFT(X, 4) 好了 XD
然後靈光乍現想說先轉成 INT 再轉成 VARCHAR 看看,果然就 ok 了。
CONVERT(VARCHAR(20), CONVERT(INT, @NUM))
標籤:
MS SQL Server 2008,
SQL 語法
訂閱:
文章 (Atom)