0

我有一个特殊的要求,我需要在存储过程中多次声明一个局部变量。在 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 以使错误不会发生。我确实需要两次声明局部变量。

谢谢。

4

2 回答 2

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     

如果它们不代表相同的事物,则给它们不同的名称。

于 2013-08-12T12:40:12.087 回答
0

此外,以Dave K 的回答为基础,您可以重置已声明变量的存储过程中的值。如果您想稍后用作@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

如果变量保持相同的类型,您可以稍后在代码中将其设置为其他值。

于 2013-08-12T21:09:32.427 回答