2016-05-06 2 views
0

Просят много раз, но не так.Mimic STRING_SPLIT без специальной функции в SQL Server 2008

Я нахожусь на SQL Server 2008, и нет функции STRING_SPLIT (как в 2016 году).

Запрос возвращается со следующей строкой, см. Ниже примерную строку. То, что вы видите ниже, в лысого это одно поле на самом деле, так что одна varchar колонка имеет его полностью:

Appple|10|admin|845687|Apr|26|11:32:29|2016|AwesomeApplication.zip 

, который я хотел бы быть расщеплены трубы | характера.

Я не могу написать CTE для этого или пользовательскую функцию.

Мне нужно извлечь отдельные элементы с разделителями, в разные столбцы, в одном выражении выбора, используя встроенные строковые функции, такие как CHARINDEX, PATINDEX.

Есть ли у кого-нибудь идеи?

+0

Если его единственная строка просто скопировать код из функции разделенной в то время как петли и использовать его в линии, будет точкой, в которой каждый маркер подвергается –

+0

@AlexK. отредактировал вопрос, чтобы сделать его более понятным ... это на самом деле одно поле, исходящее из запроса – Avithohol

ответ

4
DECLARE @Result Table(Value varchar(50)) 
DECLARE @x XML 
SELECT @X = CAST('<A>' + REPLACE(@StringList, '|', '</A><A>') + '</A>' AS XML) 

INSERT INTO @Result 
SELECT t.value('.', 'varchar(50)') as inVal 
FROM @X.nodes('/A') AS x(t) 

Это создаст таблицу с одним столбцом (значение). Каждое значение split из вашей строки с разделителями строк будет создавать новую запись в этой таблице. Тогда вы можете присоединиться к нему, как хотите. Пожалуйста, дайте мне знать, если это неясно или если это не работает в SQL 2008.

Вы можете увеличить размер varchar, если это необходимо - и вы можете изменить запрос на разделение на разные значения (с разделителями-запятыми , и т.д.).

+1

, это дало мне идею! – Avithohol

+0

Рад это слышать! –

0
ALTER FUNCTION [dbo].[split] 
(
    @string varchar(max), 
    @separator varchar(1) -- longer separator is also possible 
) 
RETURNS 
@result TABLE (keyword varchar(max)) 
AS 
BEGIN 
declare @pos int=0, @res varchar(100) 
while len(@string)>0 
begin 
set @pos=CHARINDEX(@separator, @[email protected],0) 
select @res=left(@string,@pos),@string=SUBSTRING(@string,@pos+1,100) 
insert @result values(@res) 
end 
    RETURN 
END