SQLは再帰的及び記憶中のIn()パラメータ伝達ソリューションを実現する。


1.SQL再帰
SQL Serverでは、一般的に機構の負荷と相関処理を阻止するために表式を用いて再帰的アルゴリズムを実現することができます。
-->実装:
OrganiseUniit(組織機構テーブル)の主な3つのフィールドがOrganiseUnityID(組織機構主キーID)、PartentOrganiseUnityID(組織父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('100000 1'、'100000 3'、'100000 0002')
③ただし、in()の条件は常に一定で不変であることは不可能であり、時にはパラメータで伝達する必要がある。変数パラメータ@OrganiseCodeを設定して、「100000 1」、「100000 000 3」、「100000 0002」の形式でパラメータをつづればいいじゃないですか?
④inパラメータを使用すると強制的に変換パラメータタイプが条件フィールドと一致します。文字列の構成はサポートされていません。(フィールド自体がvarhar、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 SplityIn('100000 1,100000 2,100000 3',',')を実行します。
戻り値:
100000 1
100000 2
100000 3
③この関数があれば、新しい解決策ができます。
パラメータ@OrganiseCodeを定義し、その着信文字列のために、このパラメータは一つ以上のOrganiseCodeからなり、中間は「,」で分割されます。
呼び出し方式:select*from OrganiseUnit where OrganiseCode in(select col from SplityIn(@OrganiseCode、'))