Mai mult
SQL Server - SELECTAȚI DINTR-o procedură stocată
Am si eu o procedură stocată care returnează rânduri:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Meu real procedura este un pic mai complicat, care este de ce o sproc este necesar.
Este posibil să selectați ieșire de asteptare această procedură?
Ceva de genul:
SELECT * FROM (EXEC MyProc) AS TEMP
Am nevoie pentru a folosi, SELECTAȚI TOP X", "ROW_NUMĂR`, și o suplimentare de "UNDE" clauza la pagina mea de date, și eu nu't într-adevăr doresc să treacă aceste valori ca parametri.
312
15
Puteți
... sql ....
Ar trebui să te uiți la acest excelent articol de Erland Sommarskog:
Practic listează toate opțiunile disponibile pentru scenariu.
Puteți utiliza un funcție definită de Utilizator sau vizualizare în loc de o procedură.
O procedura poate returna mai multe seturi de rezultate, fiecare cu propria schemă. L's nu este potrivit pentru utilizarea într-un "SELECTAȚI" declarație.
Ori vrei un Tabelul Evaluate funcția sau introduceți EXEC temporar într-un tabel:
Trebuie să citiți despre OPENROWSET și OPENQUERY
Aveți nevoie pentru a declara un tip tabel care conține același număr de coloane magazin procedura se întoarce. Tipurile de date ale coloanelor din tabelul de tipul și de coloane returnate de proceduri ar trebui să fie același
Apoi, aveți nevoie pentru a introduce rezultatul ta procedură stocată în tabelul de tip tocmai ai definit
În cele din urmă doar selectați din tabelul de tip
Nu este necesar de a utiliza un tabel temporar.
Aceasta este soluția mea
Puteți copia de ieșire de la sp la temporaty masă.
utilizarea OPENQUERY și înainte de a Executa set 'SET FMTONLY OFF; SET NOCOUNT PE;'
Încercați acest cod de probă:
Încearcă să convertești procedură la o Funcție Inline care returnează un tabel, după cum urmează:
Și apoi puteți să-l numim ca
De asemenea, aveți opțiunea de a trece parametrii în funcție, după cum urmează:
Și-l numesc
Daca 'DATE de ACCES' fals,
după,
acesta funcționează.
Puteți trișa un pic cu OPENROWSET :
Acest lucru ar rula întregul SP de fiecare dată, desigur.
Pentru simplificare și pentru a face re-runnable, am folosit un sistem StoredProcedure "sp_readerrorlog" pentru a obține date:
Se pare ca s-ar putea nevoie doar de a utiliza un vezi. Un view permite o interogare pentru a fi reprezentat ca un tabel astfel încât, punctul de vedere, pot fi interogate.
Dacă serverul dvs. este numit SERVERX de exemplu, acest lucru este cum am făcut-o...
Pentru a verifica acest lucrat, am comentat la
EXEC()
în linia de comandă și a înlocuit-o cuSELECT @CMD
a revizui comanda înainte de a încerca să-l execute! Asta a fost să asigurați-vă că toate numărul corect de single-citate au fost în locul potrivit. :-)Sper ca va ajuta pe cineva.