Domanda

Ecco la mia configurazione:

  • Ho uno script batch riutilizzabile che utilizzo per aggiornare il mio database.
  • All'interno di quello script batch, ho un codice che dice quanto segue:
    • Se la tabella "A" non esiste, crea la tabella "A" e inserisci le righe al suo interno.
  • Più avanti nello script batch, creo uno schemabound vista indicizzata su quel tavolo.
  • A volte, quando rieseguo lo script, ovvero dopo che la tabella è stata creata, SQL Server Management Studio valuta il codice "inserisci righe", che è protetto dal codice "Se questa tabella non esiste", e restituisce quanto segue errore:

    MSG 1934, Livello 16, Stato 1, Linea 15 INSERT non riuscito perché le seguenti opzioni di set hanno impostazioni errate:'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'.Verificare che le opzioni SET siano corrette per l'uso con viste indicizzate e/o indici su colonne calcolate e/o indici filtrati e/o notifiche di query e/o metodi con tipo di dati XML e/o operazioni di indice spaziale.

  • Notare che:Se qualcuno dovesse provare questa istruzione INSERT nel vuoto, lo farei pienamente aspettarsi SSMS per generare questo errore.
    • Ma non quando è protetto da un blocco condizionale.

La mia domanda:

Il compilatore SSMS valuta Tutto espressioni, indipendentemente dal fatto che verranno effettivamente eseguite?

È stato utile?

Soluzione

Sì, li valuta tutti, dai un'occhiata a questo

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

MSG 134, Livello 15, Stato 1, linea 12 Il nome variabile '@i2' è già stato dichiarato.I nomi delle variabili devono essere univoci all'interno di un batch di query o di una procedura memorizzata.

Un altro esempio con le tabelle temporanee è qui: Che cos'è la risoluzione dei nomi differita e perché è necessario interessarsene?

l'unica via d'uscita sarebbe avvolgerlo all'interno di SQL dinamico

Altri suggerimenti

Tieni presente che la maggior parte delle impostazioni che menzioni sono a livello di connessione, ad es.nel caso in cui li imposti/modifichi rimangono attivi a meno che non chiudi la connessione o modifichi esplicitamente il loro valore.

Ritornando alla tua domanda.L'errore che menzioni sembra un errore di runtime, ad es.l'INSERT è effettivamente in esecuzione.Sarebbe meglio se potessi mostrare il tuo script (omettendo i dettagli, ma mantenendo i batch).

Modificare:non è il compilatore SSMS che valuta l'SQL che provi a eseguire: è SQL Server.Cosa intendi con "valutare"?È "eseguito"?Quando si esegue un batch (che è ciò che viene effettivamente eseguito da un server), SQL Server esegue prima l'analisi sintattica e genera un errore nel caso in cui ne trovi qualcuno sintattico errore, non viene eseguito nulla in questo momento.Nel caso in cui la sintassi sia corretta, il server avvia l'esecuzione del batch.

Ancora una volta, l'errore che mostri sembra essere tempo di esecuzione - quindi immagino che dovresti osservare attentamente le condizioni e tenere traccia di ciò che accade (o fornirci maggiori dettagli su "a volte").

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