Khái niệm cơ bản và cách sử dụng biến SQL
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu các khái niệm và cách sử dụng chi tiết biến trong SQL. Trong SQL Server, các biến cục bộ được sử dụng để lưu trữ dữ liệu trong khoảng thời gian thực thi hàng loạt.
Các biến cục bộ có thể được tạo cho các kiểu dữ liệu khác nhau và cũng có thể được gán giá trị. Ngoài ra, các giá trị được gán cho biến có thể được thay đổi trong thời gian thực hiện. Vòng đời của biến bắt đầu từ thời điểm nó được khai báo và phải kết thúc khi kết thúc. Nếu một biến đang được sử dụng trong một thủ tục được lưu trữ, phạm vi của biến được giới hạn trong thủ tục được lưu trữ hiện tại.
Khai báo biến SQL
Cú pháp sau xác định cách khai báo một biến:
DECLARE { @LOCAL_VARIABLE data_type [ = value ] }
Bây giờ, hãy giải thích cú pháp trên.
Thứ nhất, nếu chúng ta muốn sử dụng một biến trong SQL Server, chúng ta phải khai báo nó. Câu lệnh DECLARE được sử dụng để khai báo một biến trong SQL Server.
Trong bước thứ hai, chúng ta phải chỉ định tên của biến. Tên biến cục bộ phải bắt đầu bằng dấu @ vì quy tắc này là một cú pháp cần thiết.
Cuối cùng, xác định kiểu dữ liệu của biến. Đối số giá trị được chỉ định trong cú pháp là một tham số tùy chọn. Từ đó giúp gán giá trị ban đầu cho một biến trong quá trình khai báo.
Mặt khác, chúng ta có thể gán hoặc thay thế giá trị của biến trong các bước tiếp. Nếu chúng ta không tạo bất kỳ giá trị ban đầu nào được gán cho một biến. Nó sẽ được khởi tạo là NULL.
Ví dụ sau sẽ khai báo một biến có tên là @VarValue và kiểu dữ liệu là varchar. Đồng thời, chúng tôi sẽ gán một giá trị ban đầu là ‘Save Our Planet’:
DECLARE @TestVariable AS VARCHAR(100)='Save Our Planet'
PRINT @TestVariable

Gán giá trị cho Biến SQL
SQL Server cung cấp hai phương pháp khác nhau để gán giá trị vào các biến ngoại trừ việc gán giá trị ban đầu.
- Sử lụng câu lệnh SET
- Sử dụng câu lệnh SELECT
Ví dụ: Chúng ta sẽ khai báo một biến và sau đó gán giá trị với câu lệnh SET:
DECLARE @TestVariable AS VARCHAR(100)
SET @TestVariable = 'One Planet One Life'
PRINT @TestVariable

Trong ví dụ sau, chúng ta sẽ sử dụng câu lệnh SELECT để gán giá trị cho một biến:
DECLARE @TestVariable AS VARCHAR(100)
SELECT @TestVariable = 'Save the Nature'
PRINT @TestVariable

Câu lệnh SELECT có thể được sử dụng để gán giá trị cho một biến từ bảng. Hoặc cũng có thể là các hàm có giá trị vô hướng. Bây giờ, chúng ta sẽ xem qua khái niệm sử dụng này thông qua ví dụ sau:
DECLARE @PurchaseName AS NVARCHAR(50)
SELECT @PurchaseName = [Name]
FROM [Purchasing].[Vendor]
WHERE BusinessEntityID = 1492
PRINT @PurchaseName

Có thể thấy, giá trị @PurchaseName đã được gán từ bảng Vendor.
Bây giờ, chúng ta sẽ gán giá trị cho biến từ hàm có giá trị vô hướng:
DECLARE @StockVal AS INT
SELECT @StockVal=dbo.ufnGetStock(1)
SELECT @StockVal AS [VariableVal]

Multiple SQL variables
Đối với các trường hợp khác nhau, chúng ta có thể cần khai báo nhiều hơn một biến. Trên thực tế, chúng ta có thể làm điều này bằng cách khai báo từng biến riêng lẻ và gán giá trị cho từng tham số:
DECLARE @Variable1 AS VARCHAR(100)
DECLARE @Variable2 AS UNIQUEIDENTIFIER
SET @Variable1 = 'Save Water Save Life'
SET @Variable2= '6D8446DE-68DA-4169-A2C5-4C0995C00CC1'
PRINT @Variable1
PRINT @Variable2

