Пользовательская функция SplitString для SQL Server с несколькими разбиениями - PullRequest
1 голос
/ 24 февраля 2010

Заранее спасибо!

У меня есть функция в SQL Server 2008, которая разбивает строку на основе символа, который я даю. Прекрасно и просто. Когда я прохожу:

Content1,Content2,Content3

Я могу создать прекрасную временную таблицу с этими значениями в одном столбце, разделенном запятой (,).

Теперь все хорошо, но теперь мне нужно разбить следующее на таблицу, но с двумя столбцами. «Имя» и «Заказ»

Content1:1,Content2:2,Content3:3 ...

У кого-нибудь есть что-нибудь для этого? Или лучший способ передать данные? Если нет, я собираюсь запустить отдельный сохраненный процесс для каждого из элементов. Я бы предпочел не. Но если я должен, я должен! Или создайте временную таблицу из временной таблицы. Грязно, я бы сказал!

Еще раз спасибо, заранее. Джеймс

1 Ответ

1 голос
/ 24 февраля 2010

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

CREATE FUNCTION [dbo].[mysplit] ( @input nvarchar(MAX), @row_delimiter char(1), @col_delimiter char(1))
RETURNS @OutputTable TABLE ( [name] nvarchar(100), [order] nvarchar(100) )
AS
BEGIN

    declare 
      @str1 nvarchar(100)
    , @str2 nvarchar(100)
    , @tmpstr nvarchar(200)

    WHILE LEN(@input) > 0
    BEGIN
        set @tmpstr = LEFT(@input, ISNULL(NULLIF(CHARINDEX(@row_delimiter, @input) - 1, -1), LEN(@input)))                        
        set @str1 = LEFT(@tmpstr, ISNULL(NULLIF(CHARINDEX(@col_delimiter, @tmpstr) - 1, -1), LEN(@tmpstr)))
        set @str2 = SUBSTRING(@tmpstr,ISNULL(NULLIF(CHARINDEX(@col_delimiter, @tmpstr), 0), LEN(@tmpstr)) + 1, LEN(@tmpstr)) 
        set @input = SUBSTRING(@input,ISNULL(NULLIF(CHARINDEX(@row_delimiter, @input), 0), LEN(@input)) + 1, LEN(@input))
        INSERT INTO @OutputTable ( [name] , [order] )
        VALUES ( @str1 , @str2)
    END

    RETURN
END
GO

select * from mysplit('Content1:1,Content2:2,Content3:3', ',' , ':')
...