繁体   English   中英

如何在SQL中的两个字符或分隔符上拆分字符串

[英]How to split string on two characters or delimiters in sql

我试图先在'_'上分割字符串“ 1,1_5,2_3,4”,然后在','上分割子字符串,所以它就像“ 1,1_5,2_3,4”在首先使用'_',它将给此子字符串“ 1,1”,然后在','上拆分该子字符串,然后将拆分后的子字符串“ 1 1”插入到临时表中,如下所示

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'

然后执行此存储过程,一切正常,但我无法弄清楚如何将字符串拆分为两个字符或定界符,然后将其插入到temp表中,感谢您的任何事先帮助。

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM