Esta es una función un poco de fuerza bruta, pero funciona... toma dos parámetros (uno para el delimitador primario, otro para el delimitador secundario):
IF EXISTS ( SELECT * from dbo.sysobjects WHERE id = object_id(N'[dbo].[doubleSplit]')
AND OBJECTPROPERTY(id, N'IsTableFunction') = 1 )
DROP FUNCTION [dbo].[doubleSplit]
GO
CREATE FUNCTION dbo.doubleSplit (
@sourceString varchar(MAX),
@primaryDelimiter varchar(100),
@secondaryDelimiter varchar(100) )
RETURNS @tblArray TABLE
(
ElementID smallint IDENTITY(1,1),
Element varchar(MAX),
Value varchar(MAX)
)
AS
BEGIN
DECLARE @primaryIndex smallint
DECLARE @secondaryIndex smallint
DECLARE @primaryStart smallint
DECLARE @secondaryStart smallint
DECLARE @primaryDelimiterSize smallint
DECLARE @seondaryDelimiterSize smallint
DECLARE @primaryElement varchar(MAX);
DECLARE @seondaryElement varchar(MAX);
SET @primaryDelimiterSize = LEN(@primaryDelimiter)
SET @seondaryDelimiterSize = LEN(@secondaryDelimiter)
--loop through source string and add elements to destination table array
WHILE LEN(@sourceString) > 0
BEGIN
SET @primaryIndex = CHARINDEX(@primaryDelimiter, @sourceString)
IF @primaryIndex = 0
BEGIN
SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @sourceString)
IF @secondaryIndex = 0
BEGIN
INSERT INTO @tblArray (Element, Value) VALUES(@sourceString, '')
END
ELSE
BEGIN
SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
INSERT INTO @tblArray (Element, Value)
VALUES(SUBSTRING(@sourceString, 1, @secondaryIndex - 1),
SUBSTRING(@sourceString, @secondaryIndex + @seondaryDelimiterSize, LEN(@sourceString) - @secondaryStart + 1))
END
BREAK
END
ELSE
BEGIN
SELECT @primaryElement = SUBSTRING(@sourceString, 1, @primaryIndex - 1);
SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @primaryElement)
SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
INSERT INTO @tblArray (Element, Value)
VALUES(SUBSTRING(@primaryElement, 1, @secondaryIndex - 1),
SUBSTRING(@primaryElement, @secondaryIndex + @seondaryDelimiterSize, LEN(@primaryElement) - @secondaryStart + 1))
SET @primaryStart = @primaryIndex + @primaryDelimiterSize
SET @sourceString = SUBSTRING(@sourceString, @primaryStart , LEN(@sourceString) - @primaryStart + 1)
END
END
RETURN
END
GO
Luego puede llamarlo así y obtener los resultados esperados:
SELECT * FROM dbo.doubleSplit('a-->1,b-->16,x-->99', ',', '-->')
Devuelve esto:
ElementID Element Value
1 a 1
2 b 16
3 x 99
Y esto:
SELECT * FROM dbo.doubleSplit('a-->1', ',', '-->')
Devuelve esto:
ElementID Element Value
1 a 1
Etc., etc.