[英]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.