Chúng ta có một cách hiệu quả hơn để khai báo nhiều biến trong một câu lệnh. Chúng ta có thể sử dụng câu lệnh DECLARE dưới dạng sau để có thể gán giá trị cho các biến này trong một câu lệnh SELECT:
DECLARE @Variable1 AS VARCHAR(100), @Variable2 AS UNIQUEIDENTIFIER
SELECT @Variable1 = 'Save Water Save Life' , @Variable2= '6D8446DE-68DA-4169-A2C5-4C0995C00CC1'
PRINT @Variable1
PRINT @Variable2

Ngoài ra, chúng ta có thể sử dụng câu lệnh SELECT để gán giá trị từ các bảng cho nhiều biến:
DECLARE @VarAccountNumber AS NVARCHAR(15)
,@VariableName AS NVARCHAR(50)
SELECT @VarAccountNumber=AccountNumber , @VariableName=Name
FROM [Purchasing].[Vendor]
WHERE BusinessEntityID = 1492
PRINT @VarAccountNumber
PRINT @VariableName

Mẹo hay về Biến SQL
Mẹo 1: Phạm vi biến cục bộ sẽ hết hạn vào cuối đợt. Bây giờ, chúng ta sẽ phân tích ví dụ sau về vấn đề này:
DECLARE @TestVariable AS VARCHAR(100)
SET @TestVariable = 'Think Green'
GO
PRINT @TestVariable

Tập lệnh trên đã tạo ra lỗi do câu lệnh GO. Câu lệnh GO xác định phần cuối của lô trong SQL Server, do đó vòng đời @TestVariable kết thúc bằng dòng câu lệnh GO. Không thể truy cập biến được khai báo phía trên dòng câu lệnh GO trong câu lệnh GO. Tuy nhiên, chúng ta có thể khắc phục vấn đề này bằng cách mang giá trị biến với sự trợ giúp của các bảng tạm thời:
IF OBJECT_ID('tempdb..#TempTbl') IS NOT NULL DROP TABLE #TempTbl
DECLARE @TestVariable AS VARCHAR(100)
SET @TestVariable = 'Hello World'
SELECT @TestVariable AS VarVal INTO #TempTbl
GO
DECLARE @TestVariable AS VARCHAR(100)
SELECT @TestVariable = VarVal FROM #TempTbl
PRINT @TestVariable

Mẹo 2: Giả sử rằng, chúng ta đã gán một giá trị từ bảng cho một biến và tập kết quả của câu lệnh SELECT trả về nhiều hơn một hàng.
Vấn đề chính tại thời điểm này sẽ là giá trị hàng nào được gán cho biến. Trong trường hợp này, giá trị được gán cho biến sẽ là hàng cuối cùng của tập kết quả. Trong ví dụ sau, hàng cuối cùng của tập kết quả sẽ được gán cho biến:
SELECT AccountNumber
FROM [Purchasing].[Vendor]
ORDER BY BusinessEntityID
DECLARE @VarAccountNumber AS NVARCHAR(15)
SELECT @VarAccountNumber=AccountNumber
FROM [Purchasing].[Vendor]
order by BusinessEntityID
SELECT @VarAccountNumber AS VarValue

Mẹo 3: Nếu kiểu dữ liệu được khai báo của biến và kiểu dữ liệu giá trị được gán không khớp, SQL Server sẽ thực hiện chuyển đổi ngầm định trong quy trình gán giá trị, nếu có thể. Loại dữ liệu ưu tiên thấp hơn được SQL Server chuyển đổi thành loại dữ liệu ưu tiên cao hơn nhưng thao tác này có thể dẫn đến mất dữ liệu. Ví dụ sau, chúng ta sẽ gán giá trị float cho biến mà kiểu dữ liệu của biến này được khai báo là số nguyên:
DECLARE @FloatVar AS FLOAT = 12312.1232
DECLARE @IntVar AS INT
SET @IntVar=@FloatVar
PRINT @IntVar
