Domanda

Utilizzo SQL Server 2005 e vorrei sapere come accedere a diversi set di risultati da transact-sql.La seguente procedura memorizzata restituisce due set di risultati. Come posso accedervi, ad esempio, da un'altra procedura memorizzata?

CREATE PROCEDURE getOrder (@orderId as numeric) AS
BEGIN   
    select order_address, order_number from order_table where order_id = @orderId
    select item, number_of_items, cost from order_line where order_id = @orderId
END

Devo essere in grado di scorrere entrambi i set di risultati individualmente.

MODIFICARE:Giusto per chiarire la domanda, voglio testare le procedure memorizzate.Ho una serie di procedure memorizzate utilizzate da un client VB.NET, che restituiscono più set di risultati.Questi non verranno modificati in una funzione con valori di tabella, in effetti non posso modificare affatto le procedure.Cambiare la procedura non è un'opzione.

I set di risultati restituiti dalle procedure non hanno lo stesso tipo di dati o numero di colonne.

È stato utile?

Soluzione

La risposta breve è:non puoi farlo.

Da T-SQL non è possibile accedere a più risultati di una chiamata di procedura memorizzata annidata, senza modificare la procedura memorizzata come suggerito da altri.

Per completezza, se la procedura restituisse un unico risultato, potreste inserirlo in una tabella temporanea o in una variabile di tabella con la seguente sintassi:

INSERT INTO #Table (...columns...)
EXEC MySproc ...parameters...

È possibile utilizzare la stessa sintassi per una procedura che restituisce più risultati, ma elaborerà solo il primo risultato, il resto verrà scartato.

Altri suggerimenti

Sono stato in grado di farlo facilmente creando una procedura memorizzata CLR SQL2005 che conteneva un set di dati interno.

Vedete, un nuovo SqlDataAdapter riempirà uno sproc con set di risultati multipli in un set di dati con più tabelle per impostazione predefinita.I dati in queste tabelle possono a loro volta essere inseriti nelle tabelle #Temp nello sproc chiamante che desideri scrivere. set di dati.ReadXmlSchema ti mostrerà lo schema di ciascun set di risultati.

Passo 1:Inizia a scrivere lo sproc che leggerà i dati dallo sproc con set multi-risultato

UN.Creare una tabella separata per ogni set di risultati in base allo schema.

CREATE PROCEDURE [dbo].[usp_SF_Read] AS
SET NOCOUNT ON;
CREATE TABLE #Table01 (Document_ID VARCHAR(100)
  , Document_status_definition_uid INT
  , Document_status_Code VARCHAR(100) 
  , Attachment_count INT
  , PRIMARY KEY (Document_ID));

B.A questo punto potresti dover dichiarare un cursore per chiamare ripetutamente lo sproc CLR che creerai qui:

Passo 2:Crea il CLR Sproc

Partial Public Class StoredProcedures
    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub usp_SF_ReadSFIntoTables()

    End Sub
End Class

UN.Connettiti utilizzando New SqlConnection("context connection=true").

B.Configura un oggetto comando (cmd) per contenere lo sproc con set di risultati multipli.

C.Ottieni tutti i dati utilizzando quanto segue:

    Dim dataset As DataSet = New DataSet
    With New SqlDataAdapter(cmd)
        .Fill(dataset) ' get all the data.
    End With
'you can use dataset.ReadXmlSchema at this point...

D.Itera su ogni tabella e inserisci ogni riga nella tabella temporanea appropriata (che hai creato nel passaggio uno sopra).

Nota finale:Nella mia esperienza, potresti voler imporre alcune relazioni tra le tue tabelle in modo da sapere da quale batch proviene ciascun record.

Questo è tutto!

~ Shaun, vicino a Seattle

C'è un kludge che puoi fare anche tu.Aggiungi un parametro facoltativo N int al tuo sproc.Il valore predefinito di N è -1.Se il valore di N è -1, esegui ciascuna delle tue selezioni.Altrimenti, esegui l'ennesima selezione e solo l'ennesima selezione.

Per esempio,

if (N = -1 or N = 0)
    select ...

if (N = -1 or N = 1)
    select ...

I chiamanti del tuo sproc che non specificano N otterranno un set di risultati con più di una tabella.Se devi estrarre una o più di queste tabelle da un altro sproc, chiama semplicemente il tuo sproc specificando un valore per N.Dovrai chiamare sproc una volta per ogni tabella che desideri estrarre.Inefficiente se è necessaria più di una tabella dal set di risultati, ma funziona in puro TSQL.

Tieni presente che esiste un'ulteriore limitazione non documentata per INSERT INTO ...Dichiarazione EXEC:non può essere annidato.Cioè, il proc memorizzato che l'EXEC chiama (o qualsiasi altro che chiama a sua volta) non può eseguire esso stesso un INSERT INTO ...ESEC.Sembra che ci sia un singolo blocco appunti per processo che accumula il risultato e, se sono annidati, riceverai un errore quando il chiamante lo apre e quindi il chiamato tenta di aprirlo di nuovo.

Matthieu, dovresti mantenere tabelle temporanee separate per ogni "tipo" di risultato.Inoltre, se stai eseguendo la stessa operazione più volte, potresti dover aggiungere una colonna aggiuntiva al risultato per indicare da quale chiamata è derivato.

Purtroppo è impossibile farlo.Il problema è, ovviamente, che non esiste una sintassi SQL che lo consenta.Ovviamente succede "sotto il cofano", ma non è possibile ottenere questi altri risultati in TSQL, solo dall'applicazione tramite ODBC o altro.

C'è un modo per aggirare il problema, come per la maggior parte delle cose.Il trucco è usare l'automazione ole in TSQL per creare un oggetto ADODB che apra ogni set di risultati a turno e scriva i risultati nelle tabelle nominate (o fai quello che vuoi con i set di risultati).puoi farlo anche in DMO se ti piace il dolore.

Ci sono due modi per farlo facilmente.Inserisci i risultati in una tabella temporanea e quindi fai riferimento alla tabella temporanea dal tuo sproc.L'altra alternativa è inserire i risultati in una variabile XML utilizzata come variabile OUTPUT.

Ci sono, tuttavia, pro e contro in entrambe queste opzioni.Con una tabella temporanea, dovrai aggiungere il codice allo script che crea la procedura chiamante per creare la tabella temporanea prima di modificare la procedura.Inoltre, dovresti ripulire la tabella temporanea alla fine della procedura.

Con XML, può richiedere un uso intensivo della memoria e lento.

È possibile selezionarli in tabelle temporanee o scrivere funzioni con valori di tabella per restituire set di risultati.Ti chiedono come scorrere i set di risultati?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top