sql >> Database teknologi >  >> RDS >> Sqlserver

adskil kommaseparerede værdier og gem i tabel i sql server

Du bliver nødt til at oprette en opdelt funktion, der ligner denne:

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;
 

Derefter vil du i din lagrede procedure kalde funktionen til at opdele din streng:

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
 

Når du udfører den lagrede procedure, vil den opdele værdierne og indsætte de flere rækker i din tabel:

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

Se SQL Fiddle with Demo. Dette vil indsætte følgende resultat:

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

  1. Udviklerværktøjer til direkte adgang til databaser

  2. Overvejelser omkring kolonnerækkefølge i indekser og sorteringer

  3. MySQL Tutorial – Konfiguration og administration af SSL på din MySQL-server

  4. alternativ til listagg i Oracle?