Font size
WorksheetsTN-Chương 5: Con trỏ trong SQL Server
Total questions: 30
Worksheet time: 18mins
Con trỏ (Cursor) trong SQL Server được sử dụng để làm gì?
Xử lý dữ liệu theo tập hợp (set-based)
Duyệt và xử lý từng dòng dữ liệu (row-by-row)
Tạo bảng tạm thời
Thực hiện các phép toán số học
Bước nào sau đây KHÔNG thuộc quy trình sử dụng con trỏ?
DECLARE
OPEN
COMMIT
FETCH
@@FETCH_STATUS trả về giá trị nào khi fetch thành công?
-1
0
-2
1
Loại con trỏ nào chỉ cho phép duyệt tiến (forward-only)?
Static Cursor
Dynamic Cursor
Keyset Cursor
Fast Forward Cursor
Hậu quả khi không DEALLOCATE con trỏ là gì?
Gây lỗi cú pháp
Tăng hiệu suất truy vấn
Có thể gây memory leak
Tự động đóng con trỏ
Câu lệnh nào dùng để đóng con trỏ?
CLOSE cursor_name
DROP cursor_name
RELEASE cursor_name
END cursor_name
Hàm trả về giá trị vô hướng (Scalar UDF) trả về kiểu dữ liệu nào?
Một bảng
Một giá trị đơn (int, varchar, v.v.)
Một tập hợp các dòng
Một con trỏ
Cú pháp nào đúng để tạo một Scalar UDF?
CREATE FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS TABLE AS ...
CREATE FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS INT AS BEGIN RETURN DATEDIFF(YEAR, @BirthDate, GETDATE()); END
CREATE FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS @table TABLE ...
ALTER FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS INT AS ...
Scalar UDF có thể làm gì trong SQL Server?
Sửa dữ liệu trong bảng cố định
Tích hợp trong câu lệnh SELECT và WHERE
Gọi stored procedure
Trả về nhiều dòng dữ liệu
Nhược điểm chính của Scalar UDF là gì?
Không thể gọi trong truy vấn
Có thể chậm khi gọi nhiều lần trên tập dữ liệu lớn
Chỉ trả về kiểu bảng
Không hỗ trợ tham số
Tùy chọn nào giúp cải thiện hiệu suất của Scalar UDF?
WITH ENCRYPTION
WITH SCHEMABINDING
WITH EXECUTE AS
WITH RECOMPILE
Cách gọi Scalar UDF đúng là gì?
SELECT * FROM dbo.GetAge('1990-01-01')
SELECT dbo.GetAge('1990-01-01') AS Age
EXEC dbo.GetAge @BirthDate = '1990-01-01'
CALL dbo.GetAge('1990-01-01')
Hàm trả về biến bảng (Multi-statement TVF) sử dụng gì để lưu trữ dữ liệu?
Bảng cố định
Biến bảng (@table)
Con trỏ
Temp table (#table)
Cú pháp nào đúng để tạo Multi-statement TVF?
CREATE FUNCTION dbo.GetEmps () RETURNS TABLE AS RETURN (SELECT ...)
CREATE FUNCTION dbo.GetEmps (@DeptID INT) RETURNS @emps TABLE (ID INT) AS BEGIN INSERT INTO @emps ... RETURN; END
CREATE FUNCTION dbo.GetEmps () RETURNS INT AS BEGIN RETURN 1; END
ALTER FUNCTION dbo.GetEmps () RETURNS TABLE AS ...
Multi-statement TVF có thể làm gì?
Thực hiện nhiều câu lệnh T-SQL trong thân hàm
Trả về giá trị vô hướng
Sửa dữ liệu trong bảng cố định
Gọi stored procedure trực tiếp
Nhược điểm của Multi-statement TVF là gì?
Không thể dùng trong JOIN
Biến bảng không có index/statistics, chậm với dữ liệu lớn
Chỉ hỗ trợ một câu SELECT
Không thể gọi với tham số
Cách gọi Multi-statement TVF đúng là gì?
SELECT dbo.GetEmps(1)
SELECT * FROM dbo.GetEmps(1)
EXEC dbo.GetEmps @DeptID = 1
CALL dbo.GetEmps(1)
Multi-statement TVF phù hợp nhất khi nào?
Xử lý logic phức tạp với nhiều câu lệnh
Trả về một giá trị đơn
Cần index trên bảng trả về
Thay thế con trỏ hoàn toàn
Hàm trả về giá trị bảng (Inline TVF) khác Multi-statement TVF ở điểm nào?
Chỉ dùng một câu SELECT, không BEGIN/END
Trả về giá trị vô hướng
Hỗ trợ sửa dữ liệu bảng cố định
Không thể dùng trong JOIN
Cú pháp nào đúng để tạo Inline TVF?
CREATE FUNCTION dbo.GetActiveEmps () RETURNS @table TABLE ...
CREATE FUNCTION dbo.GetActiveEmps () RETURNS TABLE AS RETURN (SELECT ...)
CREATE FUNCTION dbo.GetActiveEmps () RETURNS INT AS BEGIN ... END
ALTER FUNCTION dbo.GetActiveEmps () RETURNS TABLE AS BEGIN ... END
Ưu điểm chính của Inline TVF là gì?
Hỗ trợ nhiều câu lệnh T-SQL
Hiệu suất cao, được tối ưu bởi SQL Server
Có thể sửa dữ liệu bảng cố định
Hỗ trợ gọi stored procedure
Cách sử dụng Inline TVF với CROSS APPLY là gì?
Cách sử dụng Inline TVF với CROSS APPLY là gì?
SELECT * FROM Departments d CROSS APPLY dbo.GetActiveEmps(d.DeptID) e
SELECT * FROM dbo.GetActiveEmps(d.DeptID) CROSS APPLY Departments d
EXEC dbo.GetActiveEmps CROSS APPLY Departments
CALL dbo.GetActiveEmps(d.DeptID) WITH Departments
Khi nào nên ưu tiên Inline TVF thay vì Multi-statement TVF?
Khi cần xử lý logic phức tạp với nhiều câu lệnh
Khi cần hiệu suất cao với một câu SELECT
Khi cần sửa dữ liệu bảng cố định
Khi cần gọi stored procedure
Quy tắc nào bắt buộc khi tạo UDF?
Phải gọi stored procedure
Tên hàm phải duy nhất trong schema
Phải sửa dữ liệu bảng cố định
Phải dùng vòng lặp WHILE
Hạn chế của UDF là gì?
Không thể dùng trong SELECT
Không thể sửa dữ liệu bảng cố định
Không thể gọi với tham số
Không hỗ trợ WITH SCHEMABINDING
Cú pháp nào đúng để chỉnh sửa Scalar UDF?
ALTER FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS TABLE AS ...
ALTER FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS INT AS BEGIN ... END
DROP FUNCTION dbo.GetAge (@BirthDate DATE)
CREATE FUNCTION dbo.GetAge (@BirthDate DATE) RETURNS @table TABLE ...
Khi chỉnh sửa UDF có SCHEMABINDING, cần làm gì trước?
Thêm tham số mới
Xóa ràng buộc SCHEMABINDING hoặc DROP hàm
Gọi stored procedure
Tạo con trỏ
Lệnh nào dùng để xóa UDF?
DROP FUNCTION dbo.function_name
DELETE FUNCTION dbo.function_name
REMOVE FUNCTION dbo.function_name
CLOSE FUNCTION dbo.function_name
Cách nào giúp bảo toàn quyền truy cập khi chỉnh sửa UDF?
Sử dụng DROP và CREATE thay vì ALTER
Sử dụng ALTER thay vì DROP và CREATE
Thêm WITH ENCRYPTION
Kiểm tra @@FETCH_STATUS
