gpt4 book ai didi

tsql - 如何编写递归TSQL替换查询?

转载 作者:行者123 更新时间:2023-12-04 06:10:30 25 4
gpt4 key购买 nike

我正在使用 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 语句只替换了某些记录的 "<"字符。

我尝试了您的示例代码,但它仍然没有替换每条记录中此文本的所有实例,并且对于某些记录,它不会替换任何文本,尽管这些记录中有“<”。这是您的脚本不替换任何子字符串的记录。也许这是一个特殊的字符问题?
<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>

最佳答案

你非常接近......问题是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%'标准?

关于tsql - 如何编写递归TSQL替换查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7841244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com