Sql server 2005 针对SQL server 2005数据库中的CSV字段进行报告

Sql server 2005 针对SQL server 2005数据库中的CSV字段进行报告,sql-server-2005,tsql,csv,parsing,Sql Server 2005,Tsql,Csv,Parsing,好的,我正在针对SQLServer2005中的第三方数据库编写一份报告。除了一个表中的一个字段外,大多数情况下它都是标准化的。他们有一个用户表(包括组)。此表有一个用户ID字段(PK)、一个IsGroup字段(bit)、一个成员字段(文本)。此成员字段有一个以逗号分隔的此组所有成员列表,或者(如果不是组)一个以逗号分隔的此成员所属组列表 问题是,编写存储过程以显示哪些用户在哪些组中的最佳方式是什么?我有一个函数,可以将ID解析成一个表。所以我能想到的最好的方法是创建一个游标,循环遍历每个组,解析

好的,我正在针对SQLServer2005中的第三方数据库编写一份报告。除了一个表中的一个字段外,大多数情况下它都是标准化的。他们有一个用户表(包括组)。此表有一个用户ID字段(PK)、一个IsGroup字段(bit)、一个成员字段(文本)。此成员字段有一个以逗号分隔的此组所有成员列表,或者(如果不是组)一个以逗号分隔的此成员所属组列表

问题是,编写存储过程以显示哪些用户在哪些组中的最佳方式是什么?我有一个函数,可以将ID解析成一个表。所以我能想到的最好的方法是创建一个游标,循环遍历每个组,解析出用户id,将它们写入临时表(使用组id),然后从临时表中选择out

用户表
示例:
ID | IsGroup | Name |成员
1 |正确|管理| 3
2 |真实|力量| 3,4
3 |假|鲍勃| 1,3
4 |假|苏珊| 2
5 |真实|正常| 6
6 |假|账单| 5

我希望我的查询显示: GroupID | UserID
1|3
2|3
2|4
5|6


希望这是有意义的…

您的技术可能是最好的方法。

如果您有(或可以创建)一个包含组的单独表,您可以将其与用户表连接,并将其与charindex函数进行匹配,两边都用逗号填充数据。在部署之前,我将使用一些相当极端的工作负载测试此方法的性能。然而,它确实具有自包含和简单的优点。请注意,将示例更改为使用带有where子句的交叉联接将生成与此完全相同的执行计划

数据示例:
选择*

从(选择1ASID,
“1,2,3”成员
联合
选择2,
“2”
联合
选择3,
“3,1”
联合
选择4,
“2,1”)用户
LEFTJOIN(选择“1”作为成员
联合
选择“2”
联合
选择“3”
联合
选择“4”)组
ONCHARINDEX(“,”+GROUPS.MEMBER+”,“,”,“+USERS.MEMBERS+”,“)>0

结果:

id成员组 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
基于SQL Server不能很好地解析文本数据这一事实。解析未知长度的文本字段的唯一方法是通过循环或游标。这就是我害怕的。谢谢你的帮助。用这种方法进行的初步测试看起来不错。我真的不关心性能,因为这个查询将在一个季度内运行几次,而用户数量将是(可能)的两倍。谢谢你的帮助! 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