【问题标题】:Extracting a string within a string between "[" and "]"在“[”和“]”之间的字符串中提取字符串
【发布时间】:2021-11-05 04:56:33
【问题描述】:

我正在尝试提取字符串的一部分。我想要的字符串总是以“[reportserver”开头。我想提取之后的所有内容,直到下一个“]”“[reportserver”到“]”之后的文本可能会有所不同。这是整个字符串:

CREATE TRIGGER [dbo].[Schedule_UpdateExpiration] 
            ON [dbo].[Schedule] AFTER UPDATE  
AS
UPDATE EC
SET AbsoluteExpiration = I.NextRunTime 
FROM [reportserver - EMPTYTempDB].dbo.ExecutionCache AS EC
INNER JOIN ReportSchedule AS RS ON EC.ReportID = RS.ReportID
INNER JOIN inserted AS I ON RS.ScheduleID = I.ScheduleID AND RS.ReportAction = 3  

在这种情况下,我想提取:“reportserver - EMPTYTempDB”

我已经接近了:

SELECT SUBSTRING(@TEXT,CHARINDEX('[reportserver',@TEXT)+1,(CHARINDEX(']',@TEXT)))

返回:“reportserver - EMPTYTe”。关闭,但没有雪茄。我错过了什么?

【问题讨论】:

    标签: sql-server tsql power-bi-report-server


    【解决方案1】:

    下面的逻辑是有效的:

    SELECT
        SUBSTRING(val,
                  CHARINDEX('[reportserver', val) + 1,
                  CHARINDEX(']', val, CHARINDEX('[reportserver', val)) - CHARINDEX('[reportserver', val) - 1) AS output
    FROM yourTable;
    

    Demo

    您对SUBSTRING 的第一个和第二个输入是正确的,但第三个参数需要是要采用的子字符串的长度。这基本上就是[reportserver中紧跟在[之后的]的位置和后者的位置的区别。

    【讨论】:

      【解决方案2】:

      赞成另一个答案,因为它是正确的,但只是看待它的方式略有不同 - 我喜欢使用 CTE 传递 CHARINDEX 之类的东西,因此代码只需包含一次。

      ;WITH x AS 
      (
        SELECT t = @text, c = CHARINDEX(N'[reportserver', @text)
      ),
      y AS 
      (
        SELECT r = SUBSTRING(t,c,4000) FROM x
      ),
      z AS 
      (
        SELECT o = LEFT(r, CHARINDEX(N']', r)) FROM y
      )
      SELECT o FROM z;
      

      这种方法的好处(除了避免多次重复任何表达式)是能够轻松检查任何 CTE 的结果。

      db<>fiddle

      【讨论】:

      • 投了赞成票,因为你是 Aaron Bertrand +1。
      • @TimBiegeleisen 哈哈哈
      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多