Variables scope which are defined within a while block in stored procedures - SQl Server

后端 未结 8 866
没有蜡笔的小新
没有蜡笔的小新 2020-12-24 07:46

I\'ve come across a interesting scenario (at least for me) in a stored procedure. Would like to have experts opinion and thoughts on it.

DECLARE @loopcounter         


        
相关标签:
8条回答
  • 2020-12-24 08:05
     DECLARE @loopcounter INT
     DECLARE @insidevalue int
       SET @loopcounter=10
           WHILE @loopcounter > 0
            BEGIN
              IF (@loopcounter%2 = 0)
              BEGIN
              SET @insidevalue = @loopcounter
              PRINT 'Value_' + CAST(@insidevalue AS NVARCHAR) + '_'
              END
        ELSE
          PRINT 'Value_'+' '+'_'
          SET @loopcounter = @loopcounter - 1
       END
    
    0 讨论(0)
  • 2020-12-24 08:09

    The variable scope is the whole batch in this case a stored procedure.

    It isn't re-declared every loop

    So this is exactly as expected

    Edit:

    There is a recent blog article which is quite similar. The author was quickly corrected :-)

    0 讨论(0)
  • 2020-12-24 08:10

    From Declare:

    The scope of a local variable is the batch in which it is declared.

    There are no more "local" scoping rules in T-SQL. It also means that you can't declare the same variable name inside IF and ELSE blocks.

    All Declare does is declare a variable. It has no relation to assignment. The value of any variable that has never been assigned to is NULL. But thereafter, the only way the variables value will become NULL again is through an explicit assignment.

    If you need it to be NULL at the top of each loop iteration, therefore, you must explicitly assign it.

    0 讨论(0)
  • 2020-12-24 08:10

    Integer data types often don't have NULL's only 0's

    Declare statement won't happen each time within the loop

    why don't you just use

    DECLARE @loopcounter INT
    SET @loopcounter=10
    WHILE @loopcounter > 0
    BEGIN
      IF @loopcounter%2 = 0
      PRINT 'Value_' + CAST(@loopcounter AS NVARCHAR) + '_'
      else
      PRINT 'Value_ _'
      SET @loopcounter = @loopcounter - 1
    END
    

    That gives:

    Value_10_
    Value_ _
    Value_8_
    Value_ _
    Value_6_
    Value_ _
    Value_4_
    Value_ _
    Value_2_
    Value_ _
    
    0 讨论(0)
  • 2020-12-24 08:12

    In T-SQL a WHILE..END is not individually scoped, you can for example SELECT @insidevalue after the WHILE's END.

    0 讨论(0)
  • 2020-12-24 08:15

    From Transact-SQL Variables

    The scope of a variable is the range of Transact-SQL statements that can reference the variable. The scope of a variable lasts from the point it is declared until the end of the batch or stored procedure in which it is declared.

    The DECLARE is not in itself an executable statement. The variable declarations are all identified at compile time and the memory reserved for them in the execution context.

    If you use the 2008+ Declare and Set syntax. The Set part of the statement will occur every loop iteration however.

    DECLARE @loopcounter INT
    SET @loopcounter=10
    
    WHILE @loopcounter > 0
    BEGIN
      DECLARE @insidevalue INT = NULL
    
      IF (@loopcounter%2 = 0)
      SET @insidevalue = @loopcounter
    
      PRINT 'Value_' + CAST(@insidevalue AS NVARCHAR) + '_'
    
      SET @loopcounter = @loopcounter - 1
    END
    
    0 讨论(0)
提交回复
热议问题