我有一个特殊的要求,我需要多次声明一个局部变量 在存储过程中。在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以便不会发生错误。我需要两次声明局部变量。
感谢。
答案 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
如果变量保持相同的类型,您可以在代码中将其设置为等于其他内容。