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.
Puteți
... sql ....
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
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.
Trebuie să citiți despre OPENROWSET și OPENQUERY
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
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
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
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 ')
Î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 )
Daca 'DATE de ACCES' fals,
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
după,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
acesta funcționează.
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
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.