Как разделить CSV от одного столбца до строк в новой таблице в MSSQL 2008 R2 - PullRequest
1 голос
/ 13 сентября 2011

Представьте себе следующий (очень плохой) дизайн таблицы в MSSQL2008R2:

Table "Posts":
| Id (PK, int) | DatasourceId (PK, int) | QuotedPostIds (nvarchar(255)) | [...] 
|     1        |        1               |                               | [...] 
|     2        |        1               |           1                   | [...] 
|     2        |        2               |           1                   | [...] 
[...]
|   102322     |        2               |     123;45345;4356;76757      | [...] 

Итак, столбец QuotedPostIds содержит разделенный точками с запятой список самоссылающихся PostIds (дети, не делайте этого дома!). Поскольку этот дизайн ужасен, я бы хотел извлечь значения из таблицы QuotedPostIds в новую таблицу отношений n: m, например:

Desired new table "QuotedPosts":
| QuotingPostId (int) | QuotedPostId (int) | DatasourceId (int) |
|        2            |        1           |         1          |
|        2            |        1           |         2          |
[...]
|      102322         |       123          |         2          |
|      102322         |      45345         |         2          |
|      102322         |       4356         |         2          |
|      102322         |      76757         |         2          |

Первичным ключом для этой таблицы может быть либо комбинация QuotingPostId, QuotedPostId и DatasourceID, либо дополнительный искусственный ключ, сгенерированный базой данных.

Стоит отметить, что текущая таблица сообщений содержит около 6 300 000 строк, но только около 285 000 из них имеют значение, установленное в столбце QuotedPostIds. Поэтому может быть хорошей идеей предварительно отфильтровать эти строки. В любом случае, я бы хотел выполнить нормализацию, используя только внутреннюю функциональность MSSQL, если это возможно.

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

Спасибо!

€ dit: Я все продумал и наконец решил проблему, используя внешнюю программу на C # вместо внутренней функциональности MSSQL. Поскольку, похоже, это можно было сделать по предложению Микаэля Эрикссона, я отмечу его пост как ответ.

1 Ответ

1 голос
/ 13 сентября 2011

Из комментариев вы говорите, что у вас есть функция разделения строк, которую вы не знаете, как использовать с таблицей.

Ответ должен использовать cross apply как-то так.

select P.Id,
       S.Value
from Posts as P
  cross apply dbo.Split(';', P.QuotedPostIds) as S
...