中文国产日韩欧美视频,午夜精品999,色综合天天综合网国产成人网,色综合视频一区二区观看,国产高清在线精品,伊人色播,色综合久久天天综合观看

擴(kuò)展SQL的靈活性——靜態(tài)TSQL和動(dòng)態(tài)SQL -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【www.szmdbiao.com - 電腦資料】

    其實(shí)我覺得這個(gè)博客寫在基于web的應(yīng)用程序開發(fā)是最好的,因?yàn)槟壳拔覀兒苌僭诳蛻舳藢?shí)現(xiàn)排序和過濾功能,而且很多開發(fā)采用的都是輕量級(jí)的兩層模型,所以缺少專門處理數(shù)據(jù)緩沖和過濾業(yè)務(wù),有些人會(huì)說,我們可以創(chuàng)建存儲(chǔ)過程或者嵌套復(fù)雜的控制流程塊?但是我想說,這些方案只能解決一部分問題,但是它們帶來的問題遠(yuǎn)遠(yuǎn)比我想解決的問題要多得多,

擴(kuò)展SQL的靈活性——靜態(tài)TSQL和動(dòng)態(tài)SQL

。

問題

    出現(xiàn)這個(gè)問題是在我們機(jī)房合作通過業(yè)務(wù)邏輯層來拼接字符串來優(yōu)化D層代碼的時(shí)候,但是出現(xiàn)這樣一個(gè)問題:我這里寫好了update一張表的所有字段,但是事實(shí)上傳入的實(shí)體值一般僅僅是其中的幾個(gè)字段,這就需要擴(kuò)展我們SQL的靈活性。

解決過程

    在合作中我是負(fù)責(zé)D層的,但是如何解決這個(gè)問題我還是無從下手。后來通過查詢很久的資料和論壇的提問,大體了解是關(guān)于靜態(tài)SQL和動(dòng)態(tài)SQL的方向。

1. 靜態(tài)T_SQL解決方法:

update card set cardName=isnull(@cardName,cardName),date=isnull(@date,date),Time=isnull(@Time,time),status=isnull(@status,status) where cardID=@cardID

    由上面這段代碼可以看到只是需要加上一個(gè)isnull()判斷。當(dāng)然方法不只是一個(gè),比如通過控制流的判斷,但是控制流判斷還是存在很多潛在問題,也可以用case表達(dá)式,我覺得這種方法是在優(yōu)化控制流來達(dá)到如果cardname為空時(shí)候,這個(gè)字段就保持原來數(shù)據(jù),不進(jìn)行改變。

    上面的語句問題:可讀性差。

    可以通過case表達(dá)式來優(yōu)化:

update card set cardName=case when @cardName is null then cardName else @cardName end,date=case when @date is null then date else @date end,Time=case when @Time is null then Time else @Time end,status=case when @status is null then status else @status endwhere cardID=@cardID

    這樣子的使用CASE表達(dá)式替代SQL Server中的動(dòng)態(tài)SQL語句,

電腦資料

擴(kuò)展SQL的靈活性——靜態(tài)TSQL和動(dòng)態(tài)SQL》(http://www.szmdbiao.com)。

2. 動(dòng)態(tài)SQL解決方法

    原理:拼接的SQL語句,在存儲(chǔ)過程中。

    注意:

   

    所以說一般不建議使用動(dòng)態(tài)SQL。<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:sql;">exec sp_executesql N'update card set cardName=isnull(@cardName,cardName),date=isnull(@date,date),Time=isnull(@Time,Time),status=isnull(@status,status) where cardID=@cardID',N'@cardName varchar(100),@date date,@Time time,@status varchar(30),@cardID int','test',null,null,null,'001'

    然后exec(sql)就可以了。

感悟

    關(guān)于動(dòng)態(tài)SQL知識(shí)一是我理解的不多,所以我也不大敢輕易的解讀,以后在我學(xué)習(xí)的過程中我再把我的理解寫出來;二是這對(duì)我來說是個(gè)新知識(shí),需要時(shí)間消化和吸收,需要更多的和別人討論才能決定是否運(yùn)用動(dòng)態(tài)SQL。

    另外,通過這次出現(xiàn)的問題讓我重新對(duì)sql sever有了理解,我曾經(jīng)以為我學(xué)了視圖,觸發(fā)器,就已經(jīng)差不多了,但是即使是小小的sql語句都有這么大學(xué)問,不過我覺得滿有意思的,就是因?yàn)樨S富,我每天對(duì)曾經(jīng)學(xué)過的知識(shí)才會(huì)有全新的感受。我覺得sql sever不會(huì)學(xué)完,永遠(yuǎn)都在學(xué)習(xí)中,知識(shí)也是,永遠(yuǎn)都在學(xué)習(xí)中。

最新文章