跨多个存储过程的通用 WHERE 子句

Common WHERE Clause Across Multiple Stored Procedures

我有很多查询都使用相同的 WHERE 子句,例如:

--Query1
CREATE PROC Query1
    @Param int
AS
BEGIN
    SELECT
        field2,
        COUNT(field2)

    FROM
        some_table

    WHERE
        field1 = condition1
        AND field2 = @Param

    GROUP BY
        field1
END

--Query2
CREATE PROC Query2
    @Param int
AS
BEGIN
    SELECT
        field2,
        COUNT(field2)

    FROM
        some_table

    WHERE
        field1 = condition1
        AND field2 = @Param

    GROUP BY
        field2
END

我想知道我是否可以创建一个函数或某种可以跨查询使用的函数,以防止重复代码并提高可维护性?

您可以为此使用内联 table 值函数

CREATE FUNCTION dbo.some_function 
(   
    @Param INT
)
RETURNS TABLE 
AS
RETURN 
(
      SELECT *
      FROM   some_table
      WHERE  field1 = condition1
             AND field2 = @Param
)

那么您的程序将使用

SELECT field1,
       COUNT(field1)
FROM   dbo.some_function(@Param) 
GROUP  BY field1 

SELECT field2,
       COUNT(field2)
FROM   dbo.some_function(@Param) 
GROUP  BY field2 

如果您确实在函数定义中使用了 *,您必须记得在底层 table 定义随 sp_refreshsqlmodule 发生变化时刷新它,以避免出现奇怪的结果,因此它是明确列出列可能更好。

您可以针对 运行 查询创建一个视图,如果刷新时遇到同样的问题。如果使用 select * 创建视图,则创建的视图的列与创建视图时的 * 相匹配。

CREATE_VIEW func_view AS 
SELECT *
      FROM   some_table
      WHERE  field1 = condition1

然后,运行你的选择喜欢select * from func_view group WHERE field2 = @Param