Se non si riesce a fare ciò, cosa impedisce di essere aggiunto allo standard SQL o T-SQL?È possibile eseguire una selezione sui risultati di una stored procedure in T-SQL
risposta
Non è possibile farlo, tuttavia è possibile farlo come un inserto. per esempio.
insert mytable
exec myStoredProcedure
Inoltre, non nominare mai le procedure memorizzate sp_xxxx. Questo perché SQL cercherà sempre nell'area delle stored procedure di sistema a causa dello sp_ prima di esaminare le procedure memorizzate dall'utente, causando una piccola perdita di prestazioni che potrebbe aggiungerlo per essere abbastanza significativo in un processo eseguito frequentemente.
Cosa succede se il proc memorizzato non restituisce righe? Set di risultati multipli? I cambiamenti? I potenziali usi di un processo memorizzato sono molti e vari.
Se si dispone di SELECT * FROM TableOrView
, è presente una sintassi e una struttura di binding diretto e facilmente controllabile.
Più correttamente, in senso relazionale, un processo memorizzato non è una relazione/tabella, quindi non è possibile selezionare da esso.
Le funzioni definite dall'utente ottengono ciò che si desidera ma consentono al codice di essere conforme a un concetto di relazione/tabella.
Non è possibile farlo, ma è possibile prendere in considerazione una funzione in sqlserver2005. Ecco un esempio di funzione che crea una tabella da una virgola lista
Create Function [dbo].[CsvToInt] (@Array varchar(1000))
returns @IntTable table
(IntValue int)
AS
begin
declare @separator char(1)
set @separator = ','
declare @separator_position int
declare @array_value varchar(1000)
set @array = @array + ','
while patindex('%,%' , @array) <> 0
begin
select @separator_position = patindex('%,%' , @array)
select @array_value = left(@array, @separator_position - 1)
Insert @IntTable
Values (Cast(@array_value as int))
select @array = stuff(@array, 1, @separator_position, '')
end
return
end
E poi semplice selezionare dalla funzione separata ...
Select * FROM dbo.CsvToInt('1,2,3,5')
e si otterrà un valore di tabella.
E 'possibile, ma non certo la strada giusta da percorrere:
USE test
GO
CREATE procedure dbo.select1 AS
SELECT 1
GO
EXEC sp_addlinkedserver @server='OQtest', @datasrc='localhost', @provider='SQLNCLI', @srvproduct=''
GO
SELECT * FROM OPENQUERY(OQtest, 'test.dbo.select1')
Potrebbe anche essere necessario per regolare le impostazioni di protezione sul server per far funzionare tutto questo.
È possibile utilizzare l'approccio descritto da ck ma questo non è veramente consigliato. Puoi controllare la sezione INSERT-EXEC di un ottimo post How to Share Data Between Stored Procedures entro il Erland Sommarskog per ulteriori dettagli.
Possibile duplicato: http://stackoverflow.com/questions/209383/select-columns-from-result-set-of-stored-procedure – Hannele