2015-01-14 2 views
0

Я пытаюсь разбить эту строку «1,1_5,2_3,4» сначала на «_», а затем разделить подстроку на «,», поэтому она будет например, «1,1_5,2_3,4» split-ed на «_», поэтому он даст эту подстроку «1,1», затем эту подстроку, разделенную на «,», а затем вставьте подстроку поддерева «1 1» в временную таблицу, как этотКак разбить строку на два символа или разделители в sql

INSERT INTO [dbo].[TEST] ([X],[Y]) 
        VALUES (@X,@Y) 

я сделал это только с расколом на один разделитель «» как этот первый я создать функцию таблицы Split

ALTER FUNCTION [dbo].[Split] 
(
    -- Add the parameters for the function here 
     @RowData nvarchar(2000), 
     @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    -- Declare the return variable here 
    Declare @Cnt int 
    Set @cnt = 1 

    While(charindex(@SplitOn,@RowData) > 0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(RTRIM(SUBSTRING(@RowData,1,CHARINDEX(@SplitOn,@RowData)-1))) 

      set @RowData = SUBSTRING(@RowData,CHARINDEX(@SplitOn,@RowData)+1,len(@RowData)) 
      set @Cnt = @Cnt + 1 
    End 
     insert into @RtnValue(data) 
     select Data = ltrim(RTRIM(@RowData)) 
    RETURN 

END 

Затем я создаю эту хранимую процедуру

ALTER PROCEDURE [dbo].[uspTest] 
    -- Add the parameters for the stored procedure here 
    @StringOFXIDs nvarchar(2000) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @SOMETABLE TABLE(ID INT IDENTITY(1,1) UNIQUE, XID INT); 
    DECLARE @XCOUNT INT; 
    DECLARE @XCURRENT INT; 
    DECLARE @XCOUNTER INT = 1; 
    -- Insert statements for procedure here 
    INSERT INTO @SOMETABLE([XID]) 
    SELECT [Data] FROM [dbo].[Split](@StringOFXIDs,','); 

    SELECT @XCOUNT = COUNT(1) FROM @SOMETABLE; 
    WHILE (@XCOUNTER <= @XCOUNT) 
    BEGIN 
     SELECT @XCOUNTER = [XID] 
     FROM @SOMETABLE 
     WHERE [ID] = @XCOUNTER 

     INSERT INTO [dbo].[TEST] ([X]) 
          VALUES (@XCOUNTER) 
     SELECT @XCOUNTER +=1; 
    END 
END 

--EXEC [dbo].[uspTest] '1,2,3,4' 

, а затем выполнить эту хранимую процедуру и все это работать, но я не могу понять, как разбить строку на два символа или разделителей, а затем вставляется временную таблицу спасибо за любую помощь заранее.

+0

Ваша строка сплиттер является самым медленным из всех различных способов разделения строки в т -SQL. Ознакомьтесь с этой статьей для нескольких способов разделения строк, которые будут лучше для производительности. –

+0

Что вы ожидаете от вывода на основе вашего примера «1,1_5,2_3,4»? –

+0

http://stackoverflow.com/questions/21246446/split-string-in-column –

ответ

3

Вы можете использовать функции XML для разделения на строки, а затем разбить на столбцы:

DECLARE @string VARCHAR(100) = '1,1_5,2_3,4' 
;WITH cte AS (SELECT RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS Txt 
        ,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RN  
       FROM (SELECT CAST ('<M>' + REPLACE(@string, '_', '</M><M>') + '</M>' AS XML) AS DATA 
        ) AS A 
        CROSS APPLY Data.nodes ('/M') AS Split(a) 
      ) 
    ,cte2 AS (SELECT CONVERT(XML,'<String><Section>'+ REPLACE(REPLACE(Txt ,'|',','),',', '</Section><Section>') + '</Section></String>') AS Txt 
         ,RN 
       FROM cte 
       ) 
SELECT Txt.value('/String[1]/Section[1]','varchar(100)') AS Col1 
     ,Txt.value('/String[1]/Section[2]','varchar(100)') AS Col2 
FROM cte2 
ORDER BY RN 

Выходы:

Col1  Col2 
--------------- 
1    1 
5    2 
3    4 
Смежные вопросы