sql >> データベース >  >> RDS >> Sqlserver

IN パラメータを使用した手順

    あなたのスキルセットに基づいてこれを行う 2 つの方法。

    <オール> <リ>

    SQL CLR 関数を作成できます。

    [Microsoft.SqlServer.Server.SqlFunction(Name="fnToList", FillRowMethodName="FillRow", TableDefinition="ID NVARCHAR(1000)")]
    public static IEnumerable SqlArray(SqlString inputString, SqlString delimiter)
    {
        if (string.IsNullOrEmpty(delimiter.Value))
            return new string[1] { inputString.Value };
        return inputString.Value.Split(delimiter.Value.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    }
    
    public static void FillRow(object row, out SqlString str)
    {
        str = new SqlString((string)row);
    }
      
      

    または...通常の SQL 関数を作成することもできます:

    CREATE FUNCTION [dbo].[fnArray] ( @Str varchar(8000), @Delim varchar(1) = ' ' )
    returns  @tmpTable table ( arrValue varchar(25))
    as
    begin
       declare @pos integer
       declare @lastpos integer
       declare @arrdata varchar(8000)
       declare @data varchar(25)
    
       set @arrdata = replace(replace(replace(replace(upper(@Str),@Delim,'|'),'-',''),'/','|'),'\','|')
       set @arrdata = @arrdata + '|'
       set @lastpos = 1
       set @pos = 0
       set @pos = charindex('|', @arrdata)
       while @pos <= len(@arrdata) and @pos <> 0
       begin
          set @data = substring(@arrdata, @lastpos, (@pos - @lastpos))
          if rtrim(ltrim(@data)) > ''
          begin
             if not exists( select top 1 arrValue from @tmpTable where arrValue = @data )
             begin   
                insert into @tmpTable ( arrValue ) values ( @data )
             end
          end
          set @lastpos = @pos + 1
          set @pos = charindex('|', @arrdata, @lastpos)
       end
       return 
    end
      

    次に使用します:

    SELECT * From Mydatabase Where Names in (select arrValue from dbo.fnArray(@Names, ','))
      


    1. バックエンドパフォーマンスの改善パート2/3:データベースインデックスの使用

    2. 複数の動作を持つクエリを作成する方法

    3. Oracle11gで実際の実行計画を取得する

    4. PDOを使用したpostgresでの自動ロールバック