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

カンマ区切りの値を区切り、SQLサーバーのテーブルに保存します

    次のような分割関数を作成する必要があります:

    create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
    returns @temptable TABLE (items varchar(MAX))       
    as       
    begin      
        declare @idx int       
        declare @slice varchar(8000)       
    
        select @idx = 1       
            if len(@String)<1 or @String is null  return       
    
        while @idx!= 0       
        begin       
            set @idx = charindex(@Delimiter,@String)       
            if @idx!=0       
                set @slice = left(@String,@idx - 1)       
            else       
                set @slice = @String       
    
            if(len(@slice)>0)  
                insert into @temptable(Items) values(@slice)       
    
            set @String = right(@String,len(@String) - @idx)       
            if len(@String) = 0 break       
        end   
    return 
    end;
    

    次に、ストアドプロシージャで、関数を呼び出して文字列を分割します。

    ALTER PROCEDURE [dbo].[spInsertDistributionRuleListType]
    (
      @Rule_ID int,
      @ListType_ID int,
      @Values VARCHAR(MAX)=NULL
    )
    AS
    BEGIN
    
        INSERT INTO DistributionRule_x_ListType (Rule_ID, ListType_ID, Value)
        SELECT @Rule_ID, @ListType_ID, items
        FROM [dbo].[Split] (@Values, ',')  -- call the split function 
    
    END
    

    ストアドプロシージャを実行すると、値が分割され、複数の行がテーブルに挿入されます。

    exec spInsertDistributionRuleListType 1, 2, '319,400,521,8465,2013';
    

    SQL FiddlewithDemoを参照してください。これにより、次の結果が挿入されます:

    | RULE_ID | LISTTYPE_ID | VALUE |
    ---------------------------------
    |       1 |           1 |    10 |
    |       1 |           2 |   319 |
    |       1 |           2 |   400 |
    |       1 |           2 |   521 |
    |       1 |           2 |  8465 |
    |       1 |           2 |  2013 |
    


    1. postgresqlを初めて設定する方法は?

    2. Laravel:データベースに動的に接続する

    3. コマンドラインを介してLinux上のMySQLユーザーに権限を付与する

    4. .NETのOraOLEDBプロバイダーはCLOBフィールドに依存しませんか?