0

を使用してSQL Server 2008 R2います。

ロール ベース アクセスでデータベースからレコードをフェッチする際に問題に直面しています。

テーブルがありますTableA。その中に 5 つの列がありID (primary key), FirstName, LastName, RegistrationNumber, EmployeeIdentます。

すべての列except IDVarchar型です。

レコードを検索するためのストアド プロシージャがあります。文字列を渡して、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
4

1 に答える 1