を使用して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