我遇到了一行,其中有多个值以冒号(:)分隔。 SQL将值视为1并抛出错误"无法罚款请求的权限"。如下所示的行示例。
Servername Instancename Databasename Environment userid access
ITSUSMPW01430 ITSUSMPW01430 ALL DEV userid SYSADMIN:SERVERADMIN
这里要求分配2个角色: 需要一些帮助,我们如何让SQL认为值不同?
答案 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的伪代码。