2010-06-01 9 views

risposta

15

SQL Server non ha scoping variabile a livello di blocco.

E 'per lotto/proc memorizzato etc

From MSDN (il mio grassetto)

L'ambito di una variabile è la gamma di istruzioni Transact-SQL che può riferimento alla variabile. L'ambito di una variabile dura dal punto si dichiarata fino alla fine del lotto o stored procedure in cui è dichiarate.

+0

Ha senso, ma non è un difetto di sorta, poiché forse ci sono situazioni in cui vorremmo creare una variabile solo quando vengono soddisfatte determinate condizioni? – AspOnMyNet

+3

Non proprio. SQL non è compilato o ambito come C#, per esempio perché è dichiarativo. Come sviluppatore DBA, potrei dire C# e Java sono imperfetti a causa delle loro regole di scoping, con le variabili dichiarate nei blocchi esterni e interni. Voglio dire, avendo 2 @A vars? Dai ... – gbn

+0

grazie per avermi aiutato – AspOnMyNet

4

GBN del risposto alla domanda, ma su una nota correlata, guardare fuori per il codice come questo:

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 

Quando run, viene stampato "cambiato" due volte, mentre molte persone probabilmente si aspettano per stampare "changed", then "is null". Fai attenzione quando dichiari le variabili all'interno dei loop. Potrebbe essere necessario impostarlo esplicitamente su NULL nella dichiarazione. per esempio.

DECLARE @a VARCHAR(100) = NULL 

Quando viene eseguita questa versione modificata, viene visualizzato "modificato", quindi "è null".

+0

Un buon consiglio. Probabilmente mi sarei perso quello. thanx – AspOnMyNet

Problemi correlati