Skip to main content

Views, Stored Procedures

Views​

1. Tạo view​

Danh sách sản phẩm cùng với tên nhà cung cấp, tên loại sản phẩm
CREATE VIEW v_Products
AS
SELECT
P.ProductId, P.ProductName, P.Price, P.CategoryId, P.SupplierId,
C.CategoryName, S.Name AS 'SupplierName'
FROM Products AS P
INNER JOIN Categories AS C ON P.CategoryId = C.Id
INNER JOIN Suppliers AS S ON P.SupplierId = D.Id

2. Sử dụng view​

Lấy danh sách sản phẩm
SELECT * FROM v_Products

3. Xóa view​

Xóa view
DROP VIEW v_Products

4. Sửa view​

Sửa view
ALTER VIEW v_Products
AS
SELECT
P.ProductId, P.ProductName, P.Price, P.CategoryId, P.SupplierId,
C.CategoryName, S.Name AS 'SupplierName'
FROM Products AS P
INNER JOIN Categories AS C ON P.CategoryId = C.Id
INNER JOIN Suppliers AS S ON P.SupplierId = D.Id

Các tùy chọn khi tạo view​

WITH SCHEMABINDING​

Với việc sử dụng WITH SCHEMABINDING, view sẽ được ràng buộc với các đối tượng khác trong cơ sở dữ liệu. Nếu bạn thực hiện thay đổi cấu trúc của các đối tượng được ràng buộc (như thay đổi tên cột, tên bảng, ...), bạn sẽ không thể thực hiện được.

Tạo view và ràng buộc với schema
CREATE VIEW v_Products
WITH SCHEMABINDING
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P

WITH ENCRYPTION​

Với việc sử dụng WITH ENCRYPTION, mã nguồn của đối tượng sẽ được mã hóa và không thể đọc hoặc truy cập trực tiếp thông qua các công cụ SQL Server Management Studio (SSMS) hoặc các công cụ khác. Khi một đối tượng được mã hóa, SQL Server sẽ chỉ thực thi đối tượng đó mà không cung cấp truy cập vào mã nguồn.

Tạo view và mã hóa nội dung
CREATE VIEW v_Products
WITH ENCRYPTION
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P

WITH CHECK OPTION​

WITH CHECK OPTION là một cấu hình được sử dụng trong câu lệnh CREATE VIEW để đảm bảo rằng các dòng dự liệu được chọn trong View cũng phải thỏa mãn điều kiện của View. Nếu bạn thêm hoặc cập nhật dữ liệu thông qua View, nó chỉ cho phép các thay đổi đáp ứng điều kiện của View.

Tạo view và ràng buộc với điều kiện
CREATE VIEW v_Products
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P
WHERE
P.Price > 1000 -- Nếu không có điều kiện WHERE thì không thể INSERT, UPDATE, DELETE được
WITH CHECK OPTION
  1. Truy vấn dữ liệu từ view
SELECT * FROM v_Products
  1. Cập nhật dữ liệu thông qua view
UPDATE v_Products SET Price = 900 WHERE Id = 1
Lưu ý

Lưu ý rằng nếu đơn giá mới được cập nhật không thỏa mãn điều kiện "Price > 1000", câu lệnh UPDATE sẽ không được chấp nhận.

Stored Procedures​

1. Tạo stored procedure​

Tạo stored procedure
CREATE PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT * FROM Orders WHERE CreatedDate BETWEEN @FromDate AND @ToDate
END

2. Sử dụng stored procedure​

Sử dụng stored procedure
EXEC usp_GetOrders '2021-01-01', '2021-01-31'

-- hoặc

EXEC usp_GetOrders @FromDate = '2021-01-01', @ToDate = '2021-01-31'

3. Với OUTPUT parameters​

Tạo stored procedure với OUTPUT parameter
CREATE PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME,
@Total INT OUTPUT
AS
BEGIN
SELECT @Total = COUNT(*) FROM Orders WHERE CreatedDate BETWEEN @FromDate AND @ToDate
END
Sử dụng stored procedure với OUTPUT parameter
DECLARE @Total INT
EXEC usp_GetOrders '2021-01-01', '2021-01-31', @Total OUTPUT
SELECT @Total

4. Xóa stored procedure​

Xóa stored procedure
DROP PROCEDURE usp_GetOrders

5. Sửa stored procedure​

Sửa stored procedure
ALTER PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END

Các tùy chọn khi tạo stored procedure​

WITH ENCRYPTION​

Với việc sử dụng WITH ENCRYPTION, mã nguồn của đối tượng sẽ được mã hóa và không thể đọc hoặc truy cập trực tiếp thông qua các công cụ SQL Server Management Studio (SSMS) hoặc các công cụ khác. Khi một đối tượng được mã hóa, SQL Server sẽ chỉ thực thi đối tượng đó mà không cung cấp truy cập vào mã nguồn.

Tạo stored procedure và mã hóa nội dung
CREATE PROCEDURE usp_GetOrders
WITH ENCRYPTION
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END

WITH RECOMPILE​

Với việc sử dụng WITH RECOMPILE, stored procedure sẽ được biên dịch lại mỗi khi thực thi. Điều này sẽ giúp tăng hiệu suất thực thi của stored procedure.

Tạo stored procedure và biên dịch lại mỗi khi thực thi
CREATE PROCEDURE usp_GetOrders
WITH RECOMPILE
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END

WITH EXECUTE AS​

Với việc sử dụng WITH EXECUTE AS, stored procedure sẽ được thực thi với quyền của người dùng được chỉ định.

Tạo stored procedure và thực thi với quyền của người dùng được chỉ định
CREATE PROCEDURE usp_GetOrders
WITH EXECUTE AS 'dbo'
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END