2012-03-21 4 views
4

Я понимаю, что этот вопрос задан раньше, но я не могу заставить его работать по какой-то причине.SQL Server разделяет CSV на несколько строк

Я использую функцию split от this SQL Team thread (второе сообщение) и следующие запросы.

--This query converts the interests field from text to varchar 
select 
    cp.id 
    ,cast(cp.interests as varchar(100)) as interests 
into #client_profile_temp 
from 
    client_profile cp 

--This query is supposed to split the csv ("Golf","food") into multiple rows    
select 
    cpt.id 
    ,split.data 
from 
    #client_profile_temp cpt 
    cross apply dbo.split(
    cpt.interests, ',') as split <--Error is on this line 

Однако я получаю сообщение об ошибке

Incorrect syntax near '.' 

где я отмеченную выше.

В конце концов, я хочу

ID    INTERESTS 
000CT00002UA "Golf","food" 

быть

ID    INTERESTS 
000CT00002UA "Golf" 
000CT00002UA "food" 

Я использую SQL Server 2008 и основывая свой ответ на this StackOverflow question. Я довольно новичок в SQL, поэтому любые другие слова мудрости будут оценены.

ответ

4
from 
    #client_profile_temp cpt 
    cross apply dbo.split(
    #client_profile_temp.interests, ',') as split <--Error is on this line 

Я думаю, явное именование #client_profile_temp после вы дали ему псевдоним является проблемой, попробуйте сделать эту последнюю строку:

cpt.interests, ',') as split <--Error is on this line 

EDIT Вы говорите

I сделал это изменение и ничего не изменил

Попробуйте вставить код ниже (в новом окне SSMS)

create table #client_profile_temp 
(id int, 
interests varchar(500)) 

insert into #client_profile_temp 
values 
(5, 'Vodka,Potassium,Trigo'), 
(6, 'Mazda,Boeing,Alcoa') 

select 
    cpt.id 
    ,split.data 
from 
    #client_profile_temp cpt 
    cross apply dbo.split(cpt.interests, ',') as split 

Смотрите, если он работает, как вы ожидаете; Я использую SQL Server 2008, и это работает для меня, чтобы получить те результаты, которые, я думаю, вы хотите.

Любой шанс, когда вы говорите «Я внес изменения», вы просто изменили хранимую процедуру, но не запустили ее или не изменили скрипт, который создает хранимую процедуру, и не выполнили это, что-то вдоль этих строк ? Как я уже сказал, это работает для меня.

+0

Я сделал это изменение, но это ничего не меняет. –

+0

@CavynVonDeylen Я отредактировал свой ответ, показывая сеанс, в котором я его пробовал, где работает, как я думаю, вы хотите. Я думаю, что если вы сохранили выбор как представление, вам нужно изменить представление. Или вы просто печатаете буквально, что вы показываете нам? –

+0

Я вставил ваш код в новый запрос, но у меня появился «Неверный синтаксис рядом», «на линии« Водка »,« Калий »,« Триго »и та же ошибка, что и раньше, в строке cpt.interests. думаю, что проблема немного больше, чем мой синтаксис, так как у меня были некоторые проблемы, которые делали и раньше. Спасибо за ваш вклад. –

0

Попробуйте это:

--This query is supposed to split the csv ("Golf","food") into multiple rows    
select 
    cpt.id 
    ,split.data 
from 
    #client_profile_temp cpt 
    cross apply dbo.split(cpt.interests, ',') as split <--Error is on this line 

Вы должны использовать таблицы псевдоним вместо имени таблицы, как только вы определили его.

6

ТАБЛИЦА

x-----------------x--------------------x 
|  ID  |  INTERESTS  | 
x-----------------x--------------------x 
| 000CT00002UA | Golf,food  | 
| 000CT12303CB | Cricket,Bat  | 
x------x----------x--------------------x 


СПОСОБ 1: Использование формата XML

SELECT ID,Split.a.value('.', 'VARCHAR(100)') 'INTERESTS' 
FROM 
(
    -- To change ',' to any other delimeter, just change ',' before '</M><M>' to your desired one 
    SELECT ID, CAST ('<M>' + REPLACE(INTERESTS, ',', '</M><M>') + '</M>' AS XML) AS Data 
    FROM TEMP  
) AS A 
CROSS APPLY Data.nodes ('/M') AS Split(a) 

МЕТОД 2: Использование функции dbo.Split

SELECT a.ID, b.items 
FROM #TEMP a 
CROSS APPLY dbo.Split(a.INTERESTS, ',') b 

И dbo.Split функция здесь.

CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (items varchar(8000))  
as  
begin  
declare @idx int  
declare @slice varchar(8000)  

select @idx = 1  
    if len(@String)<1 or @String is null return  

while @idx!= 0  
begin  
    set @idx = charindex(@Delimiter,@String)  
    if @idx!=0  
     set @slice = left(@String,@idx - 1)  
    else  
     set @slice = @String  

    if(len(@slice)>0) 
     insert into @temptable(Items) values(@slice)  

    set @String = right(@String,len(@String) - @idx)  
    if len(@String) = 0 break  
end 
return  
end 

ОКОНЧАТЕЛЬНЫЙ РЕЗУЛЬТАТ

enter image description here

+0

Во втором методе «split» не встроенная функция? Я вижу ссылку t o Разделение во многих статьях показало, что оно встроено в SQL. Думал, что он может быть встроен. – Nishant

+1

Нет. Это не так. Но многие люди используют это, поскольку они не знают встроенной функции XML. @Nishant –

+0

Это хорошая идея для преобразования обычных данных в XML и работы над ним. – Nishant

Смежные вопросы