緣起:
今天在看公司資料庫的某個撈資料 procedure,從程式碼學到點東西,不過都有點瑣碎,每個都獨立拿出來講的話很浪費篇幅,所以就統一記在這篇中。
Declare 與 Set:
t sql 裡設定變數的方法,先 declare 一個變數並設定它的資料類型,再用 set 指派值。變數名稱都是以 @ 做為開頭,這好像是必要的,然後可以用 print 來把變數印出來。
我目前最常看到的變數型態就 int 跟 nvarchar,nvarchar 可以用 (數字) 來指定長度,基本上我直接把它看成 string。
QUOTED_IDENTIFIER:
今天看了這篇文章後,大概了解這東西在幹啥了。
我一樣拿 northwind 當例子,看一下那個 Customer 資料表
tsql 可以在 procedure 裡用 nvarchar 存 sql 指令,然後再用 exec (字串變數) 來執行。這裡要加括號,不然它會把那字串看成是某個 procedure 的名稱。
假設想從 Customer 資料表裡抓特定 ContactTile 的資料,我一開始會想寫成這樣
但這樣寫產生的 sql 字串會長這樣
%Owner% 的前後都少了一個 ' 把它包起來,這樣執行指定時,它不會被看成是一個字串,sql 會報錯。
想要在 sql 的字串中表示 ' 的話,要用兩個 ' 來表示。
如果我們有設定 QUOTED_IDENTIFIER off 的話,兩個 ' 就能用一個 " 來替代,程式執行時也就不會錯了。
int 轉 nvarchar:
這裡拿 Employees 資料表當例子,看一下它的結構跟資料。
假如我想寫個 tsql 程式,抓 ReportsTo = 2 的資料,直覺想到要這樣寫
我看公司的程式碼,它是用 Cast 來做轉型的,寫成這樣就能執行了
我發現,那個 CAST 裡的 nvarchar 不用指定長度,它好像會自動判斷,即使滑鼠移到它上面時,它顯示的資料型態是 nvarchar(1)。
剛剛看到 Employees 裡面的資料,有個資料的 ReportsTo 是 NULL,要怎麼靠篩選 ReportsTo 把它給篩出來 ? 我今天就有遇到類似問題,有個資料表有 flag 欄位,有設定的話是 1 ,沒設定的話可能是 0 或 NULL,用 procedure 來抓資料時,那 procedure 有傳入一個 int 參數,會用在組織 sql 查詢句的條件上。
就是.... set @sql =@sql+'and table.flag='+Cast(@int參數 as nvarchar)
這樣
假如 @int參數 是 0 ,然後資料表的 flag 欄位是 NULL 的話,條件不會成立。
這可以用 ISNULL 來解決,程式寫成
set @sql=@sql+'and ISNULL(table.flag, 0)='+Cast(@int參數 as nvarchar)
如果欄位是 null 的話,它就會回傳 0 。
我們抓 Employees 的程式也就可以寫成這樣。
我是看 Employees 裡面是沒有 ReportsTo = 0 的資料啦,如果有的話,可能要設定成其它數字,不然會把 ReportsTo = 0 的資料也一起抓出。
沒有留言:
張貼留言