Ваша проблема в том, что разбиение строки пробелами приводит к множеству пустых элементов.Выбор 2-го фрагмента имеет высокий шанс попасть в такой пустой.
Существует два подхода:
- Удалите все пробелы, чтобы вернуть строкина один пробел в качестве разделителя.Затем используйте подход, который вы нашли в другом вопросе.
- Используйте
XQuery
, чтобы вернуть только элементы с узлом text()
.
Попробуйте это:
DECLARE @TestWrite TABLE(TestWriteId int primary key identity(1,1), TextRow varchar(255))
insert into @TestWrite (TextRow) values
('I am writing SQL Code.') -- Row 1: Column 1: I , Column 2: am, Column 3: writing...
,('SQL keywords include join, except, where.'); -- Row 2: Column 1: SQL, Column 2: keywords, Column 3: include...
ad 1.: используйте любые два символа, которые не будут появляться в ваших строках
SELECT REPLACE(REPLACE(REPLACE(TextRow,' ','<>'),'><',''),'<>',' ')
FROM @TestWrite;
ad 2.
DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(t.TextRow,@dlmt,N'</x><x>') + N'</x>' AS XML)
.query('/x[text()]') --<-- Here's the magic
.value('/x[sql:variable("@pos")][1]','nvarchar(max)')
FROM @TestWrite t