Разделение данных ячейки через запятую - PullRequest
1 голос
/ 19 июля 2010

У меня есть электронная таблица с несколькими столбцами, один из которых является столбцом owner_id.Проблема заключается в том, что в этом столбце содержится список идентификаторов владельцев, разделенных запятыми, а не один.

Я импортировал эту электронную таблицу в базу данных sql (2008) и выполнил другие задачи импорта, и теперь у меня естьСтолбец parcel_id в результате этого процесса.

Мне нужно создать запись в моей таблице parcelOwners для каждой пары parcelID / ownerID, но я не уверен, как это сделать при наличии идентификатора владельцав списке с разделителями-запятыми.

Мои таблицы выглядят так:

ImportData
=================
owner_id varchar, 
parcelID int      

sample row (owner_id = '13782, 21431', parcelID = 319)

ParcelOwners
=================
ownerID int,
parcelID int

row from ImportData table should look like:
ownerID = 13782, parcelID = 319
ownerID = 21431, parcelID = 319

Это обычная ситуация для всех, и если да, то как вы можете обойти это?

Ответы [ 3 ]

4 голосов
/ 19 июля 2010

Следующая функция разделит ваш столбец с запятыми в таблицу.Затем вам нужно будет перебрать временную таблицу и вставить 1 строку в таблицу parcelOwners, используя данные из одного столбца.Чтобы это работало, вам понадобится внешний цикл для итерации таблицы parcelOwners и внутренний цикл для итерации таблицы @temptable для каждой строки.Кроме того, не забывайте, что если вы попадете в строку во внешнем цикле без запятых в столбце owner_id, вы не захотите ничего делать.

2 голосов
/ 22 июля 2010

Вы можете легко это сделать, используя XML-функции SQL Server:

WITH xmlData (xml_owner_id,parecelID) AS (
    /* make into xml */
    SELECT cast('<x>'+replace(owner_id,',','</x><x>')+'</x>' as XML)  AS xml_owner_id, parecelID
    FROM ImportData
)
SELECT x.value('.','int') AS owner_id, parecelID /* split up */
FROM xmlData
CROSS APPLY xmlData.xml_owner_id.nodes('//x') AS func(x)
1 голос
/ 20 июля 2010

(В ответ на вопрос @ senloe о том, как использовать функцию, предоставленную @RandomBen)

Этот ответ на предыдущий вопрос показывает, как использовать OUTER APPLY для применения функции к каждой строке таблицы. В вашем случае, и если вы уже запустили код @ RandomBen для создания функции dbo.Split, синтаксис будет выглядеть примерно так:

INSERT INTO ParcelOwners (ownerId, parcelID)
SELECT CONVERT(int, Results.items), ImportData.parcelID
FROM ImportData
OUTER APPLY dbo.Split(ImportData.owner_id, ',') AS Results

(У меня сейчас нет доступа к SQL Server, поэтому я еще не пробовал его. Вы можете запустить его без первой строки, то есть просто начиная с SELECT, чтобы увидеть, какой вывод он собирается сгенерировать, прежде чем Вы фактически делаете ВСТАВКУ).

...