KB4538581 - KHẮC PHỤC: Sự cố Vô hướng UDF Trong SQL Server 2019

Triệu chứng

User-Defined Hàm (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 vô SQL vô tuyến T-User-Defined (UDF). 

Microsoft SQL Server 2019 đã giới thiệu tính năng Inlining UDF Scalar có thể cải thiện hiệu suất của truy vấn giúp gọi UDF T-SQL Scalar, trong đó thực thi UDF là nút cổ chai chính. Chia SQL vô hướng UDF vô hướng tự động chuyển đổi các UDF không thể thay đổi thành các biểu thức quan hệ. 


Cập nhật tích lũy này bao gồm một số bản sửa lỗi ở nhiều khu vực sau đây đối với các kịch bản mà truy vấn sử dụng Inlining UDF Vô hướng có thể trả về kết quả lỗi hoặc kết quả không mong muốn:

  • Nhập lỗi không khớp nếu loại trả về của UDF là giá sql_variant (được thêm vào Microsoft SQL Server 2019 CU2)

  • Thu hồi UDF từ việc sp_executesql thực thi hủy bỏ (được thêm vào Microsoft SQL Server 2019 CU2)

  • Các UDF tham chiếu nhãn không có lệnh GOTO liên kết sẽ trả về kết quả không chính xác (được thêm vào Microsoft SQL Server 2019 CU2)

  • Điều kiện hết bộ nhớ và rò rỉ bộ nhớ xảy ra do các UDF vô tuyến rất lớn (được thêm vào Microsoft SQL Server 2019 CU2)

  • Các biến không đượ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 Microsoft SQL Server 2019 CU2)

  • Lỗi chuyển đổi rõ ràng nếu UDF SQL_VARIANT số hiệu (được thêm vào Microsoft SQL Server 2019 CU7)

  • Lỗi xuất hiện khi hàm vô hướng tham chiếu CHECKSUM (được thêm vào Microsoft SQL Server 2019 CU7)

  • Thu hồi UDF với số lượng biểu thức vô tuyến cao được đánh giá lại có thể dẫn đến lỗi bộ lập lịch không đạt lợi tức (được thêm vào Microsoft SQL Server 2019 CU7)

  • Lỗi xuất hiện khi truy vấn tham chiếu UDF sử dụng OPTION (RECOMPILE) (được thêm vào Microsoft SQL Server 2019 CU7)

  • Lỗi về quyền xảy ra khi dạng xem gọi các UDF được lập (được thêm vào Microsoft SQL Server 2019 CU9)

  • Vi phạm truy nhập xảy ra khi sử dụng giải pháp XEvent query_tsql_scalar_udf_inlined (được thêm vào Microsoft SQL Server 2019 CU9) 

  • Hành vi không nhất thiết do Xác định UDF Scalar không tôn trọng gợi ý truy vấn 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' (được thêm vào Microsoft SQL Server 2019 CU9)

  • Inlining UDFs contain aggregations that could result in non-yielding scheduler error (added in Microsoft SQL Server 2019 CU9) 

  • Lỗi hết bộ nhớ do một chuỗi thao tác vô tuyến trên cùng một biến trong khối có điều kiện (được thêm vào Microsoft SQL Server 2019 CU9)

  • Vi phạm truy nhập có thể xảy ra khi đối tượng gọi UDF không thể thay đổi vô hướng (UDF1) có vô hướng bằng vô hướng (UDF2) không thể mở rộng, được sử dụng làm tham số đầu vào sau khi nâng cấp lên CU9 (được thêm vào Microsoft SQL Server 2019 CU11)

  • Inlining UDFs could result with following error codes 6846, 1011 and 107 (added in Microsoft SQL Server 2019 CU11)


