2010-06-01 7 views

Antwort

15

SQL Server nicht auf Blockebene Variable Scoping haben.

Es ist pro Charge/gespeicherte Prozedur etc

From MSDN (mein fett)

Der Umfang einer Variablen ist der Bereich von Transact-SQL-Anweisungen, die können die variable Referenz. Der Umfang eines variable dauert vom Punkt es bis zum Ende des Charge oder gespeicherte Prozedur erklärt wird in dem es erklärt.

+0

Macht Sinn, aber ist das nicht ein Fehler der Sorte, da es vielleicht Situationen gibt, in denen wir eine Variable nur dann erstellen möchten, wenn bestimmte Bedingungen erfüllt sind? – AspOnMyNet

+3

Nicht wirklich. SQL ist nicht kompiliert oder wie C# definiert, weil es deklarativ ist. Als Entwickler-DBA könnte ich sagen, dass C# und Java aufgrund ihrer Scoping-Regeln fehlerhaft sind, wobei Variablen in äußeren und inneren Blöcken deklariert sind. Ich meine, 2 @A vars? Komm schon ... – gbn

+0

Danke für die Hilfe – AspOnMyNet

4

gbn die beantwortet die Frage, aber auf einem verwandten beachten Sie, sehen Sie, wie dies für Code aus:

DECLARE @i INT = 0 
WHILE @i < 2 
BEGIN 
    DECLARE @a VARCHAR(100) 

    IF @i = 0 
     SET @a = 'changed' 

    PRINT COALESCE(@a, 'is null') 
    SET @i = @i + 1 
END 

Wenn er gestartet wird, druckt es „geändert“ zweimal, während viele Menschen würden erwarten, dass es wahrscheinlich zu drucken "geändert", dann "ist null". Seien Sie vorsichtig beim Deklarieren von Variablen innerhalb von Schleifen. Möglicherweise möchten Sie es in der Deklaration explizit auf NULL setzen. z.B.

DECLARE @a VARCHAR(100) = NULL 

Wenn diese modifizierte Version ausgeführt wird, zeigt es "geändert" und dann "null".

+0

Guter Rat. Ich hätte das wahrscheinlich vermisst. Danke – AspOnMyNet

Verwandte Themen