Es gibt mehrere Möglichkeiten um einer Variable in SQL zu zuweisen.
Hier werden die SET und die SELECT Variante beleuchten.

Für die Demonstration verwenden wir die AdventureWorks2017 Datenbank von Microsoft.
Hier erstellen wir uns eine Abfrage auf die Tabelle Person.Person.

-- Ausgabe der Spalten PersonType, Firstname, Lastname mit Einschränkung.
SELECT 
	[PersonType]
	, [FirstName]
	, [LastName]
FROM
	[AdventureWorks2017].[Person].[Person]
WHERE
	FirstName = 'Ken'
	AND 
	LastName = 'Sánchez'

Mit dem obigen Select erhalten wir 2 Datensätze zurück.

Was passiert, wenn wir dieses Ergebnis in eine Variable speichern?
Hierzu geben wir im Select nur noch die Spalte PersonType aus. Die Spalten FirstName und LastName entfernen wir aus dem Select.

1. Zuweisung im Select-Statement

DECLARE @PersonType VARCHAR(2)
SET @PersonType = ''

SELECT 
	@PersonType = [PersonType]
FROM
	[AdventureWorks2017].[Person].[Person]
WHERE
	FirstName = 'Ken'
	AND 
	LastName = 'Sánchez'

SELECT @PersonType

Wir können die Abfrage ausführen und erhalten am Ende folgendes Ergebnis zurück:

Hm etwas komisch ist das Ergebnis schon. Führt man das Select ohne Zuweisung aus bekommt man 2 Datensätze zurück. Mit der Zuweisung des Results innerhalb des Selects wird eine Ergebniszeile ignoriert.

2. Zuweisung mit SET

DECLARE @PersonType VARCHAR(2)
SET @PersonType = ''

SET @PersonType = (SELECT 
	[PersonType]
FROM
	[AdventureWorks2017].[Person].[Person]
WHERE
	FirstName = 'Ken'
	AND 
	LastName = 'Sánchez')

SELECT @PersonType

Wir führen die Abfrage aus und erhalten einen Fehler.

Die Fehlermeldung ist absolut logisch und nachvollziehbar.
Wenn die Abfrage mehr als einen Datensatz zurück liefert, kann bei der Zuweisung nur ein Fehler ausgegeben werden.

Bei der Zuweisung im Select-Statement wird der Fehler nicht ausgegeben und die Variable bekomm einen Wert zugewiesen.
Jedoch bei der Zuweisung mit SET bekommen wir den Fehler angezeigt und die Variable bekommt keinen Wert zugewiesen.

Um eine saubere Zuweisung zu erhalten sollte man daher nicht die Variablen im Select-Statement mit Werten füllen.

Nutzt immer die SET Anweisung um einen Wert einer Variable zu zuweisen. Somit stellt ihr sicher, dass ihr im Select nur einen Datensatz zurück bekommen habt.  Zusätzlich  ist sichergestellt, daß der Variable nicht irgendein Wert zugewiesen wurde.

Von Michael