2009-06-15 8 views
16

Sto creando una stored procedure nel database Sql Server 2008. Voglio restituire il numero di righe interessate. Qual è l'opzione migliore SET NOCOUNT OFF o RETURN @@ ROWCOUNT?SET NOCOUNT OFF o RETURN @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

So che entrambi funzionano, ma quale è una scelta migliore e perché?

Dopo alcuni tentativi, sono giunto alla conclusione che SET NOCOUNT è OFF per impostazione predefinita all'interno delle stored procedure. È possibile modificare questo comportamento all'interno del mio database?

risposta

23

Utilizzare @@ RowCount. È esplicito e trasparente, è interamente controllato dal tuo codice piuttosto che da un comportamento predefinito.

L'opzione NOCOUNT può essere impostata manualmente su valore predefinito su ON (Opzioni> Esecuzione query> SQL Server> Avanzate). Se lo si imposta in questo modo, ma quindi si dichiara SET NOCOUNT OFF nella stored procedure, tale impostazione locale ha la precedenza.

4

So che avere SET NOCOUNT ON farebbe pensare a un DataAdapter che ci fosse un conflitto di concorrenza.

È possibile read about it on MSDN. Se il codice verrà utilizzato da DataAdapters, ovviamente non utilizzare SET NOCOUNT ON.

Sembra SqlCommand also has this behaviour, che suppongo sia il motivo per cui DataAdapter ha un problema (come sotto la cappa userà un oggetto Command).

+0

Non vedo nulla menzionato su SET NOCOUNT nella documentazione di SqlCommand. Sei sicuro che ci sia lo stesso problema con DataAdapters? – niaher

+1

Google it- troverete molte prove che lo fa: http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aficficio&channel=s&hl=en&q=ExecuteNonQuery+ NOCOUNT & meta = & btnG = Google + Search. Non posso essere sicuro che sia lo stesso problema di DataAdapters senza testarlo, ma non vedo perché ci sarebbe un altro motivo. – RichardOD

5

Non utilizzare RETURN per i valori. Per convenzione RETURN dalle stored procedure è per i codici di errore, 0 significa nessun errore e non-0 significa un qualche tipo di problema. Se hai bisogno di dati indietro, il modo appropriato per farlo è con un parametro OUTPUT. È un po 'contro-intuitivo basato sull'uso del rendimento di altri linguaggi.

+0

C'è un motivo per questo: l'ultimo controllo, RETURN è limitato ai valori di cortocircuito, ovvero il valore massimo restituibile è 65535. – enorl76

2

Motivi per utilizzare SET NOCOUNT ON/OFF:

per controllare l'overflow dello stack durante l'inserimento righe in qualsiasi tabella. Passare i messaggi T-Sql durante l'esecuzione delle query o delle query nidificate. Per mostrare o visualizzare le ultime query eseguite. Per ottenere informazioni sull'ultima escalation dei record.

0

perché usiamo SET NOCOUNT on/off ---

Ans: siamo in grado di capire questo seguendo i passi

passo 1: eseguire la query "select top 10 * dal nome della tabella" .

passaggio 2: finestra di messaggio aperta mostra un messaggio "10 righe interessate". crea overhead aggiuntivi e prolunga i tempi di esecuzione.

passaggio 3: per superare questo overhead aggiuntivo, utilizzare SET NOCOUNT ON. Se è attivo, non conterà mai il numero di ritorni di riga, invece, semerà un comando di messaggio completato con successo.

passaggio 4: per impostazione predefinita NOCOUNT è ON, quindi conta il numero di righe restituite, motivo per cui il mio suggerimento è di disattivarlo durante la creazione di nuove procedure per ottenere prestazioni migliori dal server di database.