从“[”和“]”之间的字符串中提取字符串

Extracting a string within a string between "[" and "]"

我正在尝试提取字符串的一部分。我想要的字符串总是以“[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)))

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

以下逻辑有效:

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

Demo

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

的区别

赞成另一个答案,因为它是正确的,但只是看待它的方式略有不同——我喜欢使用 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