搜尋此網誌

2023年5月17日 星期三

2023/5/17 學到的一些 sql 知識

緣起:


    今天在看公司資料庫的某個撈資料 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 的資料,直覺想到要這樣寫


    但這樣寫 sql 會報錯

    

    我看公司的程式碼,它是用 Cast 來做轉型的,寫成這樣就能執行了


    我發現,那個 CAST 裡的 nvarchar 不用指定長度,它好像會自動判斷,即使滑鼠移到它上面時,它顯示的資料型態是 nvarchar(1)。



ISNULL:


    剛剛看到 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 的資料也一起抓出。

沒有留言:

張貼留言