Вставить в SQL-сервер из возвращаемого текста регулярного выражения - PullRequest
1 голос
/ 03 февраля 2011

В SQL Server 2008 я создал функцию сопоставления и замены регулярных выражений из приведенного ниже кода проекта сайта и работает хорошо. http://www.codeproject.com/KB/string/SqlRegEx.aspx?msg=3683405#xx3683405xx. Эта функция в основном ищет текст столбца, находит совпадения и заменяет замененный текст. Я использовал обратную ссылку здесь.

например. если в столбце 1 указано «первая статья # 345 указана 9999 и помещена в 001», она вернется 345 # 9999 # 001

Оператор выбора Выберите column1, dbo.ufn_RegExReplace (Column1, '(? \ D +). ? (? \ D +). ? (? \ D +). *? (? \ D +)', '$ {First_number_match} # $ {Second_number_match} # Third_number_match ', 1) работает нормально.

Я хочу вставить 345 # 9999 # 001 в три столбца таблицы.

Обратите внимание, что в моей реальной проблеме мне придется использовать регулярные выражения. Я упростила для экспертов, чтобы сосредоточиться на проблеме.

Как мы знаем, Regex нервничают, и использование с SQL добавляет к этому. Поэтому я буду признателен за любую помощь в этом. Спасибо за ваше время, чтобы прочитать это.

1 Ответ

1 голос
/ 03 февраля 2011

Вы можете создать функцию разделения строк и использовать ее для получения ваших индивидуальных значений.Например, что-то вроде этого:

CREATE FUNCTION dbo.fn_StringSplit(@String NVARCHAR(8000), @Delimiter NCHAR(1))       
RETURNS @tblItems TABLE (item NVARCHAR(8000))       
AS       
BEGIN       
    DECLARE @idx INT       
    DECLARE @slice NVARCHAR(8000)       

    SELECT @idx = 1       
        IF LEN(@String) < 1 OR @String IS NULL  RETURN       

    WHILE (@idx != 0 AND LEN(@string) > 0)
    BEGIN
        SET @idx = CHARINDEX(@Delimiter, @String)       
        IF @idx != 0       
            SET @slice = LEFT(@String, @idx - 1)       
        ELSE       
            SET @slice = @String       

        IF(LEN(@slice) > 0)  
            INSERT INTO @tblItems(item) VALUES (@slice)       

        -- Trim saved item from remaining string 
        SET @String = RIGHT(@String, LEN(@String) - @idx)             
    END
RETURN       
END 

В качестве альтернативы, вы можете изменить указанную выше функцию Split, чтобы при желании возвращать ваши 3 значения в одной строке таблицы или как 3 выходных параметра для хранимой процедуры.

...