2012-05-10 14 views
11

Mentre scrivevo alcune query T-SQL con NOEXEC ON, ho riscontrato un comportamento interessante di SQL Server e sono curioso di sapere perché è successo. A volte ho ottenuto soloComportamento interessante in "NOEXEC ON"

Comando (i) riuscito.

messaggio come mi aspettavo, ma a volte ho avuto uno o più

(0 row (s) affected)

messaggi.

so che SET NOEXEC ON comando compila interrogazione, ma non esegue esso, quindi penso che non dovrei ottenuto alcun

(0 row (s) affected)

messaggi.

Nel primo esempio, tutto sembra normale.

SET NOEXEC ON 
INSERT INTO Test (column1) VALUES ('etc') 

Risultato:

Command (s) con successo.

Ma nel secondo esempio, penso che qualcosa vada storto ...

SET NOEXEC ON 
DELETE FROM Test 

risultati:

(0 row (s) affected)

Nel terzo esempio ho usato tabella temporanea:

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 

SET NOEXEC ON 
INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

risultati:

(0 row (s) affected)

E infine ho aggiunto solo GO alla mia domanda, penso risultato è interessante

CREATE TABLE #tmp (id INT IDENTITY(1, 1), idX INT) 
SET NOEXEC ON 
GO 

INSERT INTO #tmp (idX) VALUES (1) 
DELETE FROM Test 

SET NOEXEC OFF 
DROP TABLE #tmp 

Risultato:

(0 fila (s) interessato)

(0 riga (e) interessata)

+0

Hm Non riesco a ripro alcun caso dove ottengo "(0 righe (s) interessate". Né in Denali né in SQL Server 2008. Hai appena eseguito questi testi SQL utilizzando SSMS senza opzioni o azioni speciali? – usr

+0

Sì, ho eseguito questi testi SQL utilizzando SSMS su SQL Server 2008 R2 e non ho usato nessuna opzione speciale. – ogun

risposta

2

Anche se questo potrebbe non essere la risposta alla tua domanda:

Ma quando si elimina

SET NOEXEC ON 
DELETE FROM Test 

Se si aggiunge una condizione WHERE alla DELETE dichiarazione come DELETE FROM Test WHERE COLUMN1='etc'

Si otterrà il risultati desiderati ... Questo comportamento potrebbe essere dovuto alle dichiarazioni DDL e DML che abbiamo eseguito.

Ho anche analizzato la terza situazione in cui se inserisci nella tabella temporanea ti dà (0 righe interessate) ma se lo stesso inserto si trova su un database o una tabella permanente è fatto dà (Comando (i) completato con successo .)

Qui potrebbe essere a causa della tabella temporanea e della tabella permanente.

Per il 4 ° uno è stato aggiunto un GO:

GO eseguirà i relativi comandi SQL n volte.

Quindi, se si esegue singolarmente l'istruzione di inserimento e l'istruzione di cancellazione ha entrambi un valore di ritorno e GO li sta aggiungendo nel piano di lotti.

1

Riproduco il comportamento su SQl Server 2005 e 2008 quindi non è esclusivo per R2 e la stessa cosa accade con l'inserto, accade con la versione di aggiornamento, quindi l'eliminazione sembra essere l'eccezione.Anche Tronca (che è praticamente una cancellazione ottiene il messaggio standard)

Ho anche pensato che potesse essere una cosa di SQL Server Management Studio ma no, ho provato su un altro strumento e l'ho persino eseguito su SQLCMD e potevo vedere lo stesso comportamento :

enter image description here

Se non fosse che il "comando (s) con successo." messaggio non appare (questo deve essere esclusivamente di SSMS)

In ogni caso, non posso spiegare, ma posso indovinare. Immagino che accada perché l'istruzione delete fa qualcos'altro (o meno) che Insert e Update non fanno. Il processo di compilazione è diviso in quattro parti: analisi, normalizzazione, compilazione e ottimizzazione. Presumo che qualcosa all'interno di questi passaggi sia fatto in modo diverso dall'istruzione delete, ecco perché otteniamo un risultato diverso

+0

Grazie per l'interesse. Non penso che troveremo la risposta a meno che non si guardi il codice del server sql ... – ogun

+0

sì, penso che sia fuori discussione :) Mi chiedo se qualcuno potrebbe inviarlo come un "bug"? o almeno come da qualche parte per una spiegazione – Diego

Problemi correlati