2013-01-24 8 views
31
SELECT col1, 
     col2, 
     col3, 

EXEC GetAIntFromStoredProc(T.col1) AS col4 
    FROM Tbl AS T 
    WHERE (col2 = @parm) 

Wie schreibt man diese SQL-Abfrage in SQL Server 2008?So führen Sie eine gespeicherte Prozedur in einer Select-Abfrage aus

+5

Sie sollten sich Funktionen ansehen, Sie können eine gespeicherte Prozedur nicht innerhalb einer Select-Abfrage aufrufen. – twoleggedhorse

+1

select col1, col2, col3, EXEC GetAIntFromStoredProc (t.col1) als col4 FROM tbl als t wo (col2 = @parm) IST nicht auswählen col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'. Dies ist kein Duplikat, versuchte Bearbeitung, wurde aber abgelehnt, die Antwort in diesem Beitrag ist korrekt – DooMMcQ

Antwort

31

Dank @twoleggedhorse.

Hier ist die Lösung.

  1. Zuerst haben wir eine Funktion

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER 
    
    AS 
    BEGIN 
        DECLARE @id INTEGER 
    
        set @id= (select TOP(1) id From tbl where [email protected]) 
    
        RETURN @id 
    END 
    
  2. dann tun wir die Auswahlabfrage

    Select col1, col2, col3, 
    GetAIntFromStoredProc(T.col1) As col4 
    From Tbl as T 
    Where [email protected] 
    
+36

Aber das ist keine gespeicherte Prozedur mehr ... – levi

+10

Genau. Die richtige Antwort hätte "nicht möglich" sein sollen. – Tundey

+0

Dies ist nicht die Antwort auf die wörtliche Frage bezüglich der Verfahren. Es ist eine alternative Lösung mit großen Einschränkungen. Siehe meine tatsächliche Antwort. – BuvinJ

4

Solange Sie keine INSERT- oder UPDATE-Anweisungen in Ihrer gespeicherten Prozedur ausführen, möchten Sie wahrscheinlich eine Funktion ausführen.

Gespeicherte Prozeduren werden von einem externen Programm oder in einem zeitgesteuerten Intervall ausgeführt.

Die Antworten hier wird erklärt, es besser als ich kann:

Function vs. Stored Procedure in SQL Server

+0

Eine gespeicherte Prozedur kann "zur Ausführung durch ein externes Programm oder in einem zeitlich festgelegten Intervall" verwendet werden, aber sie sind in keiner Weise darauf beschränkt das oder nur für diese Zwecke bestimmt. Skripte werden die ganze Zeit geschrieben, um in einem Stand-Alone-On-Demand-Kontext zur Datenmanipulation ausgeführt zu werden. – BuvinJ

10

Funktionen sind einfach in einer select-Schleife zu nennen, aber sie don‘ Sie können Einfügungen, Aktualisierungen, Löschungen usw. ausführen. Sie sind nur für Abfrageoperationen nützlich. Sie benötigen eine gespeicherte Prozedur, um die Daten zu bearbeiten.

Also die wirkliche Antwort auf diese Frage ist, dass Sie die Ergebnisse einer Select-Anweisung über einen "Cursor" durchlaufen und die Prozedur innerhalb dieser Schleife aufrufen müssen. Hier ein Beispiel:

DECLARE @myId int; 
DECLARE @myName nvarchar(60); 
DECLARE myCursor CURSOR FORWARD_ONLY FOR 
    SELECT Id, Name FROM SomeTable; 
OPEN myCursor; 
FETCH NEXT FROM myCursor INTO @myId, @myName; 
WHILE @@FETCH_STATUS = 0 BEGIN 
    EXECUTE dbo.myCustomProcedure @myId, @myName; 
    FETCH NEXT FROM myCursor INTO @myId, @myName; 
END; 
CLOSE myCursor; 
DEALLOCATE myCursor; 

Beachten Sie, dass @@FETCH_STATUS eine Standardgröße ist, die für Sie aktualisiert wird. Der Rest der Objektnamen ist hier benutzerdefiniert.

Verwandte Themen