Cập nhật tích lũy này cũng chặn việc inlining trong các kịch bản sau đây:

  • Nếu UDF tham chiếu các hàm nội tại nhất định (ví dụ: @@ROWCOUNT) có thể làm thay đổi kết quả khi được inlined (được thêm vào Microsoft SQL Server 2019 CU2)

  • Khi hàm tổng hợp được chuyển thành tham số vào UDF vô tuyến (được thêm vào Microsoft SQL Server 2019 CU2)

  • Nếu UDF tham chiếu các dạng xem dựng sẵn (ví dụ: OBJECT_ID) (được thêm vào Microsoft SQL Server 2019 CU2)

  • Nếu UDF sử dụng các phương pháp XML (được thêm vào Microsoft SQL Server 2019 CU4)

  • Nếu UDF chứa SELECT có ORDER BY mà không có "TOP 1" (được thêm vào Microsoft SQL Server 2019 CU4)

  • Nếu truy vấn SELECT thực hiện một bài tập kết hợp với mệnh đề ORDER BY (ví dụ: SELECT @x = @x +1 FROM table ORDER BY column_name) (được thêm vào Microsoft SQL Server 2019 CU4)

  • Nếu UDF chứa nhiều câu lệnh RETURN (được thêm vào Microsoft SQL Server 2019 CU5)

  • Nếu UDF được gọi từ câu lệnh RETURN (được thêm vào Microsoft SQL Server 2019 CU5)

  • Nếu UDF tham chiếu đến hàm STRING_AGG (được thêm vào Microsoft SQL Server 2019 CU5)

  • Nếu định nghĩa UDF tham chiếu bảng từ xa (được thêm vào Microsoft SQL Server 2019 CU6)

  • Nếu truy vấn gọi UDF sử dụng GROUPING SETS, CUBE hoặc ROLLUP (được thêm vào Microsoft SQL Server 2019 CU6)

  • Nếu truy vấn gọi UDF chứa biến được dùng làm tham số UDF để gán (ví dụ: SELECT @y=2, @x=UDF(@y)) (được thêm vào Microsoft SQL Server 2019 CU6)

  • Nếu UDF tham chiếu các cột được mã hóa (được thêm vào Microsoft SQL Server 2019 CU11)

  • Nếu UDF có chứa tham chiếu đến 'WITH XMLNAMESPACES' (được thêm vào Microsoft SQL Server 2019 CU11)

  • Nếu truy vấn gọi UDF có Các biểu thức bảng phổ biến (CTEs) (được thêm vào Microsoft SQL Server 2019 CU11)


Sau khi nâng cấp lên Microsoft SQL Server 2019 CU2 nhưng trước khi nâng cấp lên CU5, bạn nên đánh giá lại xem một UDF có đủ điều kiện để inlining 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_refreshsqlmodule UDF hướng có thể áp dụng (xem sp_refreshsqlmodule (Transact-SQL) để biết chi tiết về quy trình lưu trữ hệ thống này)

  • Thay đổi hoặc tạo lại UDF vô hướng hiện có bằng cách sử dụng định nghĩa, quyền và thuộc tính đặt hiện có (xem ALTER FUNCTION (Transact-SQL))

Tập lệnh sau đây tạo ra một tập lệnh để làm mới siêu dữ liệu cho các UDF vô hướng được lập sẵn hiện có:

/*

Tạo một tập lệnh có thể được dùng để làm mới tất cả các UDF Vô hình Vô hình không thể thay đổi hiện hoạt.

Lưu ý Lệnh sp_refreshsqlmodule động không ảnh hưởng đến bất kỳ quyền nào, thuộc tính mở rộng,

hoặc SET tùy chọn được liên kết với đối tượng.

*/

CHỌN 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

TỪ sys.sql_modules

KHI is_inlineable = 1

AND inline_type = 1;

GO

Chú ý Sau khi bạn nâng cấp lên Microsoft SQL Server 2019 CU5, chúng tôi sẽ tự động lấy lại khả năng nội tuyến của UDF trong quá trình biên soạn.

Giải pháp

Sự cố này đã được khắc phục trong bản cập nhật tích lũy sau đây SQL Server:

Mỗi bản cập nhật tích lũy mới cho SQL Server chứa tất cả hotfix và tất cả các 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 để biết SQL Server:

Trạng thái

Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".

Tham khảo

Tìm hiểu về thuật ngữ mà Microsoft sử dụng để mô tả các bản cập nhật phần mềm.

Bạn cần thêm trợ giúp?

Phát triển các kỹ năng của bạn
Khám phá nội dung đào tạo
Sở hữu tính năng mới đầu tiên
Tham gia Microsoft dùng nội bộ

Thông tin này có hữu ích không?

Cảm ơn phản hồi của bạn!

×