Biến cục bộ trong SQL

Biến dùng để lưu trữ các giá trị tạm thời trong quá trình tính toán. Ở bài này ta sẽ bàn về biến cục bộ (local variable).

Khai báo biến

DECLARE @[Tên biến] [Kiểu dữ liệu]

Ví dụ:

DECLARE @OrderId int;

Gán giá trị cho biến:
Để gán giá trị cho biến ta sử dụng một trong hai câu lệnh sau.

Cách 1: SET

SET @[Tên biến] = [giá trị]

Ví dụ:

DECLARE @OrderId int;
SET @OrderId = 10250;

Cách 2: SELECT

SELECT @[Tên Biến] = Tên_Cột From [Bảng]

Ví dụ:

USE northwind;
DECLARE @OrderId = OrderId from Orders

Ví dụ 1: khai báo biến OrderId có kiểu int, gán cho nó giá trị là 10250, lấy ra tất cả Order trong database NorthWind có OrderID > @OrderId.

USE northwind;

GO

DECLARE @OrderId int;
SET @OrderId = 10250;

SELECT *
FROM   Orders
WHERE  OrderID > @OrderId;

Phạm vi hoạt động của một biến:

  1. Trong một batch
  2. Trong một Stored Procedure hay Trigger.

Batch là một nhóm lệnh được gởi tới server, được giới hạn bởi lệnh GO.

Ví dụ trên sẽ có 2 nhóm lệnh gởi tới server được phân cách bởi câu lệnh GO.

nhóm lệnh 1 và 2

Vì phạm vi hoạt động của biến chỉ trong một nhóm lệnh, do vậy nếu ta sử dụng biến @OrderId ở ngoài nhóm lệnh 2, SQL Server sẽ báo lỗi.

Ví dụ 2:  sử dụng biến ngoài nhóm lệnh.

USE northwind;

GO

DECLARE @OrderId int;
SET @OrderId = 10250;

SELECT *
FROM   Orders
WHERE  OrderID > @OrderId;

GO

--Sử dụng biến ngoài nhóm lệnh
SET @OrderId = 10251;

Lỗi:

(827 row(s) affected)

Msg 137, Level 15, State 1, Line 2

Must declare the scalar variable "@OrderId".

Trình tự chạy câu lệnh trên như sau:

1/ Chạy nhóm lệnh 1: sử dụng database northwind.

2/ Chạy nhóm lệnh 2: lấy ra tất cả Order có OrderID > @OrderId, 827 hàng sẽ được lấy ra (827 row(s) affected).

3/ Chạy nhóm lệnh 3: gán giá trị cho biến OrderID = 10251, tuy nhiên biến OrderId lại thuộc nhóm lệnh 2. Do vậy SQL server báo lỗi, Must declare the scalar variable "@OrderId". Phải khai báo biến mới sử dụng được.

Đối với biến được khai báo trong Stored Procedure và Trigger thì sẽ được học ở các chương sau.

Ví dụ 3: khai báo một biến CustomerID, có kiểu dữ liệu varchar(5), gán cho nó giá trị là 'ALFKI' , sau đó lấy ra tất cả Customer có CustomerID = @CustomerID.

USE northwind;

GO

DECLARE @CustomerID varchar( 5 );
SET @CustomerID = 'ALFKI';

SELECT *
FROM   Customers
WHERE  CustomerID = @CustomerID;

Ghi nhớ:

  1. Khi khai báo biến phải có kiểu dữ liệu.
  2. Biển chỉ sử dụng được sau khi khai báo.
  3. Biến cục bộ chỉ tồn tại trong một batch, một store procedured hoặc một trigger.

Bạn có thể tham khảo cách cài đặt database northwind tại đây:
http://hocdai.com/sql-can-ban/cai-dat-sql/cai-dat-database-northwind

Các môn học khác

Chương trình thường được xây dựng quanh dữ liệu và logic để xử lý chúng. Nói cách khác: Program = Cấu trúc dữ liệu + giải thuật. Do vậy đây là môn học bắt buộc dành cho các lập trình viên.

HTTP giúp kết nối các máy tính trên mạng Internet thông qua TCP/IP

Khoa học về dinh dưỡng, giáo trình giảm cân cho mọi người.