Was sind die Unterschiede zwischen den Anweisungen SET
und SELECT
bei der Zuweisung von Variablen in T-SQL?
290
Was sind die Unterschiede zwischen den Anweisungen SET
und SELECT
bei der Zuweisung von Variablen in T-SQL?
Zitat , das aus diesem Artikel zusammenfasst :
- SET ist der ANSI-Standard für die Variablenzuweisung, SELECT nicht.
- SET kann jeweils nur eine Variable zuweisen, SELECT kann mehrere Zuweisungen gleichzeitig vornehmen.
- Bei der Zuweisung aus einer Abfrage kann SET nur einen Skalarwert zuweisen. Wenn die Abfrage mehrere Werte / Zeilen zurückgibt, löst SET einen Fehler aus. SELECT weist der Variablen einen der Werte zu und verbirgt die Tatsache, dass mehrere Werte zurückgegeben wurden (sodass Sie wahrscheinlich nie wissen würden, warum anderswo etwas schief gelaufen ist - viel Spaß bei der Fehlerbehebung).
- Wenn bei der Zuweisung aus einer Abfrage kein Wert zurückgegeben wird, weist SET NULL zu, wobei SELECT die Zuweisung überhaupt nicht vornimmt (sodass die Variable nicht von ihrem vorherigen Wert geändert wird).
- In Bezug auf Geschwindigkeitsunterschiede gibt es keine direkten Unterschiede zwischen SET und SELECT. Die Fähigkeit von SELECT, mehrere Aufgaben auf einmal zu erledigen, bietet jedoch einen leichten Geschwindigkeitsvorteil gegenüber SET.
SELECT @Int = @Int + 1, @Int = @Int + 1
Wenn sie@Int
als 0 gestartet wird, endet sie als 2. Dies kann sehr nützlich sein, wenn aufeinanderfolgende Zeichenfolgenmanipulationen durchgeführt werden.Ich glaube, es
SET
ist ANSI-Standard, während diesSELECT
nicht der Fall ist. Beachten Sie auch das unterschiedliche Verhalten vonSET
vs.SELECT
im folgenden Beispiel, wenn kein Wert gefunden wird.quelle
select @var = (select name from master.sys.tables where name = 'qwerty')
, würden Sie @var als null erhalten. Das Beispiel, das Sie geben, ist nicht dieselbe Abfrage.(select name from master.sys.tables where name = 'qwerty')
für den einen undname from master.sys.tables where name = 'qwerty'
für den anderen ... sehen Sie das nicht?(select name from master.sys.tables where name = 'qwerty')
ist eine skalare Unterabfrage undname from master.sys.tables where name = 'qwerty'
eine einfache Abfrage. Die beiden unterschiedlichen Ausdrücke sollen nicht zu denselben Ergebnissen führen, obwohl Sie anscheinend implizieren, dass dies der Fall sein sollte. Wenn Sie das versuchen , zu sagenSET
undSELECT
Schlüsselwörter haben unterschiedliche Implementierungen, sollten Sie nicht verwenden zwei verschiedene Ausdrücke in Ihren Beispielen. msdn.microsoft.com/en-us/library/ms187330.aspxBeim Schreiben von Abfragen sollte dieser Unterschied berücksichtigt werden:
quelle
Abgesehen von ANSI, Geschwindigkeit usw. gibt es einen sehr wichtigen Unterschied, der mir immer wichtig ist. mehr als ANSI und Geschwindigkeit. Die Anzahl der Fehler, die ich aufgrund dieses wichtigen Übersehens behoben habe, ist groß. Ich suche dies die ganze Zeit bei Codeüberprüfungen.
Fast immer ist das nicht die Absicht des Entwicklers. Oben ist die Abfrage einfach, aber ich habe Abfragen gesehen, die ziemlich komplex sind und herauszufinden, ob sie einen einzelnen Wert zurückgeben oder nicht, ist nicht trivial. Die Abfrage ist häufig komplexer und hat zufällig einen einzelnen Wert zurückgegeben. Während der Entwicklertests ist alles in Ordnung. Dies ist jedoch wie eine tickende Bombe und führt zu Problemen, wenn die Abfrage mehrere Ergebnisse zurückgibt. Warum? Weil es der Variablen einfach den letzten Wert zuweist.
Versuchen wir jetzt dasselbe mit
SET
:Sie erhalten eine Fehlermeldung:
Das ist erstaunlich und sehr wichtig , denn warum sollte man etwas trivial „letztes Element in Folge“ , um die zugewiesen werden soll
@employeeId
. Mitselect
Sie nie einen Fehler bekommen und Sie werden Minuten, Stunden mit dem Debuggen verbringen.Möglicherweise suchen Sie nach einer einzelnen ID und
SET
werden gezwungen, Ihre Abfrage zu korrigieren. So können Sie etwas tun wie:Aufräumen
Verwenden Sie abschließend:
SET
: Wenn Sie einer Variablen einen einzelnen Wert zuweisen möchten und Ihre Variable für einen einzelnen Wert bestimmt ist.SELECT
: Wenn Sie einer Variablen mehrere Werte zuweisen möchten. Die Variable kann eine Tabelle, eine temporäre Tabelle oder eine Tabellenvariable usw. sein.quelle