我正在使用SQL Server 2008 R2
.
在基于角色的访问中从数据库中获取记录时遇到问题。
我有一张桌子让我们说TableA
。我有 5 列,即ID (primary key), FirstName, LastName, RegistrationNumber, EmployeeIdent
.
所有的列except ID
都是Varchar
类型。
我有一个存储过程来搜索记录。我将字符串传递给它并从所有五列中查找匹配的记录。
现在,我面临的问题是基于角色的访问。
要求是当用户为“ Admin
”类型时,从所有五列中查找匹配记录,而当naive
用户类型为“”时,则仅从 ID 列中搜索匹配记录。
我已将变量 @ 传递userType
给存储过程,从中可以确定用户类型。
解决此问题的一种方法是 If Condition。就像if (@userType) = 'Admin'
然后一些查询Else
其他一些。但我不想在 If Condition 中编写查询。
解决此问题的另一种方法是将查询存储在varchar
变量类型中,然后执行是 using 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