2016-06-28 3 views
1

Использование новейшего SQL-обновления и функции разделения строк, как вставить данные разбиения обратно в таблицу?Как вернуть данные из функции SQL String_split в мою таблицу

select be.*, SS.value 
from b2bemployee be 
outer apply string_split(firstname, ' ') AS SS 
where id=2319 

Используя это, я разделил столбец FirstName на два значения, и данные будут возвращены в двух отдельных строках. Я пытаюсь вставить эти данные обратно в таблицу, как updatedfirstname (до пространства) и updatedlastname (после пробела)

+0

Используйте 'SUBSTRING()' вместо для этого. http://stackoverflow.com/questions/10921400/t-sql-substring-separating-first-and-last-name – scsimon

ответ

2

Я думаю, что это будет работать вместо того, чтобы:

Create Table #Test (Value Varchar(8000), LeftPart Varchar(8000), RightPart Varchar(8000)) 
Insert #Test Values ('Joe Cool', '', '') 
Insert #Test Values ('John Doe', '', '') 


Update #Test Set LeftPart = Substring(Value, 1, Charindex(' ', Value) - 1), RightPart = Substring(Value, Charindex(' ', Value) + 1, 8000) From #Test 
Select * From #Test 

Также обратите внимание, что если вы не планируете прекратите полное поле после разделения, это хороший пример для вычисляемых столбцов.

2

Функции Split могут быть медленными, особенно с большими таблицами.

Рассмотрим ParseName(), например

Declare @String varchar(25) = 'John Smith 999-11-1234' 
Select FirstName=PARSENAME(Replace(@String,' ','.'),3) 
     ,LastName =PARSENAME(Replace(@String,' ','.'),2) 
     ,SSN  =PARSENAME(Replace(@String,' ','.'),1) 

--Returns-- 
FirstName LastName SSN 
John  Smith  999-11-1234 

Таким образом, в вашем случае, и предполагается, что ваш разделителем является пробел и ваше поле выглядит как "Jame Смит"

Select FirstName=PARSENAME(Replace(YourFieldName,' ','.'),2) 
     ,LastName =PARSENAME(Replace(YourFieldName,' ','.'),1) 
+0

Просто будьте осторожны с этим, если вы собираетесь разбирать более 4 разделителей. – dfundako

+0

@dfundako Согласен, я сделал предположения в прошлом, и я ошибся в космическом масштабе. Это предположение, с которым я мог бы жить –

0

Если вы хотите чтобы использовать STRING_SPLIT (пути с PARSENAME и SUBSTRING являются более адекватными для этой ситуации), вам необходимо сделать что-то вроде этого:

;WITH cte AS (
SELECT be.*, 
     SS.value as FN, 
     ROW_NUMBER() OVER (PARTITION BY be.id ORDER BY (SELECT 1)) as RN 
FROM b2bemployee be 
OUTER APPLY STRING_SPLIT(be.firstname, ' ') as SS 
WHERE be.id=2319 
) 

SELECT c1.*, 
     c2.FN 
FROM cte c1 
LEFT JOIN cte c2 
    ON c1.RN+1 = c2.RN 
WHERE c1.RN = 1 

Я хотел бы предложить использовать LEFT и RIGHT

SELECT be.*, 
     RIGHT(be.firstname,CHARINDEX(' ',be.firstname)) as updatedfirstname , 
     LEFT(be.firstname,LEN(be.firstname) - CHARINDEX(' ',be.firstname)-1) as updatedlastname 
FROM b2bemployee be 
WHERE be.id=2319 
Смежные вопросы