Triệu chứng
Hàm User-Defined (UDF) được thực hiện trong Transact-SQL và trả về một giá trị dữ liệu duy nhất được gọi là Hàm User-Defined Scalar T-SQL (UDF).
Tính năng Scalar UDF Inlining được giới thiệu trong Microsoft SQL Server 2019. Tính năng này có thể cải thiện hiệu suất của các truy vấn gọi UDF Vô hướng T-SQL, trong đó việc thực thi UDF là nút cổ chai chính. T-SQL Scalar UDF Nội tuyến tự động chuyển đổi các UDF có thể nội tuyến thành các biểu thức quan hệ.
Bản cập nhật tích lũy (CU) này bao gồm một số bản sửa lỗi trên các khu vực sau đây cho các tình huống mà truy vấn sử dụng Nội tuyến UDF vô hướng có thể trả về thông báo lỗi hoặc kết quả không mong muốn:
- Lỗi không khớp kiểu xảy ra nếu loại trả về của UDF là a
sql_variant(được thêm vào SQL Server 2019 CU2). - Lệnh gọi UDF từ hủy
sp_executesqlthực thi (được thêm vào SQL Server 2019 CU2). - Các UDF tham chiếu nhãn mà không có lệnh liên kết
GOTOtrả về kết quả không chính xác (được thêm vào SQL Server 2019 CU2). - Tình trạng hết bộ nhớ và rò rỉ bộ nhớ xảy ra do các UDF vô hướng rất lớn (được thêm vào SQL Server 2019 CU2).
- Các biến không được khởi tạo được sử dụng trong câu lệnh điều kiện (
IF-ELSE) gây ra lỗi (được thêm vào SQL Server 2019 CU2). - Lỗi chuyển đổi rõ ràng xảy ra nếu UDF có
sql_varianttham số (được thêm vào SQL Server 2019 CU7). - xảy ra lỗi nếu hàm vô hướng tham chiếu
CHECKSUM(được thêm vào SQL Server 2019 CU7). - Lệnh gọi UDF có nhiều đánh giá lại biểu thức vô hướng có thể gây ra lỗi bộ lập lịch không mang lại kết quả (được thêm vào SQL Server 2019 CU7).
Lưu ý: Bản sửa lỗi cho sự cố này đôi khi có thể làm giảm hiệu suất. Để giảm thiểu tình trạng giảm hiệu suất này, bạn có thể tắt bản sửa lỗi ban đầu bằng cách bật cờ theo dõi (TF) 13156.
Microsoft đang nghiên cứu về bản sửa lỗi cho hiện tượng hồi quy hiệu suất này sẽ có trong CU trong tương lai. - Lỗi xảy ra nếu truy vấn tham chiếu UDF sử dụng
OPTION (RECOMPILE)(được thêm vào SQL Server 2019 CU7). - Xảy ra lỗi quyền nếu các dạng xem gọi UDF nội tuyến (được thêm vào SQL Server 2019 CU9).
- Vi phạm truy cập xảy ra nếu
query_tsql_scalar_udf_inlinedsử dụng XEvent (được thêm vào SQL Server 2019 CU9). - Hành vi không nhất quán xảy ra vì Nội tuyến UDF vô hướng không tôn trọng gợi
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_ný truy vấn (được thêm vào SQL Server 2019 CU9). - UDF nội tuyến chứa các tổng hợp có thể gây ra lỗi bộ lập lịch không mang lại (được thêm vào SQL Server 2019 CU9).
- Lỗi hết bộ nhớ xảy ra do một chuỗi các phép toán vô hướng trên cùng một biến trong các khối có điều kiện (được thêm vào SQL Server 2019 CU9).
- Sau khi bạn nâng cấp lên CU9, vi phạm truy nhập sẽ xảy ra nếu một đối tượng gọi UDF có thể dòng vô hướng (UDF1) có UDF có thể dòng vô hướng (UDF2) được sử dụng làm tham số đầu vào (được thêm vào SQL Server 2019 CU11).
- Inline UDF có thể gây ra lỗi và tạo mã lỗi 6846, 1011 và 107 (được thêm vào SQL Server 2019 CU11).
- Việc nội dung các UDF chạy với vai trò là tài khoản không phải là sysadmin có thể trả về thông báo lỗi "Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Kết quả, nếu có, nên bị loại bỏ" (được thêm vào SQL Server 2019 CU16).
- Vi phạm truy nhập xảy ra nếu bảng tạm thời được gọi bên trong UDF bằng cách sử dụng từ đồng nghĩa (được thêm vào Microsoft SQL Server 2022 CU1 và SQL Server 2019 CU19).
- Vi phạm truy nhập xảy ra nếu định nghĩa UDF chỉ
GOTOchứa nhãn và mộtRETURNcâu lệnh (được thêm vào SQL Server 2022 CU1 và SQL Server 2019 CU19). - UDF vô hướng trả về kết quả ở các định dạng ngày và giờ khác nhau khi bật tính năng Nội tuyến UDF vô hướng (được thêm vào SQL Server 2022 CU3 và SQL Server 2019 CU20).
- Tệp kết xuất sẽ được tạo nếu một truy vấn có mệnh
GROUP BYđề sử dụng các UDF nội tuyến trong một câuSELECTlệnh mà không có hàm tổng hợp (được thêm vào SQL Server 2022 CU12 và SQL Server 2019 CU26). - Lỗi "Đã vượt quá mức lồng thủ tục, hàm, trình kích hoạt hoặc dạng xem được lưu trữ tối đa (giới hạn 32)" xảy ra nếu tính năng Nội tuyến UDF vô hướng được bật, ngay cả khi không vượt quá mức lồng (đã thêm vào SQL Server 2022 CU12 và SQL Server 2019 CU26).
- Hỏng bộ nhớ xảy ra nếu
sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdftính năng Nội tuyến UDF vô hướng được bật (được thêm vào SQL Server 2022 CU12 và SQL Server 2019 CU26). - Kết quả không chính xác xảy ra do sự kết hợp của Scalar UDF Inlining và
OPTION (RECOMPILE)trong cùng một truy vấn (được thêm vào SQL Server 2022 CU17 và SQL Server 2019 CU31).
Bản cập nhật tích lũy này cũng chặn tính năng nội tuyến trong các kịch bản sau:
- Nếu UDF tham chiếu một số hàm nội tại nhất định (ví dụ:
@@ROWCOUNT) thì có thể làm thay đổi kết quả nếu UDF được nội tuyến (được thêm vào SQL Server 2019 CU2). - Nếu hàm tổng hợp được truyền dưới dạng tham số cho UDF vô hướng (được thêm vào SQL Server 2019 CU2).
- Nếu UDF tham chiếu đến các dạng xem tích hợp sẵn (ví dụ:
OBJECT_ID) (được thêm vào SQL Server 2019 CU2). - Nếu UDF sử dụng phương thức XML (được thêm vào SQL Server 2019 CU4).
- Nếu UDF chứa một
SELECTcâu lệnh sử dụng mệnh đề nhưng không sửTOP 1dụng (ORDER BYđã thêm vào SQL Server 2019 CU4). - Nếu câu
SELECTlệnh thực hiện gán cùng vớiORDER BYmệnh đề (ví dụ:SELECT @x = @x +1 FROM table ORDER BY column_name) (được thêm vào SQL Server 2019 CU4). - Nếu UDF chứa nhiều
RETURNcâu lệnh (được thêm vào SQL Server 2019 CU5). - Nếu UDF được gọi từ một
RETURNcâu lệnh (được thêm vào SQL Server 2019 CU5). - Nếu UDF tham chiếu đến
STRING_AGGhàm (được thêm vào SQL Server 2019 CU5). - Nếu định nghĩa UDF tham chiếu đến các bảng từ xa (được thêm vào SQL Server 2019 CU6).
- Nếu truy vấn gọi UDF sử dụng
GROUPING SETS,CUBEhoặc (ROLLUPđược thêm vào SQL Server 2019 CU6). - Nếu truy vấn gọi UDF chứa một biến được sử dụng làm tham số UDF cho việc gán (ví dụ:
SELECT @y=2, @x=UDF(@y)) (được thêm vào SQL Server 2019 CU6). - Nếu UDF tham chiếu đến các cột được mã hóa (được thêm vào SQL Server 2019 CU11).
- Nếu UDF chứa các tham chiếu đến
WITH XMLNAMESPACES(đã thêm vào SQL Server 2019 CU11). - Nếu truy vấn gọi UDF có Biểu thức bảng phổ biến (CTE) (được thêm vào SQL Server 2019 CU11).
- Nếu định nghĩa UDF chứa bảng tạm thời hoặc từ đồng nghĩa cho bảng tạm thời (được thêm vào SQL Server 2022 CU1 và SQL Server 2019 CU19).
- Nếu định nghĩa UDF có một
SELECTcâu lệnh cùng với mộtDISTINCTmệnh đề trên nhiều cột nhiệm vụ (được thêm vào SQL Server 2022 CU4 và SQL Server 2019 CU20). - Nếu UDF chứa một
SELECTcâu lệnh sử dụngTABLESAMPLE PERCENTmệnh đề và nhiều nhiệm vụ biến (được thêm vào SQL Server 2022 CU7). - Nếu truy
INSERTvấn tồn tại trên bảng được tham chiếu bởi dạng xem được lập chỉ mục chứa UDF (đã thêm vào SQL Server 2022 CU12 và SQL Server 2019 CU26).
Sau khi nâng cấp lên SQL Server 2019 CU2 nhưng trước khi nâng cấp lên SQL Server 2019 CU5, bạn nên đánh giá lại xem UDF có đủ điều kiện để nội tuyến hay không. Để thực hiện điều này, hãy làm mới các UDF vô hướng đủ điều kiện thông qua một trong các phương pháp sau đây:
- Chạy
sp_refreshsqlmodulecho các UDF vô hướng thích hợp. Để biết thêm thông tin về thủ tục lưu trữ hệ thống này, hãy xem sp_refreshsqlmodule (Transact-SQL). - Alter or re-create the existing scalar UDF by using existing definitions, permissions, and set properties. Để biết thêm thông tin, hãy xem ALTER FUNCTION (Transact-SQL).
Lệnh sau đây tạo ra một tập lệnh để làm mới siêu dữ liệu của mọi UDF vô hướng nội tuyến hiện có:
/*
Generates a script that can be used to refresh all active inlineable scalar UDFs.
Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.
*/
SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)
+ ']'';' AS 'RefreshStatement'
FROM sys.sql_modules
WHERE is_inlineable = 1
AND inline_type = 1;
GO
Lưu ý: Sau khi bạn nâng cấp lên SQL Server 2019 CU5, chúng tôi sẽ tiếp tục tự động suy ra khả năng dòng UDF trong quá trình biên dịch.
Giải pháp
Sự cố này đã được khắc phục trong các bản cập nhật tích lũy sau đây dành cho SQL Server:
Giới thiệu về các bản cập nhật tích lũy cho SQL Server
Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất cho SQL Server:
- Bản cập nhật tích lũy mới nhất cho SQL Server 2022
- Bản cập nhật tích lũy mới nhất cho SQL Server 2019
Trạng thái
Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "Áp dụng cho".
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft dùng để mô tả các bản cập nhật phần mềm.