172 votes

pouvons-nous passer le paramètre à une vue en SQL?

Pouvons-nous passer un paramètre à une vue dans Microsoft SQL Server?

J'ai essayé de create view de la manière suivante, mais ça ne marche pas:

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

161voto

Alex Bagnolini Points 7403

Comme déjà dit, vous ne pouvez pas.

Une solution possible serait d'implémenter une fonction stockée, telle que:

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

Cela vous permet de l'utiliser comme une vue normale, avec:

 SELECT * FROM v_emp(10)
 

42voto

Gavin Points 5301

Il y a 2 façons de réaliser ce que vous voulez malheureusement, aucun des deux ne peut être fait à l'aide d'un point de vue.

Vous pouvez soit créer une table défini par l'utilisateur fonction qui prend le paramètre que vous voulez et retourne le résultat d'une requête

Ou vous pouvez faire à peu près la même chose, mais créer une procédure stockée à la place d'une fonction définie par l'utilisateur.

Par Exemple

la procédure stockée ressemblerait

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

Ou de la fonction définie par l'utilisateur ressemblerait

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

14voto

Thorsten Dittmar Points 28193

Non, vous ne pouvez pas, en tant que Mladen Prajdic dit. Pense que d'un point de vue comme un "filtre statique" sur une table ou une combinaison de tables. Par exemple: un point de vue peut combiner les tables Order et Customer afin de vous obtenir un nouveau "tableau" de lignes à partir d' Order avec de nouvelles colonnes contenant le nom du client et le numéro de client (combinaison de tables). Ou vous pouvez créer une vue qui ne sélectionne que les non transformés, les ordres de l' Order tableau (filtre statique).

Vous devez ensuite sélectionner à partir de la vue comme vous le feriez pour sélectionner à partir de n'importe quel autre "normal" de la table tous les "non-statique" filtrage doit être fait hors de la vue (comme "Obtenir toutes les commandes pour les clients du nom de Miller" ou "prendre les commandes non traitées qui sont venus dans le Dec 24").

6voto

Mladen Prajdic Points 10337

non. si vous devez ensuite utiliser une fonction définie par l'utilisateur à laquelle vous pouvez passer des paramètres.

5voto

sunil Points 21

nous pouvons écrire une procédure stockée avec des paramètres d'entrée, puis utiliser cette procédure stockée pour obtenir un résultat défini à partir de la vue. voir exemple ci-dessous.

la procédure stockée est

 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
 

et la vue à partir de laquelle nous pouvons obtenir le jeu de résultats est

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X