[英]Convert : to comma separated value
我遇到了一行,其中有多個值用冒號(:)分隔。 SQL將該值視為1並引發錯誤“無法對請求的權限進行罰款”。 下面顯示的行示例。
Servername Instancename Databasename Environment userid access
ITSUSMPW01430 ITSUSMPW01430 ALL DEV userid SYSADMIN:SERVERADMIN
這里要求兩個角色分開,這些角色由分隔:需要一些幫助,使我們如何使SQL考慮值的不同?
您也可以區分它們
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
首先,您應該修復數據結構。 在單個列中存儲多個值是一個壞主意。 取而代之的是,您應該有一個表,每個實例具有一行並且可以訪問(假設instance
是正確的實體)。
有時,您會陷入別人的錯誤設計決定中。 僅搜索單個值,可以使用like
:
where ':' + access + ':' like '%:' + 'SERVERADMIN' + ':%'
這樣的查詢不能利用索引,並且在優化選項中受到限制。 真正的解決方案是如上所述創建第二個表。
我通過修改以下代碼解決了該問題。
where ':' + access + ':' like '%:' + 'SERVERADMIN' + ':%'
由於我們需要區分由:分隔的角色,因此在同一列中,我使用了以下查詢,該查詢成功處理了2個以及更多的值。
select access from table1 where access like '%:' and access like ':%';
謝謝戈登的偽代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.