我们能否在Microsoft SQL Server中向视图传递参数?
我尝试以以下方式创建视图,但它不起作用:
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
我们能否在Microsoft SQL Server中向视图传递参数?
我尝试以以下方式创建视图,但它不起作用:
create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;
正如之前所述,你无法这样做。
一个可能的解决方案是实现一个存储函数,例如:
CREATE FUNCTION v_emp (@pintEno INT)
RETURNS TABLE
AS
RETURN
SELECT * FROM emp WHERE emp_id=@pintEno;
这使得你可以将其作为普通视图来使用,包括:
SELECT * FROM v_emp(10)
有两种方法可以实现你想要的。不幸的是,这两种方法都不能使用视图来完成。
你可以创建一个表值用户定义函数,该函数接受你想要的参数并返回查询结果
或者你可以做几乎相同的事情,但创建一个存储过程而不是一个用户定义函数。
例如:
存储过程可能如下所示:
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
)
通常视图是不带参数的。但您可以注入一些参数。例如,使用会话上下文:
CREATE VIEW my_view
AS
SELECT *
FROM tab
WHERE num = SESSION_CONTEXT(N'my_num');
调用:
EXEC sp_set_session_context 'my_num', 1;
SELECT * FROM my_view;
另一个例子:
EXEC sp_set_session_context 'my_num', 2;
SELECT * FROM my_view;
对于Oracle也适用(当然上下文函数的语法是不同的)。
根据Mladen Prajdic所说,不能这样做。将视图视为表格或多个表格的“静态过滤器”。例如:视图可以将Order
和Customer
表格结合起来,以便您获得新的行“表格”来自Order
加上包含客户名称和客户号码的新列(表格的组合)。或者你可以创建一个视图,仅从Order
表中选择未处理的订单(静态过滤器)。
然后,您就可以像从任何其他“常规”表格中选择一样从视图中进行选择-所有“非静态”过滤必须在视图外部完成(例如,“获取所有名为Miller的客户的订单”或“获取12月24日到达的未处理订单”)。
为什么在视图中需要参数?您可以使用WHERE
子句。
create view v_emp as select * from emp ;
并且您的查询应该能够完成工作:
select * from v_emp where emp_id=&eno;
WHERE
而不是视图的WHERE
,性能会有很大提升。 - Doug_IvisonCREATE VIEW v_emp
AS
SELECT *
FROM emp E
INNER JOIN settings S
ON S.Id = 1 AND E.emp_id = S.Param1
不要这样做。如果必须这样做,那么请使用用户定义的函数,并将参数传递给该函数。
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%')
据我所知,视图可以像select命令一样使用。您也可以向此选择添加参数,例如在where语句中,如下所示:
WHERE (exam_id = @var)