我们可以传递参数到SQL中的视图?

我们可以将parameter passing给Microsoft SQL Server中的视图吗?

我尝试以下面的方式create view ,但是它不起作用:

 create or replace view v_emp(eno number) as select * from emp where emp_id=&eno; 

如前所述,你不能。

一个可能的解决scheme是实现一个存储的function,如:

 CREATE FUNCTION v_emp (@pintEno INT) RETURNS TABLE AS RETURN SELECT * FROM emp WHERE emp_id=@pintEno; 

这使您可以将其用作普通视图,具有以下function:

 SELECT * FROM v_emp(10) 

有两种方法可以实现你想要的不幸,既不能用视图来完成。

您可以创build一个表值的用户定义的函数,它接受所需的参数并返回查​​询结果

或者你可以做几乎相同的事情,但创build一个存储过程,而不是一个用户定义的function。

例如

存储过程将如下所示

 CREATE PROCEDURE s_emp ( @enoNumber INT ) AS SELECT * FROM emp WHERE emp_id=@enoNumber 

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

 CREATE FUNCTION u_emp ( @enoNumber INT ) RETURNS TABLE AS RETURN ( SELECT * FROM emp WHERE emp_id=@enoNumber ) 

不,就像Mladen Prajdic所说的那样。 将一个视图看作是一个表或一个表的组合上的“静态filter”。 例如:一个视图可以将OrderCustomer组合起来,这样你就可以从Order得到一个新的“表格”以及包含客户名称和客户编号(表格组合)的新列。 或者您可以创build一个仅从Order表(静态filter)中select未处理订单的视图。

然后,您可以从视图中select,就像您从任何其他“普通”表中select一样 – 所有的“非静态”过滤必须在视图之外进行(例如“获取所有Miller客户的订单”或“获取未处理的订单那是十二月二十四号“)。

没有。 如果您必须使用可以将parameter passing到的用户定义函数。

在没有存储过程或函数的情况下做这件事的方法就是在数据库中创build一个设置表,使用列Id,Param1,Param2等。在表中插入一行,其中包含Id = 1,Param1 = 0,Param2 = 0等。然后,您可以在视图中为该表添加连接以创build所需的效果,并在运行视图之前更新设置表。 如果有多个用户更新设置表并同时运行视图,则可能出错,否则应该可以正常工作。 就像是:

 CREATE VIEW v_emp AS SELECT * FROM emp E INNER JOIN settings S ON S.Id = 1 AND E.emp_id = S.Param1 

不,查询视图没有区别于从表中select。

要做你想做的,使用一个带有一个或多个参数的表值用户定义函数

一个视图只不过是一个预先设定的“SELECT”语句。 所以唯一真正的答案是:不,你不能。

我认为你真正想做的是创build一个存储过程,原则上你可以使用任何有效的SQL来做你想做的事情,包括接受参数和select数据。

当你从你的视图中select时,你似乎只需要添加一个where子句,但是你并没有提供足够的细节来确定。

不,视图是静态的。 你可以做的一件事(取决于SQl服务器的版本)是索引视图。

在你的例子中(只查询一个表),一个索引视图没有任何好处,只是用一个索引来查询表,但是如果你在有连接条件的表上进行大量的连接,索引视图可以大大提高性能。

我们可以使用input参数编写存储过程,然后使用该存储过程从视图中获取结果集。 看下面的例子。

存储过程是

 CREATE PROCEDURE [dbo].[sp_Report_LoginSuccess] -- [sp_Report_LoginSuccess] '01/01/2010','01/30/2010' @fromDate datetime, @toDate datetime, @RoleName varchar(50), @Success int as If @RoleName != 'All' Begin If @Success!=2 Begin --fetch based on true or false Select * from vw_Report_LoginSuccess where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate) And RTrim(Upper(RoleName)) = RTrim(Upper(@RoleName)) and Success=@Success End Else Begin -- fetch all Select * from vw_Report_LoginSuccess where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate) And RTrim(Upper(RoleName)) = RTrim(Upper(@RoleName)) End End Else Begin If @Success!=2 Begin Select * from vw_Report_LoginSuccess where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate) and Success=@Success End Else Begin Select * from vw_Report_LoginSuccess where logindatetime between dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate) End End 

