atunci Când se utilizează SET vs SELECTAȚI atunci când atribuirea de valori variabilelor în SQL Server

De: Atif Shehzad | Actualizat: 2009-11-25 | Comentarii (13) | Legate de: Mai > T-SQL

Probleme

SET și SELECTAȚI poate fi folosit pentru a atribui valori variabilelor prin T-SQL. Ambeleîndeplinesc sarcina, dar în unele scenarii pot fi produse rezultate neașteptate. În thistip am elabora pe considerentele pentru alegerea între SET și selectați metodepentru atribuirea unei valori variabile.,

soluție

în cele mai multe cazuri SET și selectați pot fi utilizate alternativ, fără nici un efect.

următoarele sunt câteva scenarii atunci când este necesară luarea în considerare în alegerea betweenSET sau selectați. Scripturile care utilizează baza de date AdventureWorks sunt furnizate pentru continuareclarificare.

Partea 1 și 2 sunt menționate în scripturile de mai jos. Ar fi mai bine dacă rulațifiecare parte a scriptului separat, astfel încât să puteți vedea rezultatele pentru fiecare metodă.,

returnarea valorilor printr-o interogare

ori de câte ori atribuiți o valoare returnată interogării unei variabile, SET va accepta și va atribui o valoare scalară (unică) dintr-o interogare. În timp ce selectați ar putea accepta valori multiplereturned. Dar după ce ați acceptat mai multe valori printr-o comandă SELECTATĂNU au cum să urmărească ce valoare este prezentă în variabilă. Ultima valoare returnatăîn listă va popula variabila. Din cauza acestei situații, poate duce la rezultate așteptate, deoarece nu ar exista nicio eroare sau avertizare generată dacă multiplevalues au fost returnate la utilizarea SELECT., Deci, dacă se pot aștepta mai multe valoareutilizați opțiunea setată cu implementarea corectă a mecanismelor de gestionare a erorilor.pentru a clarifica în continuare conceptul vă rugăm să rulați script # 1 în două părți separate pentru a vedea rezultatele

Partea 1 a scriptului ar trebui să aibă succes. Variabila este populată cu un singurvaloare prin SET. Dar, în partea 2 a script-ul următorul mesaj de eroare va fi produs și declarația SET nu va reuși să populeze variabila atunci când mai mult deo valoare este returnat.

mesaj de eroare generat pentru SET

prin urmare, setați atribuirea împiedicată a unei valori ambigue.,

În caz de SELECTARE, chiar dacă mai multe valori sunt returnate de interogare, nu errorwill fi generate și nu va fi nici o modalitate de a urmări mai multe valori au fost returnedand care valoarea este prezent în variabilă. Acest lucru este demonstrat în cele ce urmeazăcript.

ambele părți 1 și 2 au fost executate cu succes. În partea a 2-a, mai multe valori au fost atribuite și acceptate, fără a ști ce valoare ar popula de fapt variabila., Deci, atunci când recuperarea mai multor valori este de așteptat, apoi ia în considerare diferențele de comportament între SET și selectați și să pună în aplicare tratarea corectă a erorilor pentru aceste circumstanțe.

atribuirea mai multor valori la mai multe variabile

dacă trebuie să populați mai multe variabile, în loc să utilizați separat set statementseach dată ia în considerare utilizarea SELECT pentru popularea tuturor variabilelor într-o singură declarație.Acest lucru poate fi folosit pentru popularea variabilelor direct sau prin selectarea valorilor din Baza de date.

luați în considerare următorul script comparând utilizarea SELECT și SET.,

dacă utilizați SET, atunci fiecare variabilă ar trebui să fie atribuite valori individualprin mai multe declarații așa cum se arată mai jos.

evident, selectați este mai eficient decât setat în timp ce atribuirea valorilor multiplevariables în termeni de declarații executate, cod și octeți de rețea.

ce se întâmplă dacă variabila nu este populată cu succes

dacă o variabilă nu este populată cu succes, atunci comportamentul pentru setare și selectare ar fi diferit. Atribuirea eșuată poate fi cauzată de niciun rezultat returnat sau de orice valoare necompatibilă atribuită variabilei., În acest caz, selectați ar păstra precedentulvaloare dacă există, unde SET ar atribui NULL. Din cauza funcționalității diferenței, ambele pot duce la rezultate neașteptate și ar trebui luate în considerare cu atenție.

Acest lucru este arătat în următorul 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

putem vedea că partea 1 generează NULL când nu valoarea este returnată pentru populatingvariable. În cazul în care ca parte 2 produce valoarea anterioară care este păstrată după eșuatasignarea variabilei. Această situație poate duce la rezultate neașteptate și necesităconsiderare.,

după standarde

Utilizarea SELECTA poate arata ca o alegere mai bună în anumite scenarii, dar să fie awarethat folosind SELECTAȚI pentru atribuirea de valori variabilelor nu este inclus în ANSIstandards. Dacă respectați standardele pentru migrarea codului, evitați să utilizați în schimb selectați și utilizați setul.

concluzie

cele mai bune practici sugerează să nu rămânem la o metodă. În funcție de scenariupoate doriți să utilizați ambele SET sau selectați.,

în Urma sunt câteva scenarii pentru a utiliza SET

  • Dacă vă sunt necesare pentru a atribui o valoare unică direct variabilă și noquery este implicat pentru a aduce valoare
  • NULL misiuni sunt de așteptat (NULL returnate în setul de rezultate)
  • Standarde sunt menite să fie urmați pentru orice planificate migrația
  • Non scalar rezultatele sunt de așteptat și trebuie să fie manipulate

Folosind SELECT este eficient și flexibil în următoarele câteva cazuri.,

  • variabile Multiple sunt populate prin atribuirea directă a valorilor
  • variabile Multiple sunt populate de o singură sursă (tabel , vizualizare)
  • mai puțin codificare pentru atribuirea mai multor variabile
  • utilizați acest lucru dacă trebuie să obțineți @@ROWCOUNT și @ERROR pentru ultima declarație executată
pașii următori
  • Faceți clic aici pentru a în SQL Server 2008.,
  • Click aici pentru a citi mai multe despre @@ROWCOUNT
  • Click aici pentru a citi mai multe despre @@de EROARE

Ultima Actualizare: 2009-11-25

Despre autor
Atif Shehzad este un pasionat SQL Server DBA, referent tehnic și autorul articolului.
Vezi toate sfaturile mele
Resurse conexe

  • Mai multe sfaturi pentru dezvoltatori de baze de date…

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *