Skip to main content

13. T-SQL Programming

Objectives

  • Hiểu được cách thức hoạt động của các chương trình T-SQL
  • Cách khai báo biến và các kiểu dữ liệu
  • Cách sử dụng các cấu trúc điều kiện
  • Cách sử dụng các cấu trúc lặp
  • Cách sử dụng các cấu trúc try catch
  • Cách tạo các functions

Biến

Khai báo biến

Khai báo biến
DECLARE @variable_name data_type [= value]

Ví dụ

Khai báo biến
DECLARE @FirstName nvarchar(50)
DECLARE @LastName nvarchar(50)
DECLARE @Discount decimal(18, 2)

Gán giá trị cho biến

Gán giá trị cho biến
SET @variable_name = value

Ví dụ

Gán giá trị cho biến
DECLARE @Discount decimal(18, 2)
SET @Discount = 10

-- Vừa khai báo vừa gán giá trị
DECLARE @FirstName nvarchar(50) = 'John'
DECLARE @LastName nvarchar(50) = 'Doe'

Các cấu trúc điều khiển

Khai báo khối lệnh
BEGIN
-- Code
END

IF ... ELSE

IF ... ELSE
IF condition BEGIN
-- Code
END
ELSE BEGIN
-- Code
END

Ví dụ

IF ... ELSE
DECLARE @Discount decimal(18, 2) = 10
IF @Discount > 10 BEGIN
PRINT 'Discount > 10'
END
ELSE BEGIN
PRINT 'Discount <= 10'
END

WHILE

WHILE
WHILE condition BEGIN
-- Code
END

Ví dụ

WHILE
DECLARE @i int = 1
WHILE @i <= 10 BEGIN
PRINT @i
SET @i = @i + 1
END

TRY ... CATCH

TRY ... CATCH
BEGIN TRY
-- Code
END TRY
BEGIN CATCH
-- Code
END CATCH

Ví dụ

TRY ... CATCH
BEGIN TRY
SELECT 1 / 0
END TRY
BEGIN CATCH
PRINT 'Error'
END CATCH

RETURN

RETURN
RETURN [expression]

Ví dụ

RETURN
CREATE PROCEDURE usp_Employee_GetFullName
@FirstName nvarchar(50),
@LastName nvarchar(50)
AS
BEGIN
DECLARE @FullName nvarchar(100)
SET @FullName = @FirstName + ' ' + @LastName
RETURN @FullName
END

THROW

THROW
THROW [error_number, message, state]

Ví dụ

THROW
CREATE PROCEDURE usp_Employee_GetFullName
@FirstName nvarchar(50),
@LastName nvarchar(50)
AS
BEGIN
DECLARE @FullName nvarchar(100)
SET @FullName = @FirstName + ' ' + @LastName
IF @FirstName = '' OR @LastName = '' BEGIN
THROW 50000, 'FirstName or LastName is empty', 1
END
RETURN @FullName
END

BREAK

BREAK
BREAK

Ví dụ

BREAK
DECLARE @i int = 1
WHILE @i <= 10 BEGIN
PRINT @i
SET @i = @i + 1
IF @i = 5 BEGIN
BREAK
END
END

CONTINUE

CONTINUE
CONTINUE

Ví dụ

CONTINUE
DECLARE @i int = 1
WHILE @i <= 10 BEGIN
IF @i = 5 BEGIN
SET @i = @i + 1
CONTINUE
END
PRINT @i
SET @i = @i + 1
END

GOTO

GOTO
GOTO label_name

Ví dụ

GOTO
DECLARE @i int = 1
WHILE @i <= 10 BEGIN
IF @i = 5 BEGIN
GOTO label
END
PRINT @i
SET @i = @i + 1
END
label:
PRINT 'Done'

WAITFOR

Dùng để delay

WAITFOR
WAITFOR DELAY '00:00:05'

Functions

Scalar-valued functions

Trả về một giá trị duy nhất

Viết 1 scalar function ghép FirstName @FirstName và LastName @LastName, tên function là udf_Employee_GetFullName

Tạo function
CREATE FUNCTION udf_Employee_GetFullName
(
@FirstName nvarchar(50),
@LastName nvarchar(50)
)
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @FullName nvarchar(100)
SET @FullName = @FirstName + ' ' + @LastName
RETURN @FullName
END
Sử dụng function
SELECT dbo.udf_Employee_GetFullName(FirstName, LastName) AS FullName
FROM Employees

Viết 1 scalar funtion tính total price (@Price, @Discount, @Quantity), tên function là udf_Product_GetTotalPrice

Tạo function
CREATE FUNCTION udf_Product_GetTotalPrice(@Price money, @Discount decimal(18, 2), @Quantity decimal(18, 2))
RETURNS money
AS
BEGIN
RETURN (@Price * (100 - @Discount) / 100) * @Quantity
END
Sử dụng function
SELECT dbo.udf_Product_GetTotalPrice(Price, Discount, Quantity) AS TotalPrice
FROM OrderDetails

Table-valued functions

Trả về một bảng

Viết 1 table-valued function lấy ra các sản phẩm có giá lớn hơn @Price, tên function là udf_Product_GetByPrice

Tạo function
CREATE FUNCTION udf_Product_GetByPrice(@Price money)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM Products
WHERE Price > @Price
)
Sử dụng function
SELECT *
FROM dbo.udf_Product_GetByPrice(100)