[SQLServer] SQL động

Trong quá trình phát triển ứng dụng, đôi khi chúng ta lại cần thực hiện một truy vấn SQL không định nghĩa trước, đó là lý do tại sao gọi là phát biểu SQL động.

Một truy vấn SQL mà tên bảng từ bên ngoài đưa vào hay tên bảng xuất phát từ một phép toán gán nào đó thì chúng ta gọi là truy vấn SQL động.

Để thực hiện truy vấn SQL này, bạn phải sử dụng lệnh EXEC hoặc EXECUTE.

Cú pháp thực hiện:

EXEC ({biến kiểu chuỗi | ‘lệnh truy vấn’})

Ví dụ 1:

–Khai báo biến @tenbang chứa tên bảng cần truy vấn

DECLARE @tenbang VARCHAR(100)

–Gán biến @tenbang có giá trị là Categories

SET @tenbang = ‘Categories’

–Thực hiện lệnh truy vấn SQL động với EXEC hoăc EXECUTE

EXEC(‘SELECT * FROM ‘ + @tenbang)

Kết quả:

Hình 1. Truy vấn SQL động

Ví dụ 2: Thực thi câu SQL động sử dụng biến chứa câu lệnh truy vấn SQL

–Khai báo biến @chuoiSQL chứa chuỗi truy vấn SQL

DECLARE @chuoiSQL VARCHAR(100)

–Gán biến @chuoiSQL có giá trị là truy vấn SQL với bảng Categories

SET @chuoiSQL = ‘SELECT * FROM Categories’
SET @chuoiSQL = @chuoiSQL + ‘ WHERE Name=”TV”’

–Thực thi phát biểu SQL động

EXECUTE(@chuoiSQL)

Kết quả:

Hình 2. Truy vấn SQL động

Ví dụ 3: Sử dụng biến trong truy vấn SQL động

DECLARE @chuoiSQL VARCHAR(100)
DECLARE @bienName VARCHAR(50)

SET @chuoiSQL = ‘SELECT @bienName = CategoryID FROM Categories’
SET @chuoiSQL = @chuoiSQL + ‘ WHERE Name=”TV”’

EXECUTE(@chuoiSQL)
SELECT @bienName

Kết quả: lệnh EXEC có lỗi do @bienName được khai báo bên ngoài chuỗi SQL động.

Hình 3. Truy vấn SQL động với biến được khai báo bên ngoài

Ví dụ 4: Sử dụng biến được khai báo bên trong lệnh  truy vấn SQL động

–Khai báo biến @chuoiSQL chứa chuỗi truy vấn SQL

DECLARE @chuoiSQL VARCHAR(100)

–Gán biến @chuoiSQL là truy vấn SQL với khai báo biến @Ten trong chuỗi

SET @chuoiSQL = ‘DECLARE @Ten VARCHAR(50) SELECT @Ten = CategoryID FROM Categories’
SET @chuoiSQL = @chuoiSQL + ‘ WHERE Name=”TV” SELECT @Ten’

EXECUTE(@chuoiSQL)

Kết quả:

Hình 4. Truy vấn SQL động với biến được khai báo bên trong chuỗi truy vấn

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.