【发布时间】:2018-09-05 14:33:01
【问题描述】:
我正在尝试查询但没有成功,我正在尝试做的是:
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 和 @filterValue 对结果应用过滤器 - 如果它们不为 NULL,那么我想使用 where 子句返回结果(现在不起作用)。
否则,如果有 2 个值是 NULL,则不要应用 where 子句。 @filterCol 将保存列名。 @filterValue 将保存列值。
我怎样才能做到这一点?有更好的方法吗?
我建议使用动态 SQL 并且我阅读了它,但我不明白使用它有什么好处.. 它是正确的方法吗?
【问题讨论】:
-
这是一种捕获所有查询的类型。 Gail Shaw 在这里写了博客。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries 然后在这里跟进。 sqlservercentral.com/blogs/sqlinthewild/2018/03/13/…
-
@TabAlleman - 我不认为你标记的副本是一回事。那是在谈论传递一个完全不同的表名。
-
@TabAlleman 但这并不是询问是否将列名作为参数传递。这是关于当参数的值为NULL时调整where子句。而且我输错了表格而不是列;)
-
我认为 OP 实际上是在尝试实现两者。
-
@SeanLange,我想说这个问题可以重新编写以解决这个问题,但困扰已发布代码的问题与标记副本中的问题相同。当您想在 SQL Server 中为对象名称使用变量时,您必须使用动态 SQL 或通过条件逻辑发挥创意,副本中最受好评的答案显示了如何使用。仅研究标记的重复项可能会引导发布者找到解决方案,但如果没有,问题可能会被重新措辞,或者可能会创建一个新问题。
标签: sql sql-server tsql stored-procedures