DECLARE 變數宣告 (SQL DECLARE Statement)

DECLARE 語句用來宣告區域變數,主要用於 SQL Server 和 MySQL 的預存程序、函數或批次處理中。

SQL Server DECLARE 語法

DECLARE @variable_name data_type [= initial_value];

基本宣告

DECLARE @name VARCHAR(50);
DECLARE @age INT;
DECLARE @salary DECIMAL(10,2);

宣告並設定初始值

DECLARE @count INT = 0;
DECLARE @message VARCHAR(100) = 'Hello';

同時宣告多個變數

DECLARE 
    @name VARCHAR(50),
    @age INT,
    @active BIT = 1;

設定變數值

宣告後使用 SET 或 SELECT 來設定變數值:

DECLARE @total INT;

-- 使用 SET
SET @total = 100;

-- 使用 SELECT (可從查詢結果設值)
SELECT @total = COUNT(*) FROM orders;

SET 與 SELECT 的差異

-- SET 一次只能設定一個變數
SET @var1 = 1;
SET @var2 = 2;

-- SELECT 可以同時設定多個變數
SELECT @var1 = 1, @var2 = 2;

-- SELECT 可以從資料表取值
SELECT @name = Name, @age = Age FROM customers WHERE id = 1;

DECLARE 用法範例 (Example)

儲存查詢結果

DECLARE @max_price DECIMAL(10,2);
DECLARE @min_price DECIMAL(10,2);

SELECT 
    @max_price = MAX(Price),
    @min_price = MIN(Price)
FROM products;

-- 使用變數
SELECT * FROM products 
WHERE Price = @max_price OR Price = @min_price;

計數器應用

DECLARE @counter INT = 1;

WHILE @counter <= 5
BEGIN
    PRINT '計數: ' + CAST(@counter AS VARCHAR);
    SET @counter = @counter + 1;
END

MySQL DECLARE

在 MySQL 中,DECLARE 只能在預存程序或函數內使用,且必須放在程序區塊的開頭:

DELIMITER //
CREATE PROCEDURE example_proc()
BEGIN
    DECLARE my_var INT DEFAULT 0;
    DECLARE my_name VARCHAR(50);
    
    SET my_var = 100;
    SELECT name INTO my_name FROM customers LIMIT 1;
END //
DELIMITER ;
MySQL 的區域變數不需要 @ 前綴,而使用者定義變數才需要 @。

變數作用範圍

資料庫作用範圍
SQL Server宣告所在的批次 (batch) 或預存程序內
MySQL宣告所在的 BEGIN...END 區塊內

批次結束或程序執行完畢後,區域變數就會被釋放。

資料表變數 (Table Variable)

SQL Server 支援宣告資料表類型的變數:

DECLARE @temp_table TABLE (
    id INT,
    name VARCHAR(50)
);

INSERT INTO @temp_table VALUES (1, '張一'), (2, '王二');

SELECT * FROM @temp_table;