簡體   English   中英

轉換為逗號分隔值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM