Отчетность по полю CSV в базе данных SQL Server 2005 - PullRequest
0 голосов
/ 05 февраля 2009

Хорошо, поэтому я пишу отчет для сторонней базы данных, которая находится в SQL Server 2005. По большей части она нормализована, за исключением одного поля в одной таблице. У них есть таблица пользователей (которая включает в себя группы). Эта таблица имеет поле UserID (PK), поле IsGroup (бит), поле членов (текст), это поле членов имеет разделенный запятыми список всех членов этой группы. или (если не группа) разделенный запятыми список групп, к которым принадлежит этот участник.

Вопрос в том, как лучше всего написать хранимую процедуру, которая показывает, какие пользователи входят в какие группы? У меня есть функция, которая разбирает идентификаторы в таблицу. Таким образом, лучший способ, которым я мог придумать, это создать курсор, который циклически перебирает каждую группу и анализировать идентификатор пользователя, записывать их во временную таблицу (с идентификатором группы) и затем выбирать из временной таблицы?

UserTable
Пример:
ID | IsGroup | Имя | Пользователи
1 | Правда | Администратор | 3
2 | Истинная | Мощность | 3,4
3 | Ложная | Боб | 1,3
4 | Ложная | Susan | 2
5 | Правда | Нормальный | 6
6 | Ложная | Билл | 5

Я хочу, чтобы мой запрос показывал: GroupID | Идентификатор_пользователь
1 | 3
2 | 3
2 | 4
5 | 6

Надеюсь, что это имеет смысл ...

Ответы [ 2 ]

0 голосов
/ 10 февраля 2009

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

Пример с данными:
SELECT * <br>FROM (SELECT 1 AS ID, <br> '1,2,3' AS MEMBERS <br> UNION <br> SELECT 2, <br> '2' <br> UNION <br> SELECT 3, <br> '3,1' <br> UNION <br> SELECT 4, <br> '2,1') USERS <br> LEFT JOIN (SELECT '1' AS MEMBER <br> UNION <br> SELECT '2' <br> UNION <br> SELECT '3' <br> UNION <br> SELECT '4') GROUPS <br> ON CHARINDEX(',' + GROUPS.MEMBER + ',',',' + USERS.MEMBERS + ',') > 0</p> <p>

Результаты:

id  members group
1   1,2,3   1
1   1,2,3   2
1   1,2,3   3
2   2       2
3   3,1     1
3   3,1     3
4   2,1     1
4   2,1     2
0 голосов
/ 07 февраля 2009

Ваша техника, вероятно, будет лучшим методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...