Here is a method that will work starting from SQL Server 2012 onwards.
We are tokenizing input string of tokens as XML. An intermediate result in t1(c) contains XML as follows:
<root>
<r>keyword</r>
<r>44500903-8f09-40d8-a908-5fb3e03d145e</r>
<r>keyword2</r>
<r>441fb756-ff0a-473f-ad70-2f78d679e7d9</r>
</root>
We just need to retrieve XML elements values in odd positions by using XPath predicate [position() mod 2 = 1]
.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, tokens NVARCHAR(MAX));
INSERT @tbl (tokens) VALUES
(N'keyword|44500903-8f09-40d8-a908-5fb3e03d145e;keyword2|441fb756-ff0a-473f-ad70-2f78d679e7d9');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = ';'
, @pipe CHAR(1) = '|';
SELECT t.*
, REPLACE(c.query('data(/root/r[position() mod 2 = 1])')
.value('text()[1]','NVARCHAR(MAX)'), SPACE(1), @separator) AS result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(REPLACE(tokens,@pipe,@separator), @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML)) AS t1(c);
Output
id |
result |
1 |
keyword;keyword2 |