Sql 删除括号中的字符

Sql 删除括号中的字符,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我使用的是SQL Server 2008 R2,但我通过SQL Server 2012 Management Studio访问该服务器 我有一个名为Search的表,其中有一列Body,类型为(nvarchar(Max),非空) 本栏中的数据实际上是电子邮件的正文,本栏将所有HTML标记保留为文本的一部分 例如,电子邮件正文将显示: Good morning This invoice has been assigned. 但是当它存储在名为Body的列中时,它看起来是这样的: [size=

我使用的是SQL Server 2008 R2,但我通过SQL Server 2012 Management Studio访问该服务器

我有一个名为
Search
的表,其中有一列
Body
,类型为
(nvarchar(Max),非空)

本栏中的数据实际上是电子邮件的正文,本栏将所有HTML标记保留为文本的一部分

例如,电子邮件正文将显示:

 Good morning
 This invoice has been assigned.
但是当它存储在名为
Body
的列中时,它看起来是这样的:

[size=14.0pt]Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size] 
Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]
Good Morning
This invoice has been assigned.
SELECT 
     *,
     [dbo].[fx_RemoveTags](@test) as Body1
FROM search
我使用以下SQL删除“[”和“]”(包括括号)之间的所有内容:

你能帮我使用SQL吗?这样它就可以删除所有的SQL,所以看起来是这样的:

[size=14.0pt]Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size] 
Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]
Good Morning
This invoice has been assigned.
SELECT 
     *,
     [dbo].[fx_RemoveTags](@test) as Body1
FROM search

您可以定义一个标量函数,用于删除方括号及其之间包含的所有文本:

create function [dbo].[fx_removetags] (@text nvarchar(max))
    returns nvarchar(max) as
begin
    declare @tag_start  int
    declare @tag_end    int
    declare @tag_length int
    set @tag_start = charindex('[', @text)
    set @tag_end = charindex(']', @text, charindex('[', @text))
    set @tag_length = (@tag_end - @tag_start) + 1
    while @tag_start > 0 and @tag_end > 0 and @tag_length > 0
        begin
            set @text = stuff(@text,@tag_start,@tag_length, '')
            set @tag_start = charindex('[',@text)
            set @tag_end = charindex(']',@text,charindex('[', @text))
            set @tag_length = (@tag_end - @tag_start) + 1
        end
    return ltrim(rtrim(@text))
end
现在,您可以调用函数来获取不带括号的文本:

 SELECT 
     *,
     CASE 
        WHEN CHARINDEX('[', Body) > 0 AND CHARINDEX(']', Body) > 0 
             AND CHARINDEX('[', Body) < CHARINDEX(']', Body) 
           THEN STUFF(Body, CHARINDEX('[', Body), (CHARINDEX(']', Body) - CHARINDEX('[', Body)) + 1, '')
           ELSE Body
     END AS Body1
FROM search
declare @test nvarchar(max)= ''
set @test = '[size=14.0pt]Good morning [/size][size=14.0pt]This invoice has been assigned.[/size] '

select [dbo].[fx_RemoveTags](@test)
结果:

在您的特定情况下,您可以使用如下函数:

[size=14.0pt]Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size] 
Good morning
[/size][size=14.0pt]This invoice has been assigned.[/size]
Good Morning
This invoice has been assigned.
SELECT 
     *,
     [dbo].[fx_RemoveTags](@test) as Body1
FROM search

您使用的是什么风格的SQL?e、 MYSQL、MS SQL等?我使用的是MS SQL Server 2008 R2,但我通过SQL Server Management Studio 2012访问该服务器。很抱歉,我应该在我的原始帖子中包含这些内容,但这不是有效的HTML。如果它是真正的HTML,我们可以使用一些技巧。既然情况并非如此,我建议使用CLR和正则表达式。Andrea,谢谢你的帮助。I:n关于SQL语句,上面的部分是:set@test='[size=14.0pt]早上好[/size][size=14.0pt]此发票已分配。[/size]'如何引用名为“body”的原始字段。此代码使用的确切措辞为:[size=14.0pt]早上好[/size][size=14.0pt]此发票已分配。[/size]”,但此字段中的每个条目都不同。是否使用不同的参数测试了该函数?这里没有任何特定于用例的东西……Eric,感谢您的回复,我还在学习SQL。我像安德里亚发布的那样运行它,得到了与她相同的结果。然而,现在我正试图理解如何使用名为“Body”的列测试这一点,所有数据都位于该列中。我假设is与这行“set@test=”[size=14.0pt]早上好[/size][size=14.0pt]有关,此发票已分配。[/size]”,但不确定如何将其更改为引用我表中名为“Search”的“Body”列。这应该可以工作<代码>从搜索中选择dbo.fx_RemoveTags(s.Body)作为s也许可以尝试
选择前10个….
开始,只是为了验证函数。@StephenMorrell Eric是对的,您可以在
选择
语句中直接使用函数来替换
案例。。。当
。我用一个例子更新了我的答案