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)