SQL Server разделил CSV на несколько строк - PullRequest
4 голосов
/ 21 марта 2012

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

Я использую функцию разделения из этой ветки SQL Team (второй пост) и следующих запросов.

--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 и основываю свой ответ на на этом вопросе StackOverflow . Я довольно новичок в SQL, поэтому любые другие слова мудрости также будут оценены.

Ответы [ 3 ]

7 голосов
/ 21 марта 2012
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

РЕДАКТИРОВАТЬ Вы говорите

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

Попробуйте вставить приведенный ниже код (в новое окно 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, и это работает для меня, чтобы получить результаты, которые я думаю, вы хотите.

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

6 голосов
/ 08 января 2015

ТАБЛИЦА

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 голосов
/ 21 марта 2012

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

--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 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...