我正在尝试提取字符串的一部分。我想要的字符串总是以"[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<的在小提琴
下面的逻辑是有效的:
SELECT
SUBSTRING(val,
CHARINDEX('[reportserver', val) + 1,
CHARINDEX(']', val, CHARINDEX('[reportserver', val)) - CHARINDEX('[reportserver', val) - 1) AS output
FROM yourTable;
演示您对SUBSTRING
的第一个和第二个输入是正确的,但第三个参数需要是要取的子字符串的长度。这基本上就是[reportserver
中紧跟[
的]
的位置与后者的位置之差。