it-swarm.com.de

Können wir Parameter an eine Ansicht in SQL übergeben?

Können wir einen Parameter an eine Ansicht in Microsoft SQL Server übergeben?

Ich habe versucht, create view auf folgende Art und Weise zu create or replace view v_emp(eno number) as select * from emp where emp_id=&eno;

101
arunachalam

Wie schon gesagt, kannst du nicht. 

Eine mögliche Lösung wäre die Implementierung einer gespeicherten Funktion wie: 

CREATE FUNCTION v_emp (@pintEno INT)
RETURNS TABLE
AS
RETURN
   SELECT * FROM emp WHERE [email protected];

Damit können Sie es als normale Ansicht verwenden, mit:

SELECT * FROM v_emp(10)
107
Alex Bagnolini

Es gibt zwei Möglichkeiten, das zu erreichen, was Sie leider nicht wünschen.

Sie können entweder eine benutzerdefinierte Funktion mit Tabellenwert erstellen, die den gewünschten Parameter übernimmt und ein Abfrageergebnis zurückgibt

Oder Sie können fast dasselbe tun, aber eine gespeicherte Prozedur anstelle einer benutzerdefinierten Funktion erstellen.

Zum Beispiel

die gespeicherte Prozedur würde aussehen

CREATE PROCEDURE s_emp
(
    @enoNumber INT
) 
AS 
SELECT
    * 
FROM
    emp 
WHERE 
    [email protected]

Oder die benutzerdefinierte Funktion würde aussehen

CREATE FUNCTION u_emp
(   
    @enoNumber INT
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT    
        * 
    FROM    
        emp 
    WHERE     
        [email protected]
)
29
Gavin

Nein, das geht nicht, wie Mladen Prajdic sagte. Stellen Sie sich eine Ansicht als "statischen Filter" für eine Tabelle oder eine Kombination von Tabellen vor. Zum Beispiel: In einer Sicht können die Tabellen Order und Customer kombiniert werden, so dass Sie eine neue "Tabelle" mit Zeilen aus Order sowie neue Spalten mit dem Namen des Kunden und der Kundennummer (Tabellenkombination) erhalten. Oder Sie erstellen eine Ansicht, die nur unverarbeitete Aufträge aus der Tabelle Order auswählt (statischer Filter).

Sie würden dann aus der Ansicht auswählen, wie Sie es aus einer anderen "normalen" Tabelle auswählen würden. Alle "nicht statischen" Filterungen müssen außerhalb der Ansicht erfolgen (wie "Alle Bestellungen für Kunden mit dem Namen Miller" oder "Nicht verarbeitete Bestellungen abrufen") das kam am 24. Dezember ").

13

Eine harte Methode ohne gespeicherte Prozeduren oder Funktionen wäre das Erstellen einer Einstellungstabelle mit den Spalten Id, Param1, Param2 usw. in Ihrer Datenbank. Fügen Sie in diese Tabelle eine Zeile mit den Werten Id = 1, Param1 = 0, Param2 ein = 0 usw. Dann können Sie dieser Tabelle in Ihrer Ansicht einen Join hinzufügen, um den gewünschten Effekt zu erzielen, und die Einstelltabelle aktualisieren, bevor Sie die Ansicht ausführen. Wenn mehrere Benutzer die Einstellungstabelle aktualisieren und gleichzeitig die Ansicht ausführen, kann dies zu Problemen führen. Ansonsten sollte es jedoch funktionieren. So etwas wie:

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

Normalerweise werden Ansichten nicht parametrisiert. Sie können jedoch immer einige Parameter eingeben. Zum Beispiel mit Session Kontext :

CREATE VIEW my_view
AS
SELECT *
FROM tab
WHERE num = SESSION_CONTEXT(N'my_num');

Aufruf:

EXEC sp_set_session_context 'my_num', 1; 
SELECT * FROM my_view;

Und ein anderer:

EXEC sp_set_session_context 'my_num', 2; 
SELECT * FROM my_view;

DBFiddle Demo

Dasselbe gilt für Oracle (natürlich unterscheidet sich die Syntax für Kontextfunktionen).

8
Lukasz Szozda

Warum brauchen Sie einen Parameter im Blick? Sie können nur die WHERE-Klausel verwenden.

create view v_emp as select * from emp ;

und Ihre Anfrage sollte die Aufgabe erledigen:

