【问题标题】:Passing parameters to a SQL view将参数传递给 SQL 视图
【发布时间】:2018-01-08 07:49:19
【问题描述】:

我有一个 SQL 视图,我想使用传递给它的参数对其进行过滤。我正在考虑创建一个存储过程,但是,经过一些研究,我得出的结论是这是不可能的。

其他类似的线程建议创建存储函数或存储过程,并将视图代码嵌入其中。我的问题是,执行此类任务的最有效方法是什么。我的观点由大约 70 行代码组成,仅供记录。你怎么看?下面是一些取自另一个线程的sn-ps。

存储过程看起来像

CREATE PROCEDURE s_emp
(
    @enoNumber INT
) 
AS 
SQL VIEW CODE + 
WHERE 
    parameter=@stored_parameter

或者用户定义的函数看起来像

CREATE FUNCTION u_emp
(   
    @enoNumber INT
)
RETURNS TABLE 
AS
RETURN 
(
    SQL VIEW CODE + 
    WHERE     
        parameter=@stored_parameter
)

Source Thread

【问题讨论】:

  • 把视图当作一张桌子。在 Where 子句中使用带有参数的视图中的 stored procedure 到 Select。
  • @WEI_DBA 所以你可以从stored procedure 执行view?
  • Select * From View_Name 将您的视图视为一张桌子。而已。添加Where 子句以使用参数等缩小选择范围。使用Order by 进行排序。您对表格所做的一切,都与您的视图有关。
  • @WEI_DBA 太好了。感谢您的澄清。

标签: sql-server stored-procedures sql-function


【解决方案1】:

您可以在存储过程中使用视图并根据参数进行过滤

CREATE PROCEDURE s_emp
(
    @enoNumber INT
) 
AS 
BEGIN
   SELECT *
   FROM VIEW_NAME
   WHERE COLUMN_NAME =  @enoNumber
END

【讨论】:

  • 所以你独立创建视图,然后使用存储过程进一步过滤视图并返回结果?
  • 如果视图只在存储过程中使用,那为什么还要创建视图呢?只需将整个选择放入存储过程中
  • 也总是以“set nocount on”开始每个存储过程
  • "@huMpty duMpty" 我想问和@GuidoG一样的问题,如果我们可以将代码直接放在存储过程中,为什么要在这种情况下创建视图?这种方法有什么优势吗?
  • @observer:我建议你阅读Is a view faster than a simple query?
【解决方案2】:

您可以创建一个行为与参数化视图完全相同的表值函数...

SELECT 
    mt.SomeColumn,
    mt.ComeOtherColumn,
    mtvf.FunctionColumn,
    mtvf.AnotherFunctionColumn
FROM 
    dbo.MyTable mt
    JOIN dbo.MyTableValuedFunction('2017-07-01', '2017-08-01') mtvf
        ON mt.SomeColumn = mtvf.SomeColumn;

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2011-06-27
    • 2011-10-07
    • 2011-06-16
    • 1970-01-01
    • 2012-07-09
    • 2011-12-09
    • 2011-10-04
    相关资源
    最近更新 更多