@var,批次/過程內有效。@@var,系統預定義,如 @@ROWCOUNT、@@IDENTITY。本文專注局部變量。
DECLARE @ID INT = 2; -- SQL 2008+ 支持聲明即賦值
DECLARE @Name VARCHAR(20); -- 僅聲明
SET @Name = 'Tom'; -- 賦值
-- 或
SELECT @Name = 'Jerry';
| 場景 | SET | SELECT |
|---|---|---|
| 子查詢返回多行 | ❌ 報錯 512 | ✅ 靜默取最後一行值 |
| 子查詢返回 0 行 | 變量置 NULL | 變量保持原值不變 |
| 多變量同時賦值 | 需多條 SET | 單條 SELECT @a=1, @b=2 完成 |
-- SET 會報錯
DECLARE @name VARCHAR(20);
SET @name = (SELECT username FROM userinfo); -- Msg 512
-- SELECT 正常,取最後一行
DECLARE @name VARCHAR(20);
SELECT @name = username FROM userinfo;
PRINT @name; -- 輸出最後一行 username
-- SET 置 NULL
DECLARE @name VARCHAR(20) = 'jack';
SET @name = (SELECT username FROM userinfo WHERE username='not_exist');
PRINT @name; -- NULL
-- SELECT 保持原值
DECLARE @name VARCHAR(20) = 'jack';
SELECT @name = username FROM userinfo WHERE username='not_exist';
PRINT @name; -- jack
DECLARE @i INT = 3;
SELECT @i = @i + 1; -- 4
SELECT @i = @i * 2; -- 8
SELECT @i = @i / 3; -- 2 (整數除法)
SELECT @i = @i % 3; -- 2 (取模)
CREATE PROCEDURE UserLogin1
@name VARCHAR(20),
@password VARCHAR(20),
@inReturn INT OUTPUT -- 1=成功, -1=密碼錯誤
AS
BEGIN
DECLARE @strPwd VARCHAR(20);
SELECT @strPwd = userPass FROM userinfo WHERE userName = @name;
IF @password = @strPwd
BEGIN
SET @inReturn = 1;
UPDATE userinfo SET registertime = GETDATE() WHERE userName = @name;
END
ELSE
SET @inReturn = -1;
END
GO
-- 測試
DECLARE @test INT;
EXEC UserLogin1 'admin', 'admin', @test OUTPUT;
PRINT @test; -- 1
EXEC UserLogin1 'admin', 'wrong', @test OUTPUT;
PRINT @test; -- -1
SELECT @a=1, @b=GETDATE(), @c=@a+1。