我有一个带有表feedback
的SQL Server数据库,其中包含一个文本列comment
。在该列中,我有标签数据,例如
This is my record <tag>Random characters are here</tag> with information.
如何编写查询以更新所有这些记录以删除<tag></tag>
及其间的所有文本?
我想将其写入另一个“临时”表,首先验证更改,然后更新原始表。
我正在运行SQL Server 2014 Express。
谢谢
答案 0 :(得分:1)
这是一个删除标签的功能..
CREATE FUNCTION [dbo].[RemoveTag](@text NVARCHAR(MAX), @tag as nvarchar(max))
RETURNS NVARCHAR(MAX)
AS
BEGIN
declare @startTagIndex as int
declare @endTagIndex as int
set @startTagIndex = CHARINDEX('<' + @tag + '>', @text)
if(@startTagIndex > 0) BEGIN
set @endTagIndex = CHARINDEX('</' + @tag + '>', @text, @startTagIndex)
if(@endTagIndex > 0) BEGIN
return LEFT(@text, @startTagIndex - 1) + RIGHT(@text, len(@text) - len(@tag) - @endTagIndex - 2)
END
END
return @text
END
稍后您可以像以下一样使用它:
Update table set field = dbo.RemoveTag(field, 'tag')
如果你想将字段写入其他表格,那么:
CREATE TABLE dbo.OtherTable (
OtherField nvarchar(MAX) NOT NULL
)
GO
INSERT INTO OtherTable (OtherField)
SELECT dbo.RemoveTag(field, 'tag') from table
答案 1 :(得分:1)
对字符串的格式做出很多假设。但如果它们有效,那么这很简单:
left(s, charindex('<tag>', s - 1)) +
substring(s, charindex('</tag>', s) + 6, len(s))
显然,我们基本上假设搜索字符串只出现一次并且顺序正确。还有一个假设是会有匹配。此外,我使用len(s)
作为从右侧获取的字符数的简单上限。如果您感觉喜欢它,您可以硬编码适当的东西,因为SQL Server没有出错的结果。 s
只是您的char列的替代品。
http://sqlfiddle.com/#!3/771a3/8
不确定是否会出现额外的空格,因此您可能需要修剪并在中间添加空格字符。
rtrim(left(s, charindex('<tag>', s) - 1)) + ' ' +
ltrim(substring(s, charindex('</tag>', s) + 6, len(s)))
答案 2 :(得分:0)
您可以使用CHARINDEX查找标记的开始和停止位置,使用SUBSTRING获取&lt;之间的所有文本。和&gt;,和REPLACE交换''。
的子字符串Select Field,
Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field,
(CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1) as ToRemove,
replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>',
Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '')
as FinalResult
来自TableName的
输出将是三列,Field,ToRemove和FinalResult,但实际上不会更新任何内容。
我认为这种失败的唯一方法就是嵌套标签。 <b><i>sometext</i></b>
实际进行更改:
Update #TableName set Field = replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '')
在SQL Server 2012上测试。