kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 jonathanpeppers
jonathanpeppers
Question

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 2009-09-29T13:05:57+00:00 15
the  Tin Man
the Tin Man
Întrebarea editată 19 septembrie 2012 в 6:31
Programare
sql-server-2005
sql
sql-server
stored-procedures
Charles Bretana
Charles Bretana
29 septembrie 2009 в 1:11
2009-09-29T13:11:55+00:00
Mai mult
Sursă
Editează
#9525353

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 ...
Charles Bretana
Charles Bretana
Răspuns editat 20 decembrie 2016 в 5:11
175
0
 kristof
kristof
29 septembrie 2009 в 1:16
2009-09-29T13:16:17+00:00
Mai mult
Sursă
Editează
#9525357

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

  • Cum pentru a Partaja Date Între Proceduri Stocate

Practic listează toate opțiunile disponibile pentru scenariu.

156
0
Solution / Answer
Mehrdad Afshari
Mehrdad Afshari
29 septembrie 2009 в 1:13
2009-09-29T13:13:06+00:00
Mai mult
Sursă
Editează
#9525356

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.

Kolappan N
Kolappan N
Răspuns editat 17 iulie 2017 в 1:29
144
0
 CMerat
CMerat
29 septembrie 2009 в 1:11
2009-09-29T13:11:01+00:00
Mai mult
Sursă
Editează
#9525352

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

INSERT INTO #tab EXEC MyProc
72
0
Rizwan Mumtaz
Rizwan Mumtaz
22 februarie 2012 в 7:06
2012-02-22T19:06:46+00:00
Mai mult
Sursă
Editează
#9525359

Trebuie să citiți despre OPENROWSET și OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
 Paul
Paul
Răspuns editat 31 august 2018 в 10:32
41
0
 Aamir
Aamir
18 decembrie 2015 в 2:26
2015-12-18T14:26:14+00:00
Mai mult
Sursă
Editează
#9525362

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
 Aamir
Aamir
Răspuns editat 7 martie 2018 в 1:46
38
0
 DavideDM
DavideDM
15 ianuarie 2014 в 3:12
2014-01-15T15:12:00+00:00
Mai mult
Sursă
Editează
#9525360

Nu este necesar de a utiliza un tabel temporar.

Aceasta este soluția mea

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
34
0
Utilizator anonim
29 septembrie 2009 в 1:12
2009-09-29T13:12:09+00:00
Mai mult
Sursă
Editează
#9525355

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
23
0
Ali  asghar Fendereski
Ali asghar Fendereski
25 august 2016 в 7:38
2016-08-25T07:38:20+00:00
Mai mult
Sursă
Editează
#9525363

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 ')
7
0
 al_the_man
al_the_man
19 februarie 2015 в 1:06
2015-02-19T13:06:48+00:00
Mai mult
Sursă
Editează
#9525361

Î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 )
6
0
Ali  Osman Yavuz
Ali Osman Yavuz
4 mai 2017 в 9:19
2017-05-04T09:19:44+00:00
Mai mult
Sursă
Editează
#9525365

Daca 'DATE de ACCES' fals,

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

după,

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

acesta funcționează.

Ali  Osman Yavuz
Ali Osman Yavuz
Răspuns editat 7 iunie 2017 в 7:44
6
0
 MartW
MartW
29 septembrie 2009 в 1:21
2009-09-29T13:21:17+00:00
Mai mult
Sursă
Editează
#9525358

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.

5
0
Sheikh Kawser
Sheikh Kawser
4 mai 2017 в 1:08
2017-05-04T13:08:25+00:00
Mai mult
Sursă
Editează
#9525366

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
 KirstieBallance
KirstieBallance
Răspuns editat 15 septembrie 2017 в 7:21
4
0
Lawrence Barsanti
Lawrence Barsanti
29 septembrie 2009 в 1:12
2009-09-29T13:12:04+00:00
Mai mult
Sursă
Editează
#9525354

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.

2
0
 Fandango68
Fandango68
4 octombrie 2016 в 3:32
2016-10-04T03:32:07+00:00
Mai mult
Sursă
Editează
#9525364

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.

1
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
Daniel Gogov
Înregistrat 6 zile în urmă
2
工藤 芳則
Înregistrat 1 săptămână în urmă
3
Ирина Беляева
Înregistrat 2 săptămâni în urmă
4
Darya Arsenyeva
Înregistrat 2 săptămâni în urmă
5
anyta nuam-nuam (LapuSiK)
Înregistrat 2 săptămâni în urmă
DE
EL
ES
FR
ID
IT
JA
KO
NL
NO
PT
RO
RU
SK
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire