一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - SQL實現遞歸及存儲過程中In()參數傳遞解決方案詳解

SQL實現遞歸及存儲過程中In()參數傳遞解決方案詳解

2020-01-13 13:17MSSQL教程網 Sql Server

這篇文章詳細介紹了SQL實現遞歸及存儲過程中In()參數傳遞解決方案,有需要的朋友可以參考一下

1.SQL遞歸

在SQL Server中,我們可以利用表表達式來實現遞歸算法,一般用于阻止機構的加載及相關性處理。

-->實現:

假設OrganiseUnit(組織機構表)中主要的三個字段為OrganiseUnitID(組織機構主鍵ID)、ParentOrganiseUnitID(組織機構父ID)、OrganiseName(組織機構名稱)

復制代碼代碼如下:


with organise as
(select * from OrganiseUnit where OrganiseUnit.OrganiseUnitID = @OrganiseUnitID 
union all select OrganiseUnit.* from organise, OrganiseUnit 
where organise.OrganiseUnitID = OrganiseUnit.ParentOrganiseUnitID)

 

select OrganiseName from organise


上述sql語句實現了, 傳入組織機構主鍵ID,查詢出其對應組織機構名稱和其 全部下級組織機構名稱。

 

2.存儲過程中 In 參數傳遞

-->情景

① 通過剛才的SQL遞歸方式,我們已經可以將一個組織機構和其全部下級單位查詢出來;假設每個組織機構還有一個字段為OrganiseCode(組織機構代碼);

② 當我們需要按照組織機構代碼進行篩選數據時,我們會用到 In 這個查詢條件,例如select * from OrganiseUnit where OrganiseCode in ('10000001','10000003','10000002')

③但是in()中條件不可能總是固定不變的,有時我們需要用參數傳遞進去;我們可能會想到設定一個變量參數@OrganiseCode,然后按照'10000001','10000003','10000002'的格式拼參數不就行了嗎 ?

④in使用參數時會強制轉換參數類型與條件字段一致,不支持構造字符串(如果字段本身為varchar、char型,則in相當于只有一個條件值,而不是一組)

-->實現

①可以使用exec,把整個sql當做參數來執行,例如:exec ('select * from OrganiseUnit where OrganiseCode in ('+@OrganiseCode+')');這樣存儲過程修改復雜,沒有防注功能。

②我們采用另一種方案來解決,先寫一個SQL函數,功能是分割字符串

復制代碼代碼如下:

create  function  SplitIn(@c   varchar(2000),@split   varchar(2))   
returns   @t   table(col   varchar(20))   
as   
begin    
  while(charindex(@split,@c)<>0)   
    begin   
      insert   @t(col)   values   (substring(@c,1,charindex(@split,@c)-1))   
      set   @c   =   stuff(@c,1,charindex(@split,@c),'')   
    end   
  insert   @t(col)   values   (@c)   
  return   
end  


我們為這個函數傳入字符串和分隔符,他就能將字符串按指定符號分割并作為查詢結果返回。

 

例如:執行select col from SplitIn('10000001,10000002,10000003',',')

返回:

10000001

10000002

10000003

③有了這個函數,我們就有了新的解決方案了

定義參數@OrganiseCode,為其傳入字符串,這個參數由一個或多個OrganiseCode構成,中間用“,”分割;

調用方式:select * from OrganiseUnit where OrganiseCode in (select col from SplitIn(@OrganiseCode,','))

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 69老司机亚洲精品一区 | 亚洲欧美一 | 亚洲AV永久无码精品老司机蜜桃 | 91精品国产高清久久久久久io | 厕所rxxx | 国产欧美日韩精品一区二区三区 | 国产综合成人久久大片91 | 第一次做m被调教经历 | 97热在线| 日韩视频在线精品视频免费观看 | 国色天香视频资源网 | 好大好硬好长好爽a网站 | 国产成人在线免费观看 | 久久噜国产精品拍拍拍拍 | 四虎免费在线观看视频 | 我与旗袍老师疯狂床震 | 国产一卡2卡3卡四卡高清 | 久久精品久久久久 | 亚洲精品一区制服丝袜 | 成年美女黄网站色视频大全免费 | 亚洲成色爱我久久 | jzzjzz视频免费播放 | 香蕉91xj.cc | 五月婷婷俺来也 | 99在线精品免费视频 | 久久xxxx| 天堂a免费视频在线观看 | 亚洲欧美专区精品久久 | 国产精品久久久久久 | 精品日韩视频 | 日韩成人一区ftp在线播放 | 国产玖玖在线观看 | 美女被灌浣肠失禁视频 | 视频一区 日韩 | 99综合视频 | 成人免费在线视频观看 | 国产精品久久久久a影院 | 91精品国产免费久久 | 亚洲色欲色欲综合网站 | 91美女在线 | 亚洲精品视频一区 |