Mam procedurę składowaną, która zwraca wiersze:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Moja faktyczna procedura jest nieco bardziej skomplikowana i dlatego potrzebna jest sproc.
Czy można wybrać wyjście, wywołując tę procedurę?
Coś jak:
SELECT * FROM (EXEC MyProc) AS TEMP
Potrzebuję użyć SELECT TOP X
, ROW_NUMBER
i dodatkowej WHERE
klauzuli do stronicowania moich danych, i tak naprawdę nie chcę przekazywać tych wartości jako parametrów.
sql
sql-server
sql-server-2005
stored-procedures
jonathanpeppers
źródło
źródło
Odpowiedzi:
Zamiast procedury można użyć funkcji zdefiniowanej przez użytkownika lub widoku .
Procedura może zwrócić wiele zestawów wyników, każdy z własnym schematem. Nie nadaje się do użycia w
SELECT
oświadczeniu.źródło
Możesz
... sql ....
źródło
INSERT #T
lubINSERT @T
jest to, żeINSERT EXEC
oświadczenie nie mogą być zagnieżdżone. Jeśli procedura przechowywana ma jużINSERT EXEC
w sobie, to nie zadziała.Możesz albo użyć funkcji Valued Table, albo wstawić EXEC do tabeli tymczasowej:
źródło
INSERT #T
lubINSERT @T
jest to, żeINSERT EXEC
oświadczenie nie mogą być zagnieżdżone. Jeśli procedura przechowywana ma jużINSERT EXEC
w sobie, to nie zadziała.Musisz przeczytać o OPENROWSET i OPENQUERY
źródło
Musisz zadeklarować typ tabeli zawierający tę samą liczbę kolumn, którą zwraca procedura sklepu. Typy danych kolumn w typie tabeli i kolumn zwracanych przez procedury powinny być takie same
Następnie musisz wstawić wynik procedury składowanej do właśnie zdefiniowanego typu tabeli
Na koniec wybierz po prostu swój typ stołu
źródło
Nie jest konieczne stosowanie tabeli tymczasowej.
To jest moje rozwiązanie
źródło
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
Możesz skopiować dane wyjściowe ze sp do tabeli tymczasowej.
źródło
użyj OPENQUERY i przed Wykonaj ustaw „SET FMTONLY OFF; USTAW NOCOUNT WŁ; ”
Wypróbuj ten przykładowy kod:
źródło
Spróbuj przekonwertować procedurę na funkcję wbudowaną, która zwraca tabelę w następujący sposób:
A potem możesz to nazwać
Możesz również przekazać parametry do funkcji w następujący sposób:
I nazwij to
źródło
Jeśli „DATA ACCESS” jest fałszywe,
po,
to działa.
źródło
Możesz oszukać trochę za pomocą OPENROWSET:
Oczywiście nadal działałby cały SP.
źródło
Ze względu na prostotę i ponowne uruchomienie, użyłem systemu StoredProcedure „sp_readerrorlog”, aby uzyskać dane:
źródło
Wygląda na to, że możesz potrzebować użyć widoku . Widok pozwala na reprezentację zapytania jako tabeli, dzięki czemu można przeglądać widok.
źródło
Jeśli na przykład twój serwer nazywa się SERVERX, tak to zrobiłem ...
Aby sprawdzić, czy to działa, skomentowałem
EXEC()
wiersz polecenia i zastąpiłem go,SELECT @CMD
aby przejrzeć polecenie przed próbą jego wykonania! Miało to na celu upewnienie się, że cała poprawna liczba pojedynczych cudzysłowów znajduje się we właściwym miejscu. :-)Mam nadzieję, że to komuś pomoże.
źródło