select * from v_emp where emp_id=&eno;
7
Mahesh

no . Wenn Sie dann eine benutzerdefinierte Funktion verwenden müssen, an die Sie Parameter übergeben können.

6
Mladen Prajdic

wir können eine gespeicherte Prozedur mit Eingabeparametern schreiben und diese gespeicherte Prozedur dann verwenden, um eine Ergebnismenge aus der Ansicht abzurufen.

die gespeicherte Prozedur lautet

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 [email protected]
   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 [email protected]
 End
 Else
 Begin
  Select * from vw_Report_LoginSuccess
  where logindatetime between  dbo.DateFloor(@fromDate) and dbo.DateSieling(@toDate)
 End

End

und die Ansicht, aus der wir die Ergebnismenge erhalten können, ist

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

Wie ich weiß, kann view so etwas wie der select-Befehl ..__ sein. Sie können diesem select auch Parameter hinzufügen, beispielsweise in where-Anweisungen

 WHERE  (exam_id = @var)
5
Reza Ameri

Eine Ansicht ist nichts anderes als eine vordefinierte SELECT-Anweisung. Die einzige wirkliche Antwort wäre also: Nein, das geht nicht.

Ich denke, Sie möchten wirklich eine gespeicherte Prozedur erstellen, bei der Sie grundsätzlich jedes gültige SQL verwenden können, um zu tun, was Sie möchten, einschließlich der Annahme von Parametern und Auswählen von Daten.

Es scheint wahrscheinlich, dass Sie wirklich nur eine where-Klausel hinzufügen müssen, wenn Sie aus Ihrer Ansicht auswählen. Sie haben jedoch nicht genügend Details angegeben, um sicher zu sein.

5
Kris

Nein, eine Ansicht ist statisch. Sie können (je nach Version des SQL-Servers) die Ansicht indexieren.

In Ihrem Beispiel (Abfragen nur einer Tabelle) hat eine indizierte Sicht keinen Vorteil, wenn Sie einfach die Tabelle mit einem Index abfragen. Wenn Sie jedoch viele Joins in Tabellen mit Join-Bedingungen ausführen, kann eine indizierte Sicht die Leistung erheblich verbessern.

4
John

Nein, eine Sicht wird nicht anders als die Auswahl aus einer Tabelle abgefragt.

Um das zu tun, was Sie möchten, verwenden Sie eine Tabellenwert-benutzerdefinierte Funktion mit einem oder mehreren Parametern

4
MartW

Wenn Sie keine Funktion verwenden möchten, können Sie so etwas verwenden

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

Ich hoffe es wird helfen

3
Adnan Badar

nein Sie können den Parameter an die in der Ansicht angegebene Prozedur übergeben

3
aicuxiao

Hier ist eine Option, die ich bisher nicht gesehen habe:

Fügen Sie einfach die Spalte hinzu, die Sie auf die Ansicht einschränken möchten:

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

Sie können nur die Ansicht umgehen, SQL wird weinig und weinen, aber tun Sie dies und führen Sie es aus! Du kannst nicht retten.

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

Ihre Ansicht kann auf eine externe Tabelle verweisen, die Ihre Parameter enthält. 

Wie bereits erwähnt, kann die Ansicht in SQL Server keine externen Eingabeparameter haben. Mit CTE können Sie jedoch leicht eine Variable in Ihrer Ansicht fälschen. Sie können es in Ihrer Version von SQL Server testen.

CREATE VIEW vwImportant_Users AS
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers, params
    WHERE status > varMinStatus OR name LIKE varType

SELECT * FROM vwImportant_Users

nachgiebige Leistung:

status  name
12      dbo
0       db_accessadmin
0       db_securityadmin
0       db_ddladmin

auch über JOIN

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1
    WHERE status > varMinStatus OR name LIKE varType

auch über CROSS APPLY

WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params
    WHERE status > varMinStatus OR name LIKE varType
1
Oleg Melnikov

Ich habe eine Idee, die ich noch nicht ausprobiert habe. Du kannst tun:

CREATE VIEW updated_customers AS
SELECT * FROM customer as aa
LEFT JOIN customer_rec as bb
ON aa.id = bb.customer_id
WHERE aa.updated_at between (SELECT start_date FROM config WHERE active = 1) 
and (SELECT end_date FROM config WHERE active = 1)

Ihre Parameter werden in der Config-Tabelle gespeichert und geändert.

0
Emman