を使用してSQL Server 2008 R2
います。
ロール ベース アクセスでデータベースからレコードをフェッチする際に問題に直面しています。
テーブルがありますTableA
。その中に 5 つの列がありID (primary key), FirstName, LastName, RegistrationNumber, EmployeeIdent
ます。
すべての列except ID
はVarchar
型です。
レコードを検索するためのストアド プロシージャがあります。文字列を渡して、5 つの列すべてから一致するレコードを見つけています。
今、私が直面している問題は、役割ベースのアクセスにあります。
要件は、ユーザーが " Admin
" タイプの場合は 5 つの列すべてから一致するレコードを検索することですが、naive
ユーザー タイプが " " の場合は ID 列のみから一致するレコードを検索することです。
変数 @userType
をストアド プロシージャに渡し、そこからユーザー タイプを判別できます。
この問題を解決する 1 つの方法は、If 条件です。if (@userType) = 'Admin'
次に、いくつかのクエリのように、Else
他のいくつかのクエリを実行します。しかし、If条件でクエリを書きたくありません。
これを解決する別の方法は、クエリvarchar
を変数の型に格納してから実行することですがEXEC ()
、サーバーのオーバーヘッドが増えると聞いています (よくわかりません)。
この要件を満たす他の方法はありますか?
レコードを検索するクエリは
DECLARE @SearchText VARCHAR(MAX)= ''
SELECT *
FROM TableA
WHERE
Convert(varchar,ID) LIKE CASE WHEN LEN(@SearchText) = 0 THEN Convert(varchar,ID) ELSE '%'+ ISNULL(@SearchText,'0') + '%' END OR
FirstName LIKE CASE WHEN LEN(@SearchText) = 0 THEN FirstName ELSE '%'+ ISNULL(@SearchText,'') + '%' END OR
LastName LIKE CASE WHEN LEN(@SearchText) = 0 THEN LastName ELSE '%'+ ISNULL(@SearchText,'') + '%' END OR
RegistrationNumber LIKE CASE WHEN LEN(@SearchText) = 0 THEN RegistrationNumber ELSE '%'+ ISNULL(@SearchText,'') + '%' END OR
EmployeeIdent LIKE CASE WHEN LEN(@SearchText) = 0 THEN EmployeeIdent ELSE '%'+ ISNULL(@SearchText,'') + '%' END