提取介于 "[" 和 "]" 之间的字符串中的字符串



我正在尝试提取字符串的一部分。我想要的字符串总是以"[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"。接近,但没有雪茄。我错过了什么?

为另一个答案投票,因为它是正确的,但只是一种稍微不同的方式来看待它-我喜欢使用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&lt的在小提琴

下面的逻辑是有效的:

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

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

相关内容

  • 没有找到相关文章

最新更新