У меня есть Sql Server 2K8 R2 DB с таблицей, в которой есть столбец, содержащий кратные значения, разделенные (char 13 и char 10).
Я создаю скрипт для импорта данных в правильно нормализованной схеме.
Моя исходная таблица содержит что-то вроде этого:
ID | Value
________________
1 | line 1
line 2
________________
2 | line 3
________________
3 | line 4
line 5
line 6
________________
и т. Д.
[править] К вашему сведению, Id - целое число, а значение - nvarchar (3072) [/ edit]
То, что я хочу, это запросить таблицу, чтобы вывести что-то вроде этого:
ID | Value
________________
1 | line 1
________________
1 | line 2
________________
2 | line 3
________________
3 | line 4
________________
3 | line 5
________________
3 | line 6
________________
Я прочитал много ответов здесь на SO, а также в Интернете, и я считаю, что использование master..sptvalues
должно быть решением. Особенно я пытался воспроизвести решение вопроса Разделить один столбец на несколько строк .
Однако безуспешно (подозрение на наличие двух символов приводит к проблемам).
К настоящему времени я написал этот запрос:
SELECT
T.ID,
T.Value,
RIGHT(LEFT(T.Value,spt.Number-1),
CHARINDEX(char(13)+char(10),REVERSE(LEFT(char(13)+char(10)+T.Value,spt.Number-1)))) as Extracted
FROM
master..spt_values spt,
ContactsNew T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13)+char(10) OR SUBSTRING(T.Value,spt.Number,2) = '')
Этот запрос, к сожалению, возвращается:
ID | Value | Extracted
________________________________
1 | line 1 | <blank>
line 2 |
________________________________
1 | line 1 | line 2
line 2 |
________________________________
2 | line 3 | <blank>
________________________________
3 | line 4 | <blank>
line 5 |
line 6 |
________________________________
3 | line 4 | line 5
line 5 | line 6
line 6 |
________________________________
3 | line 4 | line 6
line 5 |
line 6 |
________________________________
<blank>
- пустая строка, а не пустая строка.
Буду признателен за помощь в настройке моего запроса.
[Edit2] Моя исходная таблица содержит менее 200 записей, и производительность не требуется, поэтому я нацеливаюсь на простое решение, а не на эффективное [Edit2]
[Edit3] Исходная база данных доступна только для чтения. Я не могу добавить хранимую процедуру, функцию или тип clr. Я должен сделать это в одном запросе. [Edit3]
[Edit4] Что-то странное ... кажется, что пробелы также рассматриваются как разделители.
Если я запускаю следующий запрос:
SELECT
T.ID,
replace(T.Value, '#', ' '),
replace(RIGHT(
LEFT(T.Value,spt.Number-1),
CHARINDEX( char(13) + char(10),REVERSE(LEFT(char(10) + char(13)+T.Value,spt.Number-0)))
), '#', ' ')
FROM
master..spt_values spt,
(
select contactID,
replace(Value,' ', '#') Value
from ContactsNew where Value is not null
) T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13) + char(10) OR SUBSTRING(T.Value,spt.Number,1) = '')
Я получил правильное количество возвратов (однако, все еще с неправильными значениями) при выполнении этого запроса:
SELECT
T.ID,
T.Value,
RIGHT(
LEFT(T.Value,spt.Number-1),
CHARINDEX( char(13) + char(10),REVERSE(LEFT(char(10) + char(13)+T.Value,spt.Number-0)))
)
FROM
master..spt_values spt,
(
select contactID,
Value
from ContactsNew where Value is not null
) T
WHERE
Type = 'P' AND
spt.Number BETWEEN 1 AND LEN(T.Value)+1
AND
(SUBSTRING(T.Value,spt.Number,2) = char(13) + char(10) OR SUBSTRING(T.Value,spt.Number,1) = '')
разделяется и на пробелы