sql - 如果变量不为空,则使用 where 子句查询
问题描述
我试图查询但没有成功,我想做的是:
ALTER PROCEDURE [dbo].[spPagination] -- ORDER BY id
@filterCol NVARCHAR(20) = NULL, --<<<<
@filterValue NVARCHAR(40) = NULL, --<<<<
@PageNumber INT,
@PageSize INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
Emp.id , Emp.email, Emp.[firstName], Emp.[lastName], Emp.[salary],
Emp.[startDateWork], Emp.age, Rol.[name] AS Role
FROM
[dbo].tblEmployees5m Emp
INNER JOIN
[dbo].[tblRoles] Rol ON Emp.roleId = Rol.id
WHERE
@filterCol LIKE '%' + @filterValue + '%' --<<<<
ORDER BY
id
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE);
SELECT COUNT(1) AS totalCount
FROM [dbo].tblEmployees5m
END
我正在尝试根据@filterCol
and对结果应用过滤器@filterValue
- 如果它们不是 NULL ,那么我想用 where 子句返回结果(现在不起作用)。
否则,如果有 2 个值,NULL
则不要应用 where 子句。@filterCol
将保存列名。@filterValue
将保存列值。
我怎样才能做到这一点?有一个更好的方法?
我建议使用动态 SQL 并阅读了有关它的信息,但我不明白使用它有什么好处……这是正确的方法吗?
解决方案
ALTER PROCEDURE [dbo].[spPagination] -- ORDER BY id
@filterCol NVARCHAR(20) = NULL, --<<<<
@filterValue NVARCHAR(40) = NULL, --<<<<
@PageNumber INT,
@PageSize INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(max)
SET @SQL='SELECT Emp.id , Emp.email, Emp.[firstName], Emp.[lastName], Emp.[salary], Emp.[startDateWork], Emp.age , Rol.[name] as Role
FROM [dbo].tblEmployees5m Emp
inner join [dbo].[tblRoles] Rol
ON Emp.roleId = Rol.id
WHERE 1=1'
IF ISNULL(@filterCol,'')!='' AND ISNULL(@filterCol,'')!=''
SET @SQL= @SQL+' AND @fc LIKE ''%@fv%'''
SET @SQL = @SQL+' ORDER BY id'
IF ISNULL(@PageNumber,'')!='' AND ISNULL(@PageSize,'')!=''
SET @SQL= @SQL+'
OFFSET @PS * (@PN - 1) ROWS
FETCH NEXT @PN ROWS ONLY OPTION (RECOMPILE);'
EXEC SP_EXECUTESQL @SQL, N'@fc NVARCHAR(20) ,@fv NVARCHAR(40) ,@PN INT,@PS INT',@fc=@filterCol,@fv=@filterValue,@PG=@PageNumber,@PS=@PageSize
select count(1) as totalCount from [dbo].tblEmployees5m
END
推荐阅读
- javascript - 如何保护服务器中的路由
- javascript - 如何使链式firebase查询异步
- python - 转换为可操作的日期时间格式
- c++ - 使用提升多精度的数学精度问题
- sql - 尝试在 Big Query 中运行它时,为什么我在这个 sql 中得到一个 Unexpected 关键字 INTERVAL?
- c++ - 我怎样才能用静态变量(C++)干掉这些函数?
- java - (JAVA)如何匹配包含日文字符的字符串以在终端中以相同的长度打印出来
- javascript - eval()的任何替代方法?
- amazon-web-services - 如何启用 lambda 函数以通过 nginx 访问 EC2 实例上的 API
- python - 在 Python 上绘制一个折线图,y 轴上有一个巨大的数字