从中我们可以得到结果集的观点是

 CREATE VIEW [dbo].[vw_Report_LoginSuccess] AS SELECT '3' AS UserDetailID, dbo.tblLoginStatusDetail.Success, CONVERT(varchar, dbo.tblLoginStatusDetail.LoginDateTime, 101) AS LoginDateTime, CONVERT(varchar, dbo.tblLoginStatusDetail.LogoutDateTime, 101) AS LogoutDateTime, dbo.tblLoginStatusDetail.TokenID, dbo.tblUserDetail.SubscriberID, dbo.aspnet_Roles.RoleId, dbo.aspnet_Roles.RoleName FROM dbo.tblLoginStatusDetail INNER JOIN dbo.tblUserDetail ON dbo.tblLoginStatusDetail.UserDetailID = dbo.tblUserDetail.UserDetailID INNER JOIN dbo.aspnet_UsersInRoles ON dbo.tblUserDetail.UserID = dbo.aspnet_UsersInRoles.UserId INNER JOIN dbo.aspnet_Roles ON dbo.aspnet_UsersInRoles.RoleId = dbo.aspnet_Roles.RoleId WHERE (dbo.tblLoginStatusDetail.Success = 0) UNION all SELECT dbo.tblLoginStatusDetail.UserDetailID, dbo.tblLoginStatusDetail.Success, CONVERT(varchar, dbo.tblLoginStatusDetail.LoginDateTime, 101) AS LoginDateTime, CONVERT(varchar, dbo.tblLoginStatusDetail.LogoutDateTime, 101) AS LogoutDateTime, dbo.tblLoginStatusDetail.TokenID, dbo.tblUserDetail.SubscriberID, dbo.aspnet_Roles.RoleId, dbo.aspnet_Roles.RoleName FROM dbo.tblLoginStatusDetail INNER JOIN dbo.tblUserDetail ON dbo.tblLoginStatusDetail.UserDetailID = dbo.tblUserDetail.UserDetailID INNER JOIN dbo.aspnet_UsersInRoles ON dbo.tblUserDetail.UserID = dbo.aspnet_UsersInRoles.UserId INNER JOIN dbo.aspnet_Roles ON dbo.aspnet_UsersInRoles.RoleId = dbo.aspnet_Roles.RoleId WHERE (dbo.tblLoginStatusDetail.Success = 1) AND (dbo.tblUserDetail.SubscriberID LIKE N'P%') 

为什么你需要一个参数? 你可能只使用WHERE子句。

create view v_emp as select * from emp ;

和你的查询应该做的工作:

select * from v_emp where emp_id=&eno;

不,您可以将parameter passing给过程中的视图

据我所知,视图可以像select命令一样。 你也可以添加参数到这个select例如在这样的语句:

  WHERE (exam_id = @var) 

如果你不想使用一个函数,你可以使用这样的东西

 -- VIEW CREATE VIEW [dbo].[vwPharmacyProducts] AS SELECT PharmacyId, ProductId FROM dbo.Stock WHERE (TotalQty > 0) -- Use of view inside a stored procedure CREATE PROCEDURE [dbo].[usp_GetProductByFilter] ( @pPharmacyId int ) AS IF @pPharmacyId = 0 BEGIN SET @pPharmacyId = NULL END SELECT P.[ProductId], P.[strDisplayAs] FROM [Product] P WHERE (P.[bDeleted] = 0) AND (P.[ProductId] IN (Select vPP.ProductId From vwPharmacyProducts vPP Where vPP.PharmacyId = @pPharmacyId) OR @pPharmacyId IS NULL ) 

希望它会有所帮助

这是迄今为止我还没有看到的一个选项:

只需将您想要限制的列添加到视图中:

 create view emp_v as ( select emp_name, emp_id from emp; ) select emp_v.emp_name from emp_v where emp_v.emp_id = (id to restrict by) 

你可以绕过只是为了运行视图,SQL会酒和哭,但只是做到这一点,并运行它! 你不能保存。

 create or replace view v_emp(eno number) as select * from emp where (emp_id = @Parameter1);