转换:以逗号分隔的值

时间:2017-11-14 12:30:54

标签: sql tsql

我遇到了一行,其中有多个值以冒号(:)分隔。 SQL将值视为1并抛出错误"无法罚款请求的权限"。如下所示的行示例。

Servername  Instancename    Databasename Environment userid      access
ITSUSMPW01430   ITSUSMPW01430   ALL        DEV       userid SYSADMIN:SERVERADMIN

这里要求分配2个角色: 需要一些帮助,我们如何让SQL认为值不同?

3 个答案:

答案 0 :(得分:1)

您也可以区分它们

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); 

结果:

Servername      Instancename    Databasename Environment userid   access
ITSUSMPW01430   ITSUSMPW01430   ALL        DEV          userid      SYSADMIN
ITSUSMPW01430   ITSUSMPW01430   ALL        DEV          userid      SERVERADMIN 

答案 1 :(得分:0)

首先,您应该修复数据结构。在单个列中存储多个值是个坏主意。相反,你应该有一个表,每个实例和访问一行(假设instance是正确的实体)。

有时你会被其他人的设计决定所困扰。仅搜索单个值,您可以使用like

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

此类查询无法利用索引,并且在优化选项中受到限制。真正的解决方案是创建第二个表,如上所述。

答案 2 :(得分:0)

我通过修改以下代码解决了这个问题。

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

由于我们需要区分分隔的角色:在同一列中,我使用了以下查询,它成功地为2以及更多值工作。

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

感谢Gordon的伪代码。