I have a string and I need to return the characters between the double quotes
‘((“Name 1” and “Name 2”) or “Name 3”)
I need to return
x
Name 1
Name 2
Name 3
I have used the function below to split the string but I am getting the (( and the Or and AND etc .. which I don’t want and unfortunately I can’t be certain of all the other characters that could be included so removing them or replacing them isn’t really feasible.
ALTER FUNCTION [dbo].[fn_SplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(ID int, splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT, @Count INT
set @Count = 1
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (ID, splitdata)
VALUES(@Count, SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
Set @Count = @Count+1
END
RETURN
END
I know this code will return the string between 2 delimiters
substring( LEFT(@String, charindex(']', @String)-1), CHARINDEX('[', @String) + len('['), LEN(@String))
is there any way to combine the 2 and return the required output?
Thanks
Advertisement
Answer
Give this a try; I kept the debugging variables in the output table
ALTER FUNCTION [dbo].[fn_SplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE
(
[Id] INT,
[Start] INT,
[End] INT,
[Length] INT,
[Data] NVARCHAR(MAX)
)
BEGIN
DECLARE @count INT, @start INT, @end INT
SELECT @count = 1, @end = 0,
@start = CHARINDEX(@delimiter, @string)
WHILE @start > 0 BEGIN
SELECT @end = CHARINDEX(@delimiter, @string, @start + 1)
INSERT INTO @output ([Id], [Start], [End], [Length], [Data])
VALUES (@count, @start, @end, @end - @start - 1,
SUBSTRING(@string, @start + 1, @end - @start - 1))
SELECT @start = CHARINDEX(@delimiter, @string, @end + 1),
@count = @count + 1
END
RETURN
END
Or this, based on the idea of receiving two different delimiters:
ALTER FUNCTION [dbo].[fn_SplitString]
(
@string NVARCHAR(MAX),
@delimiter1 NVARCHAR(MAX),
@delimiter2 NVARCHAR(MAX)
)
RETURNS @output TABLE
(
[Id] INT,
[Start] INT,
[End] INT,
[Length] INT,
[Data] NVARCHAR(MAX)
)
BEGIN
DECLARE @count INT, @start INT, @end INT
SELECT @count = 1, @end = 0
SELECT @start = CHARINDEX(@delimiter1, @string)
SELECT @end = CHARINDEX(@delimiter2, @string, @start + 1)
WHILE @start > 0 AND @end > 0 BEGIN
INSERT INTO @output ([Id], [Start], [End], [Length], [Data])
VALUES (@count, @start, @end, @end - @start - 1,
SUBSTRING(@string, @start + 1, @end - @start - 1))
SELECT @start = CHARINDEX(@delimiter1, @string, @end + 1)
SELECT @end = CHARINDEX(@delimiter2, @string, @start + 1),
@count = @count + 1
END
RETURN
END