我正在使用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
类型的变量中,然后执行使用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
答案 0 :(得分:0)
SELECT
*
FROM TABLEA
WHERE
(@userType = 'admin'
--add any other criteria for admin type here
) or (
@userType = 'naive'
--add any other criteria for naive type here
)