Quando usare SET vs SELECT quando assegnare valori a variabili in SQL Server

By: Atif Shehzad | Updated: 2009-11-25 | Comments (13) | Related: More> T-SQL

Problem

SET and SELECT può essere usato per assegnare valori a variabili tramite T-SQL. Bothfulfill l’attività, ma in alcuni scenari possono essere prodotti risultati imprevisti. In questo punto approfondisco le considerazioni per scegliere tra i metodi SET e SELECT per assegnare un valore alla variabile.,

Soluzione

Nella maggior parte dei casi SET e SELECT possono essere utilizzati in alternativa senza alcun effetto.

Di seguito sono riportati alcuni scenari in cui è necessaria una considerazione nella scelta tra SET o SELECT. Gli script che utilizzano il database AdventureWorks sono forniti per furtherclarification.

Parte 1 e 2 sono menzionati negli script di seguito. Sarebbe meglio se si esegue ogni parte dello script separatamente in modo da poter vedere i risultati per ciascun metodo.,

Restituisce valori attraverso una query

Ogni volta che si assegna un valore restituito alla query a una variabile, SET acceptand assegna un valore scalare (singolo) da una query. Mentre SELECT potrebbe accettare valori multipli. Ma dopo aver accettato più valori attraverso un comando SELECT tunon hanno modo di tenere traccia di quale valore è presente nella variabile. L’ultimo valore restituito nell’elenco popolerà la variabile. A causa di questa situazione, potrebbe portare a risultati attesi in quanto non ci sarebbero errori o avvisi generati se venissero restituiti valori multipli quando si utilizza SELECT., Quindi, se ci si potrebbe aspettare più valoriusa l’opzione SET con la corretta implementazione dei meccanismi di gestione degli errori.

Per chiarire ulteriormente il concetto si prega di eseguire script # 1 in due parti separate tosee i risultati

Parte 1 dello script dovrebbe avere successo. La variabile viene popolata con un singlevalue attraverso SET. Ma nella parte 2 dello script verrà prodotto il seguente messaggio di errore e l’istruzione SET non riuscirà a popolare la variabile quando viene restituito più di un valore.

Messaggio di errore generato per SET

Quindi IMPOSTARE l’assegnazione impedita di un valore ambiguo.,

In caso di SELECT, anche se più valori vengono restituiti dalla query, non verrà generato alcun erroree non ci sarà modo di tenere traccia che più valori sono stati restituitie quale valore è presente nella variabile. Questo è dimostrato nel seguentescript.

Sia la parte 1 che la 2 sono state eseguite con successo. Nella parte 2, sono stati assegnati e accettati più valori, senza sapere quale valore avrebbe effettivamente popolato la variabile., Quindi, quando si prevede il recupero di più valori, considerare le differenze comportamentali tra SET e SELECT e implementare la corretta gestione degli errori per queste circostanze.

Assegnazione di più valori a più variabili

Se è necessario compilare più variabili, invece di utilizzare statementseach SET separati considerare l’utilizzo di SELECT per compilare tutte le variabili in una singola istruzione.Questo può essere usato per compilare le variabili direttamente o selezionando i valori dal database.

Considera il seguente script confrontando l’uso di SELECT e SET.,

Se si utilizza SET, a ciascuna variabile dovrebbero essere assegnati valori individualmenteattraverso più istruzioni come mostrato di seguito.

Ovviamente SELECT è più efficiente di SET mentre assegna valori a multiplevariable in termini di istruzioni eseguite, codice e byte di rete.

Cosa succede se la variabile non viene popolata correttamente

Se una variabile non viene popolata correttamente, il comportamento per SET e SELECTwould essere diverso. L’assegnazione non riuscita può essere dovuta a nessun risultato restituito o a qualsiasi valore non compatibile assegnato alla variabile., In questo caso, SELECT conserverebbe il valore precedente se presente, dove SET assegnerebbe NULL. A causa della differenza di funzionalità, entrambi possono portare a risultati imprevisti e devono essere considerati attentamente.

Questo è mostrato nel seguente script

--Script # 5 - Behavior of SET and SELECT for missing valueUSE AdventureWorksGO -- Part 1. Observe behavior of missing result with SETDECLARE @var1 VARCHAR(20)SET @var1 = 'Value 1 Assigned'PRINT @var1SET @var1 = (SELECT Color FROM Production.Product WHERE ProductID = 32022)PRINT @var1GO -- Part 1. Observe behavior of missing result with SELECTDECLARE @var1 VARCHAR(20)SELECT @var1 = 'Value 1 Assigned'PRINT @var1 SELECT @var1 = Color FROM Production.Product WHERE ProductID = 32023PRINT @var1GO

Possiamo vedere che la parte 1 genera NULL quando non viene restituito alcun valore per populatingvariable. Dove come parte 2 produce il valore precedente che viene conservato dopo failedassignment della variabile. Questa situazione può portare a risultati inaspettati e richiedeconsiderazione.,

Seguendo gli standard

L’uso di SELECT può sembrare una scelta migliore in scenari specifici, ma essere consapevoli che l’uso di SELECT per assegnare valori alle variabili non è incluso negli standard ANSIST. Se si seguono gli standard per scopi di migrazione del codice, evitare di utilizzare SELECT e utilizzare SET.

Conclusione

La migliore pratica suggerisce di non attenersi a un metodo. A seconda dello scenariosi consiglia di utilizzare sia SET che SELECT.,

di Seguito sono alcuni scenari di utilizzo di SET

  • Se è necessario assegnare un valore unico, direttamente variabile e clausole noquery è coinvolto per recuperare valore
  • NULL assegnazioni sono attesi (NULL restituito in un set di risultati)
  • le Norme sono fatte per essere seguite per qualsiasi progetto di migrazione
  • Non scalare i risultati previsti e che sono tenuti a essere gestiti

l’Utilizzo di SELEZIONARE è efficiente e flessibile, in alcuni casi.,

  • Più variabili sono popolate da assegnare direttamente i valori di
  • Più variabili sono popolate da sorgente singola tabella , una vista)
  • Meno di codifica per l’assegnazione di più variabili
  • Utilizzare questa opzione se è necessario per ottenere @@ROWCOUNT e @ERRORE per l’ultima istruzione eseguita
Prossimi Passi
  • Clicca qui per guardare l’assegnazione e la dichiarazione di variabili attraverso un unico statementalong con altre nuove T-SQL miglioramenti in SQL Server 2008.,
  • Clicca qui per saperne di più @@ROWCOUNT
  • Clicca qui per saperne di più @@ERROR

Ultimo Aggiornamento: 2009-11-25

Circa l’autore
Atif Shehzad è un appassionato di SQL Server DBA, revisore tecnico e autore dell’articolo.
Visualizza tutti i miei suggerimenti
Risorse correlate

  • Altri suggerimenti per gli sviluppatori di database…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *