Sql 转换:转换为逗号分隔的值

Sql 转换:转换为逗号分隔的值,sql,tsql,Sql,Tsql,我遇到了一行,其中有多个值由冒号(:)分隔。 SQL将这些值视为一,并抛出一个错误“无法取消请求的权限”。下面显示的行的示例 Servername Instancename Databasename Environment userid access ITSUSMPW01430 ITSUSMPW01430 ALL DEV userid SYSADMIN:SERVERADMIN 此处要求两个角色,分别为: 需要一些帮助,我们怎样才能让SQL考虑

我遇到了一行,其中有多个值由冒号(:)分隔。 SQL将这些值视为一,并抛出一个错误“无法取消请求的权限”。下面显示的行的示例

Servername  Instancename    Databasename Environment userid      access
ITSUSMPW01430   ITSUSMPW01430   ALL        DEV       userid SYSADMIN:SERVERADMIN
此处要求两个角色,分别为:
需要一些帮助,我们怎样才能让SQL考虑不同的价值?p> 首先,您应该修复数据结构。在一列中存储多个值是个坏主意。相反,您应该有一个表,每个实例有一行和访问权限(假设
instance
是正确的实体)

有时候,你会被别人糟糕的设计决策所困扰。对于仅搜索单个值,可以使用类似于的

where ':'  + access + ':' like '%:' + 'SERVERADMIN' + ':%'

这样的查询不能利用索引,并且优化选项有限。真正的解决方案是创建第二个表,如上所述。

您还可以区分它们

SELECT Servername,
       Instancename,
       Databasename,
       Environment,
       userid,
       a.value('.', 'VARCHAR(MAX)') [access]
FROM
(
    SELECT Servername,
           Instancename,
           Databasename,
           Environment,
           userid,
           CAST('<A>'+REPLACE(access, ':', '</A><A>')+'</A>' AS XML) AS access 
    FROM <table>
) A
CROSS APPLY access.nodes('/A') AS split(a); 

我通过修改下面的代码解决了这个问题

where ':'  + access + ':' like '%:' + 'SERVERADMIN' + ':%'
由于我们需要区分同一列中由:分隔的角色,我使用了下面的查询,它成功地处理了2个以及更多的值

select access from table1 where access like '%:' and access like ':%';

感谢Gordon提供的伪代码。

提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定数据库。感谢您提供的信息。这实际上是从一个网页更新的,我们允许用户根据其业务需求临时选择多个服务器角色。根据上面显示的示例,用户选择了2个角色,并在单个列中进行更新,该列由以下内容区分:。我在应用程序中没有在新行中存储第二个角色的选项。因此,我想知道是否有任何查询可以逐个选择角色并自动为其赋值。上面提到的代码不适用于上面所示的示例。
select access from table1 where access like '%:' and access like ':%';