【问题标题】:TSQL - Remove list of parameters from TextTSQL - 从文本中删除参数列表
【发布时间】:2019-12-19 10:33:51
【问题描述】:

我在 SQL 表中有一个字段,其文本如下所示:

'The Employee <PARAM1> was replaced with <PARAM2> and was given the new IP address <PARAM3> with limited access <PARAM4>. <PARAM2> loves the new role'

我想从文本中删除所有&lt;PARAMs&gt;,然后使用 TSQL 如下所示

'The Employee was replaced with and was given the new IP address with limited access. loves the new role'

最好的方法是什么?

【问题讨论】:

  • 这两种说法似乎相同。不知道你想在这里做什么...替换文本,看REPLACE函数:docs.microsoft.com/en-us/sql/t-sql/functions/…
  • @SQLRaptor 他们不是 - 有一些文本被隐藏。我不确定您是否有可以看到的编辑链接,但如果没有,编辑后的帖子应该很快就会出现。
  • 您需要更明确地说明问题,唯一的区别似乎是. 和句尾之间缺少空格。你会编辑并澄清你想要完成的事情吗?
  • 不知道为什么会在我发布问题时发生。我想提出如下问题。我在 SQL 表中有一个字段,其文本如下所示。 ' 被替换为 并被赋予了有限的新 IP 地址 喜欢这个新角色'我想从 文本中删除所有内容,并使用 TSQL 如下所示'员工被替换为经理,并获得了访问受限的新 IP 地址。员工喜欢这个新角色'最好的方法是什么?
  • 使用SQL的REPLACE()函数点击链接阅读其工作原理。

标签: sql sql-server tsql replace


【解决方案1】:

解决此问题的一种方法是生成一个公共表表达式,该表达式将保存字符串中每个&lt;PARAMn&gt; 的起始位置和长度。为此,您可以使用单个公用表表达式,但我使用三个来完成此操作,以便该过程易于理解。
请注意,我假设字符串仅包含 &lt;&gt; 作为参数分隔符 - 所以内容中没有 &lt;&gt; 字符。如果不是这种情况,它仍然可以解决,但解决方案需要进行一些更改。

您从一个以 1 开头并以字符串长度结尾的数字(计数)cte 开始。
然后另一个 cte 来获取每个 &lt;PARAMn&gt; 的起始位置。
第三个 cte 用于获取每个 &lt;PARAMn&gt; 的长度(因为我假设您不限于字符串中的 10 个参数,因此您可以拥有 &lt;PARAM12&gt; 甚至 &lt;PARAM105&gt;)。

然后,创建一个查询,将更新原始字符串并一一删除&lt;PARAMn&gt;

-- Test data:
DECLARE @str nvarchar(1000) = 'The Employee <PARAM1> was replaced with <PARAM2> and was given the new IP address <PARAM3> with limited access <PARAM4>. <PARAM2> loves the new role';

-- The numbers (Tally) cte:
WITH Tally AS 
(
    SELECT TOP(LEN(@Str)) ROW_NUMBER() OVER(ORDER BY @@SPID) As N
    FROM sys.objects A CROSS JOIN sys.objects B
), -- The StartPosition cte contains the position of each < char in the string
StartPosition AS
(
SELECT DISTINCT
        CHARINDEX('<', @Str, N) As Start
FROM Tally
WHERE CHARINDEX('<', @Str, N) > 0

), -- the Length cte contains both the start position and the length of each <PARAMn> in the string
Length As
(
    SELECT  Start,
            CHARINDEX('>', @Str, Start) - Start + 1 As Length
    FROM StartPosition
)

-- Use STUFF to remove `<PARAMn>`. Note the order by is critical to remove from end to start.
SELECT @Str = STUFF(@Str, Start, Length, '')
FROM Length
ORDER BY Start DESC

-- verify the results:
SELECT @Str

结果:

The Employee  was replaced with  and was given the new IP address  with limited access .  loves the new role

您可能会注意到,在 &lt;PARAMn&gt; 过去的位置上,结果中有双空格 - 这可以通过使用 Gordon Linoff 在 this answer. 中展示的技术来解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多