Can we pass parameters to a view in SQL?

前端 未结 20 2119
庸人自扰
庸人自扰 2020-11-29 18:29

Can we pass a parameter to a view in Microsoft SQL Server?

I tried to create view in the following way, but it doesn\'t work:

create o         


        
相关标签:
20条回答
  • 2020-11-29 18:42

    we can write a stored procedure with input parameters and then use that stored procedure to get a result set from the view. see example below.

    the stored procedure is

    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
    

    and the view from which we can get the result set is

    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%')  
    
    0 讨论(0)
  • 2020-11-29 18:42

    Here is an option I have not seen so far:

    Just add the column you want to restrict on to the view:

    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)
    
    0 讨论(0)
  • 2020-11-29 18:43

    Simply use this view into stored procedure with required parameter/s (eg. in SQL Server) and parameter values in querying view.

    Create stored procedure with View/ table: _spCallViewWithParameters

    Execute procedure:

    0 讨论(0)
  • 2020-11-29 18:45

    A hacky way to do it without stored procedures or functions would be to create a settings table in your database, with columns Id, Param1, Param2, etc. Insert a row into that table containing the values Id=1,Param1=0,Param2=0, etc. Then you can add a join to that table in your view to create the desired effect, and update the settings table before running the view. If you have multiple users updating the settings table and running the view concurrently things could go wrong, but otherwise it should work OK. Something like:

    CREATE VIEW v_emp 
    AS 
    SELECT      * 
    FROM        emp E
    INNER JOIN  settings S
    ON          S.Id = 1 AND E.emp_id = S.Param1
    
    0 讨论(0)
  • 2020-11-29 18:47

    As I know view can be something just like select command. You also can add parameters to this select for example in where statements like this:

     WHERE  (exam_id = @var)
    
    0 讨论(0)
  • 2020-11-29 18:47

    If you don't want to use a function, you can use something like this

    -- 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
            )
    

    Hope it will help

    0 讨论(0)
提交回复
热议问题