首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 存儲過程入門基礎(二):變量聲明、賦值、SET vs SELECT 差異、綜合實戰

     編輯:關於SqlServer

變量分類

  • 局部變量:@var,批次/過程內有效。
  • 全局變量:@@var,系統預定義,如 @@ROWCOUNT、@@IDENTITY。

本文專注局部變量。

聲明與初始化

DECLARE @ID INT = 2;          -- SQL 2008+ 支持聲明即賦值
DECLARE @Name VARCHAR(20);    -- 僅聲明
SET @Name = 'Tom';            -- 賦值
-- 或
SELECT @Name = 'Jerry';

SET vs SELECT 賦值:三大核心差異

場景SETSELECT
子查詢返回多行❌ 報錯 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

最佳實踐建議

  1. 優先用 SELECT 賦值:天然兼容多行/空結果,代碼更健壯。
  2. 多變量同賦用 SELECT:SELECT @a=1, @b=GETDATE(), @c=@a+1。
  3. 嚴格類型匹配:避免隱式轉換導致截斷或索引失效。
  4. OUTPUT 參數必加 OUTPUT 關鍵字:調用端與定義端雙向聲明,否則取不到值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved