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.

Comentarii la întrebare (3)

Puteți

  1. creați un tabel de variabile pentru a ține set de rezultate de stocat și proc apoi
  2. introduce datele de ieșire ale stocate proc în masă variabilă, și apoi
  3. utilizați tabelul de variabile exact ca pe orice alt masă...

... sql ....

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

Ar trebui să te uiți la acest excelent articol de Erland Sommarskog:

Practic listează toate opțiunile disponibile pentru scenariu.

Comentarii (3)
Soluția

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.

Comentarii (6)

Ori vrei un Tabelul Evaluate funcția sau introduceți EXEC temporar într-un tabel:

INSERT INTO #tab EXEC MyProc
Comentarii (1)

Trebuie să citiți despre OPENROWSET și OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
Comentarii (2)

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

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

Apoi, aveți nevoie pentru a introduce rezultatul ta procedură stocată în tabelul de tip tocmai ai definit

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

În cele din urmă doar selectați din tabelul de tip

Select * from @MyTableType
Comentarii (3)

Nu este necesar de a utiliza un tabel temporar.

Aceasta este soluția mea

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

Puteți copia de ieșire de la sp la temporaty masă.

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
Comentarii (0)

utilizarea OPENQUERY și înainte de a Executa set 'SET FMTONLY OFF; SET NOCOUNT PE;'

Încercați acest cod de probă:

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

Încearcă să convertești procedură la o Funcție Inline care returnează un tabel, după cum urmează:

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

Și apoi puteți să-l numim ca

SELECT * FROM MyProc()

De asemenea, aveți opțiunea de a trece parametrii în funcție, după cum urmează:

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

Și-l numesc

SELECT * FROM FuncName ( @para1 , @para2 )
Comentarii (0)

Daca 'DATE de ACCES' fals,

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

după,

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

acesta funcționează.

Comentarii (0)

Puteți trișa un pic cu OPENROWSET :

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

Acest lucru ar rula întregul SP de fiecare dată, desigur.

Comentarii (0)

Pentru simplificare și pentru a face re-runnable, am folosit un sistem StoredProcedure "sp_readerrorlog" pentru a obține date:

-----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
Comentarii (0)

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.

Comentarii (0)

Dacă serverul dvs. este numit SERVERX de exemplu, acest lucru este cum am făcut-o...

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

Pentru a verifica acest lucrat, am comentat la EXEC() în linia de comandă și a înlocuit-o cu SELECT @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.

Comentarii (0)