Как написать рекурсивный запрос на замену TSQL? - PullRequest
2 голосов
/ 20 октября 2011

Я использую SSMS 2008 и пытаюсь написать рекурсивный оператор замены.У меня есть хорошее начало в этом, но оно еще не работает полностью.Я хочу заменить каждое вхождение тегов XML в одном столбце пустой строкой.Поэтому я хочу заменить весь диапазон от "<" до ">" для каждой записи.Вот что у меня есть:

DECLARE @I INTEGER
SET @I = 3
while 
@I > 0
--(select [note_text] from #TEMP_PN where [note_text] LIKE '%<%') 
BEGIN
UPDATE #TEMP_PN 
SET [note_text] = replace([note_text],substring([note_text],CHARINDEX('<',[note_text]),CHARINDEX('>',[note_text])),'')
from #TEMP_PN
where [note_text] LIKE '%Microsoft-com%'
SET @I = @I - 1 
END

SELECT * FROM #TEMP_PN

Проблема с этим кодом в том, что я жестко закодировал @I, чтобы быть 3. Однако я хочу, чтобы он продолжал заменять из "<" на ">" пустую строку длякаждая запись, пока нет больше символов "<".Поэтому я попробовал закомментированную строку выше, но это дает мне ошибку более чем в одной записи / подзапросе.Как я могу достичь этой рекурсивной функциональности?Кроме того, мой оператор Replace выше заменил символы "<" для некоторых записей, как это ни странно. </p>

Я попробовал ваш пример кода, но он все еще не заменяет все экземпляры этого текста для каждой записи, а для некоторых записей -не заменять текст, хотя в этих записях есть "<".Вот запись, где ваш скрипт не заменяет никаких подстрок.Может быть, это проблема специального символа? </p>

<DIV class=gc-message-sms-row><SPAN class=gc-message-sms-from>TLS: </SPAN><SPAN class=gc-message-sms-text>Hi Reggie... I'm on my way to Lynn.. see you soon</SPAN> <SPAN class=gc-message-sms-time>3:09 PM </SPAN></DIV>

1 Ответ

3 голосов
/ 20 октября 2011

Вы были довольно близко ... проблема в том, что третий параметр SUBSTRING - это длина, а не позиция, на которой нужно останавливаться.

DECLARE @RowsUpdated INT
SET @RowsUpdated = 1
WHILE (@RowsUpdated > 0)
BEGIN
    UPDATE #TEMP_PN 
SET [note_text] = 
    REPLACE(
            [note_text], 
            substring(
                [note_text],
                CHARINDEX('<',[note_text]), 
                CHARINDEX(
                    '>',
                    SUBSTRING([note_text], CHARINDEX('<',[note_text]), 1 + LEN([note_text]) - CHARINDEX('<',[note_text]))
                )
            ),
        '')
from #TEMP_PN
where [note_text] LIKE '%Microsoft-com%' and [note_text] like '%<%>%'

    SET @RowsUpdated = @@ROWCOUNT
END

SELECT * FROM #TEMP_PN

ВТОРОЕ РЕДАКТИРОВАНИЕ:

ОК, я обновил оба запроса; этот код теперь должен обрабатывать ведущий > перед первым тегом ... который, я думаю, мог быть проблемой.

DECLARE @TestString VARCHAR(MAX)
SELECT @TestString = '><DIV class=gc-message-sms-row><SPAN class=gc-message-sms-from>TLS: </SPAN><SPAN class=gc-message-sms-text>Hi Reggie... I''m on my way to Lynn.. see you soon</SPAN> <SPAN class=gc-message-sms-time>3:09 PM </SPAN></DIV>'

DECLARE @RowsUpdated INT
SET @RowsUpdated = 1

WHILE (@RowsUpdated > 0)
BEGIN

    SELECT
        @TestString = 
            REPLACE(
                @TestString, 
                substring(
                    @TestString,
                    CHARINDEX('<',@TestString), 
                    CHARINDEX(
                        '>',
                        SUBSTRING(@TestString, CHARINDEX('<',@TestString), 1 + LEN(@TestString) - CHARINDEX('<',@TestString))
                    )
                ),
            '')
    WHERE @TestString LIKE '%<%>%'

    SET @RowsUpdated = @@ROWCOUNT
END

SELECT @TestString

Может быть, потому что эта записка не соответствует критериям [note_text] LIKE '%Microsoft-com%'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...