2009-11-06 13 views
76

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

Ich versuchte create view in der folgenden Art und Weise, aber es funktioniert nicht:

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

Eine Ansicht ist eine gespeicherte SQL-Text einer ausgewählten Abfrage. Parameter sind nicht in der Diskussion. Wenn Ihre gespeicherte Abfrage die Spalte zurückgibt, in der Sie filtern möchten, können Sie dies in der aufrufenden Abfrage tun. Z.B. "SELECT * FROM v_emp WHERE emp_id =?" – Epicurist

Antwort

5

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

11

Nein, können Sie nicht, wie Mladen Prajdic sagte. Stellen Sie sich eine Ansicht als "statischen Filter" für eine Tabelle oder eine Kombination von Tabellen vor. Beispiel: Eine Ansicht kann die Tabellen Order und Customer kombinieren, so dass Sie eine neue "Tabelle" von Zeilen aus Order zusammen mit neuen Spalten erhalten, die den Namen des Kunden und die Kundennummer enthalten (Kombination von Tabellen). Oder Sie erstellen eine Sicht, die nur unverarbeitete Aufträge aus der Tabelle Order (statischer Filter) auswählt.

Sie würden dann aus der Ansicht wählen, wie Sie aus einer anderen "normalen" Tabelle auswählen würden - alle "nicht statische" Filterung muss außerhalb der Ansicht erfolgen (wie "Holen Sie alle Bestellungen für Kunden namens Miller" oder "Bekommen Sie unverarbeitete Bestellungen, die am 24. Dezember eintrafen").

24

Es gibt 2 Möglichkeiten, was man leider acheive wollen weder kann mit einem Blick erfolgen.

können Sie entweder erstellen Sie eine Tabelle bewertet Funktion Benutzer definiert, die den Parameter führt Sie wollen und gibt ein Abfrageergebnis

Oder Sie können so ziemlich das gleiche tun, aber eine gespeicherte Prozedur statt einer benutzerdefinierten Funktion erstellen.

Für Beispiel

die gespeicherte Prozedur wie

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

oder die benutzerdefinierte Funktion wie

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

kein können Sie die Parameter an die Prozedur in Sicht aussehen würde aussehen würde passieren

94

Wie bereits erwähnt, können Sie nicht.

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

Auf diese Weise können Sie es als eine normale Ansicht verwenden, mit:

wäre eine mögliche Lösung, die eine gespeicherte Funktion, wie zu implementieren sein

SELECT * FROM v_emp(10) 
+0

Was sind die praktischen Unterschiede zwischen dieser und einer Ansicht? Können Sie Benutzerberechtigungen zuweisen, um nur auf diese Funktion zuzugreifen? – MikeMurko

+0

In MySQL schreiben Sie eine gespeicherte Prozedur und die letzte Anweisung in der Prozedur ist die Ergebnismenge, die zurückgegeben werden soll. – bobobobo

+0

können wir diese Anfrage ohne Probleme von JDBC-Code in Java verwenden? – mounaim

4

Ein Blick nichts ist mehr als eine vordefinierte SELECT-Anweisung. Die einzige wirkliche Antwort wäre: Nein, das geht nicht.

Ich denke, was Sie wirklich tun möchten, ist eine gespeicherte Prozedur zu erstellen, wo Sie prinzipiell jede gültige SQL verwenden können, um zu tun, was Sie wollen, einschließlich Parameter akzeptieren und Daten auswählen.

Es scheint wahrscheinlich, dass Sie wirklich nur eine where-Klausel hinzufügen müssen, wenn Sie aus Ihrer Sicht auswählen, aber Sie haben nicht wirklich genug Details angegeben, um sicher zu gehen.

4

Nein, eine Ansicht ist statisch. Eine Sache, die Sie tun können (abhängig von der Version des SQl-Servers), ist eine Indexansicht.

In Ihrem Beispiel (Abfragen nur einer Tabelle) hat eine indizierte Sicht keinen Vorteil, die Tabelle einfach mit einem Index abzufragen, aber wenn Sie viele Joins für Tabellen mit Join-Bedingungen durchführen, kann dies eine indizierte Sicht sein stark verbessern die Leistung.

4

wir können eine gespeicherte Prozedur mit Eingabeparametern schreiben und dann diese gespeicherte Prozedur verwenden, um eine Ergebnismenge aus der Ansicht zu erhalten. siehe Beispiel unten.

die gespeicherte Prozedur ist

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 der Blick aus dem 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

A hacky Weg, es ohne gespeicherte Prozeduren oder Funktionen zu tun, wäre ein zu schaffen Tabelle mit den Spalten Id, Param1, Param2 usw. einfügen. Fügen Sie eine Zeile in die Tabelle ein, die die Werte Id = 1, Param1 = 0, Param2 = 0 usw. enthält. Dann können Sie der Tabelle in Ihrer Tabelle einen Join hinzufügen Zeigen Sie, um den gewünschten Effekt zu erstellen, und aktualisieren Sie die Einstellungstabelle, bevor Sie die Ansicht ausführen w. Wenn Sie mehrere Benutzer haben, die die Tabelle der Einstellungen aktualisieren und die Ansicht gleichzeitig ausführen, können die Dinge schief gehen, aber ansonsten sollte es OK funktionieren. Etwas wie:

+7

Ja, du hast Recht. Dies ist eine schreckliche Lösung. – Ben

+0

wäre es schrecklich, es für eine Anfrage zu verwenden. Aber es ist als Konfiguration/Bühne/Umgebung wirklich verwendbar, solche versteckten Parameter zu verwenden. Ein Plus für mich dafür. – TPAKTOPA

3

Wie ich weiß, kann Ansicht etwas genau wie Befehl auswählen. Sie können auch Parameter zu dieser Auswahl hinzufügen zum Beispiel in denen Aussagen wie folgt aus:

WHERE (exam_id = @var) 
+0

Dies sollte als Antwort akzeptiert werden. Einfach, einfach und auf den Punkt gebracht. Vielen Dank :) – FrenkyB

5

Warum Sie einen Parameter im Hinblick müssen? Sie könnten einfach WHERE Klausel verwenden.

create view v_emp as select * from emp ; 

und Ihre Abfrage sollte die Arbeit machen:

select * from v_emp where emp_id=&eno; 
+3

In einigen Fällen wird es eine große Leistungsverbesserung geben, wenn es ein 'WHERE' für die Tabelle ist, anstatt ein' WHERE' für die Ansicht. –

3

Wenn Sie eine Funktion nicht verwenden möchten, können Sie so etwas wie dieses

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

Hoffe, es wird helfen können

1

Sie können umgehen, nur um die Ansicht zu starten, SQL wird Wein und weinen, aber nur das tun und es ausführen! Sie können nicht speichern.

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

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

Fügen Sie einfach die Spalte, die Sie der Ansicht wollen beschränken auf:

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

Ihre Ansicht einige externe Tabelle verweisen kann enthalten Ihre Parameter.

Wie bereits erwähnt, kann die Ansicht in SQL Server keine externen Eingabeparameter haben.Sie können jedoch eine Variable in Ihrer Ansicht mithilfe von CTE leicht 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 

Nachgeben Ausgang:

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 
Verwandte Themen