2014-02-04 2 views
0

Я хочу разделить текст из столбца NAME и вставить данные, разделенные запятыми, в столбец PARCA для каждой строки. например:Сплит текстовое значение вставить другую ячейку

name   parca 
----   ------------- 
john   j,jo,joh,john 

Код:

DECLARE @i int = 0 
WHILE @i < 8 
BEGIN 
SET @i = @i + 1 
update export1 set PARCA = cast (PARCA as nvarchar(max)) + cast (substring(NAME,1,@i) as nvarchar(max)) +',' 
FROM export1 
end 

Есть две вещи, которые я не могу сделать;

  1. Я не мог уравнять @i значение имени количество строк
  2. я не мог проверил столбец NAME ли значение в столбце Parca
+0

Что вы имеете в виду клетки? Колонка базы данных? – Liath

ответ

1

Создать эту функцию:

create function f_parca 
(
@name varchar(100) 
) returns varchar(max) 
as 
begin 
declare @rv varchar(max) = '' 

if @name is not null 
select top (len(@name)) @rv += ','+ left(@name, number + 1) 
from master..spt_values v 
where type = 'p' 

return stuff(@rv, 1,1,'') 
end 

Тестирование функции

select dbo.f_parca('TClausen') 

Результат:

Обновите таблицу, как это:

UPDATE export1 
SET PARCA = dbo.f_parca(name) 
+0

благодарит вас за ваши интересы. как можно использовать эту функцию как обновление столбца foreach parca? есть ли идея? – user3269841

+0

@ user3269841 да, прочитайте последние 2 строки кода, которые будут обновлять все строки –

+0

да, я вижу. но есть ошибка Msg 1014, уровень 15, состояние 1, строка 2 Предложение TOP содержит недопустимое значение. – user3269841

1
DECLARE @Count INT,@I INT 
SET @I = 1 
SET @Count = LEN('SURESH') 
DECLARE @N VARCHAR(2000) 
SET @N = '' 
WHILE @Count > 0 
BEGIN 
    SET @N = @N + ','+SUBSTRING('SURESH',1,@I) 
    SET @I = @I+1 
    SET @Count = @Count -1 
END 

SELECT SUBSTRING(@N,2,2000) 

Приведенный выше код только образец. «SURESH» - это ваше поле имени. Из которого вы можете передать свои собственные значения. Вместо окончательного выбора u вы можете поместить обновление ur.

+0

+1 но, устраняя первую запятую, может быть лучше от @N вместо использования подстроки. –

+0

Я предполагаю, что каждое имя будет иметь разную длину ... это решит только часть проблемы. Стол должен считываться с помощью курсора. – Jayvee

+0

@semihyagcioglu Как вы устраняете запятую forst без использования подстроки? – sureshhh

0

Попробуйте, этот запрос будет нарушать слово в символы строки, как и ожидалось, то вы можете объединить в одну строку

DECLARE @Name AS Varchar(100)='Naveen' 

;with cte as 
(
select 1 AS Counter,CAST(SUBSTRING(@Name, 1, 1) AS Varchar(100)) Name 
union all 
select Counter+1,CAST((Name + ',' + SUBSTRING(@Name, Counter+1, 1))AS Varchar(100)) Name 
from cte 
where Len(Name) < Len(@Name) + (Len(@Name) -1) 
) 
select 
    Name 
    from cte 
option(MAXRECURSION 0) 
0
-- This query will give you exactly what you are looking for, use Emp Table with Ename as  column  

;with cte as 
(
select 1 AS Counter,EName,CAST(SUBSTRING(E.EName, 1, 1) AS Varchar(100)) Name 
     From EMP E 
union all 
select Counter+1,E.EName,CAST((Name + SUBSTRING(E.EName, Counter+1, 1))AS Varchar(100)) Name 
From EMP E 
    INNER JOIN CTE C ON C.Ename=E.EName 
where Len(Name) < Len(E.EName) 
) 
select EName AS Name, 
    STUFF(( SELECT ',' + Name AS [text()]       
         FROM CTE A 
         WHERE 
         A.EName = cte.EName 
         FOR XML PATH('') 
         ), 1, 1, '')      
      AS Parca  
    from cte 
    Group By EName 
    Order By EName 
    option(MAXRECURSION 0) 
Смежные вопросы