SQL實現遞迴及預存程序中In()參數傳遞解決方案[轉]

來源:互聯網
上載者:User

標籤:http   io   ar   color   使用   sp   資料   on   div   

SQL實現遞迴及預存程序中In()參數傳遞解決方案 1.SQL遞迴在SQL Server中,我們可以利用表運算式來實現遞迴演算法,一般用於阻止機構的載入及相關性處理。 -->實現:假設OrganiseUnit(組織機構表)中主要的三個欄位為OrganiseUnitID(組織機構主鍵ID)、ParentOrganiseUnitID(組織機構父ID)、OrganiseName(組織機構名稱)?
1234567 [sql] 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 (‘[email protected]+‘)‘);這樣預存程序修改複雜,沒有防注功能。②我們採用另一種方案來解決,先寫一個SQL函數,功能是分割字串?
12345678910111213 [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‘,‘,‘)返回:100000011000000210000003③有了這個函數,我們就有了新的解決方案了定義參數@OrganiseCode,為其傳入字串,這個參數由一個或多個OrganiseCode構成,中間用“,”分割;調用方式:?
1 select * from OrganiseUnit where OrganiseCode in (select col from SplitIn(@OrganiseCode,‘,‘))

 

SQL實現遞迴及預存程序中In()參數傳遞解決方案[轉]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.