it-swarm.com.de

SQL Server - SELECT FROM gespeicherte Prozedur

Ich habe eine gespeicherte Prozedur, die Zeilen zurückgibt:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

Mein eigentliches Vorgehen ist etwas komplizierter, weshalb ein Sproc notwendig ist.

Ist es möglich, den Ausgang durch Aufrufen dieser Prozedur auszuwählen?

So etwas wie:

SELECT * FROM (EXEC MyProc) AS TEMP

Ich muss SELECT TOP X, ROW_NUMBER und eine zusätzliche WHERE -Klausel verwenden, um meine Daten zu pagen, und ich möchte diese Werte nicht wirklich als Parameter übergeben.

297
jonathanpeppers

Sie können eine benutzerdefinierte Funktion oder eine Ansicht anstelle einer Prozedur verwenden.

Eine Prozedur kann mehrere Ergebnismengen mit jeweils eigenem Schema zurückgeben. Es ist nicht für die Verwendung in einer SELECT -Anweisung geeignet.

140
Mehrdad Afshari

Du kannst

  1. erstellen Sie eine Tabellenvariable für die Ergebnismenge aus dem gespeicherten Prozess und dann
  2. fügen Sie die Ausgabe des gespeicherten Prozesses in die Tabellenvariable ein, und klicken Sie dann auf OK
  3. verwenden Sie die Tabellenvariable genauso wie jede andere Tabelle ...

... sql ....

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...
168
Charles Bretana

Sie sollten sich diesen ausgezeichneten Artikel von Erland Sommarskog ansehen:

Grundsätzlich werden alle verfügbaren Optionen für Ihr Szenario aufgelistet.

152
kristof

Sie möchten entweder eine Tabellenfunktion oder Ihre EXEC in eine temporäre Tabelle einfügen:

INSERT INTO #tab EXEC MyProc
70
CMerat

Sie müssen über OPENROWSET und OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
41
Rizwan Mumtaz

Sie müssen einen Tabellentyp deklarieren, der die gleiche Anzahl von Spalten enthält, die Ihre Speicherprozedur zurückgibt. Die Datentypen der Spalten im Tabellentyp und die von den Prozeduren zurückgegebenen Spalten sollten identisch sein

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

Anschließend müssen Sie das Ergebnis Ihrer gespeicherten Prozedur in Ihren soeben definierten Tabellentyp einfügen

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

Am Ende wählen Sie einfach aus Ihrem Tabellentyp

Select * from @MyTableType
36
Aamir

Es ist nicht erforderlich, eine temporäre Tabelle zu verwenden.

Das ist meine Lösung

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
32
DavideDM

Sie können die Ausgabe von sp in eine temporäre Tabelle kopieren.

CREATE TABLE #GetVersionValues
(
    [Index] int,
    [Name]  sysname,
    Internal_value  int,
    Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
23
_Seba_

benutze OPENQUERY und setze 'SET FMTONLY OFF; SET NOCOUNT ON; '

Versuchen Sie diesen Beispielcode:

SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')

Wenn 'DATA ACCESS' false ist,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

nach,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

es klappt.

6
Ali Osman Yavuz

Versuchen Sie, Ihre Prozedur in eine Inline-Funktion umzuwandeln, die eine Tabelle wie folgt zurückgibt:

CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)

Und dann kann man es so nennen

SELECT * FROM MyProc()

Sie haben auch die Möglichkeit, Parameter wie folgt an die Funktion zu übergeben:

CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 

Und nenn es

SELECT * FROM FuncName ( @para1 , @para2 )
5
al_the_man

Mit OPENROWSET kannst du ein bisschen schummeln:

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

Dies würde natürlich immer noch das gesamte SP ausführen.

5
MartW

Der Einfachheit halber und um es wieder lauffähig zu machen, habe ich ein System StoredProcedure "sp_readerrorlog" verwendet, um Daten zu erhalten:

-----USING Table Variable
DECLARE @tblVar TABLE (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(MAX),
   [Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar



-----(OR): Using Temp Table
IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
CREATE TABLE #temp (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(55),
   Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp
4
Sheikh Kawser

Es hört sich so an, als müssten Sie nur ein view verwenden. In einer Ansicht kann eine Abfrage als Tabelle dargestellt werden, sodass die Ansicht abgefragt werden kann.

2

Wenn Ihr Server zum Beispiel SERVERX heißt, habe ich das so gemacht ...

EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = 'STUDENT01';
SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
EXEC (@CMD);

Um zu überprüfen, ob dies funktioniert, habe ich die EXEC() - Befehlszeile auskommentiert und durch SELECT @CMD ersetzt, um den Befehl zu überprüfen, bevor ich ihn ausführen wollte! Das sollte sicherstellen, dass alle korrekten Anführungszeichen an der richtigen Stelle stehen. :-)

Ich hoffe das hilft jemandem.

1
Fandango68