2017-11-14 30 views
0

複数の値がコロン(:)で区切られた行が出現しました。 SQLは値を1とみなし、「要求された特権を細かくできません」というエラーをスローします。以下に示す行の例。区切られたここ2つの役割が要求されているコンマ区切り値に換算する:

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

: たちはSQLは値が異なる考慮することができます方法についていくつかの助けが必要ですか?

+0

ヒント:適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO

答えて

0

まず、データ構造を修正する必要があります。複数の値を1つの列に格納することは悪い考えです。代わりに、インスタンスとアクセスごとに1行のテーブルを用意する必要があります(instanceが正しいエンティティであると仮定します)。

時には、他の人の本当に悪い設計決定に悩まされていることがあります。単に単一の値を検索するための、あなたはlikeを使用することができます。

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

このようなクエリは、インデックスを利用することはできませんし、最適化オプションに限定されています。実際の解決策は、上記のように2番目のテーブルを作成することです。

+0

ありがとうございます。これは実際に、ユーザーがビジネス要件に基づいて複数のサーバーロールを一時的に選択できるようにするWebページから更新されます。上記の例のように、ユーザーは2つの役割を選択しており、それは:で区別された1つの列で更新​​されます。私はアプリケーションの中に2番目のロールを新しい行に格納するオプションを持っていません。したがって、私は、ロールを1つずつ選択して自動的に付与するクエリがあるかどうかを知りたがっています。上記のコードは上記の例では機能しません。 – aravind

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 
+0

これは、値を2つの行に分離するために機能しました。 – aravind

0

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

我々はによって区切ら役割を区別する必要があるので:同じ列に、私は以下のクエリを使用し、それが2と同様に複数の値のため、正常に働きました。

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

擬似コードはありがとうございます。

関連する問題