2017-08-01 187 views
1

我有一个SQL视图,我想用传递给它的参数来过滤它。我正在考虑创建一个存储过程,但经过一番研究后,我得出这样的结论:这是不可能的。将参数传递给SQL视图

其他类似的线程建议创建一个存储的函数或存储过程与视图的代码嵌入到它。我的问题是,执行此类任务的最有效方式是什么。我的观点由大约70行代码组成,仅供参考。你怎么看?以下是从另一个线程获取的一些片段。

存储过程看起来像

CREATE PROCEDURE s_emp 
(
    @enoNumber INT 
) 
AS 
SQL VIEW CODE + 
WHERE 
    [email protected]_parameter 

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

CREATE FUNCTION u_emp 
( 
    @enoNumber INT 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SQL VIEW CODE + 
    WHERE  
     [email protected]_parameter 
) 

Source Thread

+8

对待查看就像一个表。使用“存储过程”从'Where'子句中的参数中查看'Select'。 –

+0

@WEI_DBA所以你从'存储过程'执行'view'? –

+3

'Select * From View_Name'将您的视图视为表格。而已。添加一个'Where'子句,用参数等缩小选择范围。使用'Order by'排序。你用桌子做的每一件事,都是你的看法。 –

回答

1

您可以使用存储过程和过滤器内部的观点基于参数

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

因此,您可以独立创建视图,然后使用存储过程进一步过滤视图并返回结果? –

+0

如果视图仅用于存储过程那么为什么仍然创建视图?只需将整个选择存入存储过程 – GuidoG

+0

也总是以“set nocount on”开始每个存储过程 – GuidoG

0

您可以创建一个表值函数,它的行为完全像一个参数化的视图...

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;