如何在t-sql中设定局部变量

时间:2013-08-12 12:36:22

标签: sql-server tsql

我有一个特殊的要求,我需要多次声明一个局部变量 在存储过程中。在t-sql中,变量不会在逻辑上超出范围。什么是取消范围局部变量的最佳方法,以便可以再次声明具有相同名称的新局部变量。

IF DATEPART(weekday, GETDATE()) = 5
    BEGIN 
      Declare @Num int
      Declare @year int      
    END
ELSE 
    BEGIN
      Declare @Num int   -- gives an error, the previously declared variable is still active
      Declare @year int  -- gives an error, the previously declared variable is still active
    END     

如何更改我的Sp以便不会发生错误。我需要两次声明局部变量。

感谢。

2 个答案:

答案 0 :(得分:3)

如果变量代表相同的事物,只需在IF语句之外声明它们并“重用”它们。

Declare @Num INT, @year INT
IF DATEPART(weekday, GETDATE()) = 5
    BEGIN  
        SET @Num = 1
        SET @year = 2012   
    END
ELSE 
    BEGIN         
        SET @Num = 2
        SET @year = 2013 
    END     

如果他们不代表同一件事,那就给他们不同的名字。

答案 1 :(得分:0)

此外,要构建Dave K's answer,您可以重置声明变量的存储过程中的值。如果你想稍后使用@num作为其他东西,例如5而不是0,你可以这样做。

CREATE PROCEDURE stp_CheckItOut
AS
BEGIN

    DECLARE @date DATE, @number INT, @v VARCHAR(10)
    SET @date = GETDATE()
    SET @number = 1
    SET @v = 'Dog'

    SELECT @date, @number, @v

    -- Reset variables by setting them to NULLs
    SET @date = NULL
    SET @number = NULL
    SET @v = NULL

    SET @date = DATEADD(DD,10,GETDATE())
    SET @number = 4
    SET @v = 'Cat'

    SELECT @date, @number, @v

    -- Reset variables directly
    SET @date = DATEADD(DD,30,GETDATE())
    SET @number = 0
    SET @v = 'Bird'

    SELECT @date, @number, @v

END

EXECUTE stp_CheckItOut

DROP PROCEDURE stp_CheckItOut

如果变量保持相同的类型,您可以在代码中将其设置为等于其他内容。