您正在尋找應首先查找字符串Action
,然後這個詞的空格字符的代碼。之後,你有所有需要操縱你的源字符串。
這應該工作:
DECLARE
@P_string nvarchar (100),
@P_variable nvarchar (100),
@idx1 int,
@idx2 int
SET @p_string = 'hello Action=Refer non-action=non-refer'
SET @p_variable = 'Action'
SELECT
@idx1 = charindex(lower(@P_variable),lower(@P_string)) + len(@p_variable) + 1,
@idx2 = charindex(lower(' '), @P_string, @idx1)
SELECT @idx1, @idx2
SELECT SUBSTRING(
@p_string,
@idx1,
@idx2 - @idx1) as trying
編輯
經過仔細審查的要求,我決定來調整,我使用的類似目的的rCTE結構。在這裏。
CREATE TABLE #retention1 (
ID int,
txt nvarchar (100)
)
INSERT INTO #retention1 VALUES (1, 'hello Action=Refer non-action=non-refer')
INSERT INTO #retention1 VALUES (2, 'bye Action=Follow non-action=non-refer')
INSERT INTO #retention1 VALUES (3, 'hello non-action=non-refer Action=compare')
;WITH T AS (
SELECT
ID,
Row = 0,
StartIdx = CAST(0 as int),
EndIdx = CAST(0 as int),
Result = CAST('' as nvarchar(max))
FROM #retention1
UNION ALL
SELECT
r1.ID,
Row + 1,
StartIdx = CAST(newstartidx AS int),
EndIdx = CAST(EndIdx + newendidx as int),
Result = CAST(newtoken as nvarchar(max))
FROM
T
JOIN #retention1 r1
ON r1.ID = T.ID
CROSS APPLY(
SELECT newstartidx = EndIdx + 1
) calc1
CROSS APPLY(
SELECT newtxt = substring(r1.txt, newstartidx, len(r1.txt))
) calc2
CROSS APPLY(
SELECT patidx = charindex(' ', newtxt)
) calc3
CROSS APPLY(
SELECT newendidx = CASE
WHEN patidx = 0 THEN len(newtxt)
ELSE patidx END
) calc4
CROSS APPLY(
SELECT newtoken = substring(r1.txt, newstartidx, newendidx)
) calc5
WHERE newendidx > 0
)
SELECT
ID,
--Result
Name = left(Result, eqIdx - 1),
Value = substring(Result, eqIdx + 1, len(Result) - eqIdx + 1)
FROM
T
OUTER APPLY (
SELECT eqIdx = charindex('=', Result)
) calc6
WHERE
Row != 0
AND eqIdx != 0
ORDER BY ID
由於有不止一個表達式表來分析,你會引用它們沒有標識的問題。所以,我將ID添加到臨時表中。
來自CTE的輸出還包含ID,您可以將其用作#retention1.ID的參考。
謝謝大家的回覆!非常感謝偉大的解決方案 – user2590676
這裏有謝謝你的按鈕在這裏... – OzrenTkalcecKrznaric