2009-04-08 2 views

risposta

9

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.

+0

Woah, funziona? Potresti aver cambiato la mia vita SQL! – Dana

+0

Puoi farlo con "seleziona in" e poi rilasciare la tabella dopo? –

+0

Non ricordo se puoi farlo con select in, ma non penso. È necessario creare in anticipo la struttura completa della tabella – cjk

1

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.

1

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.

2

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.