根据变量值构建动态查询

时间:2013-07-12 06:13:03

标签: sql sql-server-2008 plsql sql-server-2008-r2

我正在使用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

1 个答案:

答案 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
)