อาการ
User-Definedฟังก์ชัน (UDFs) ที่ถูกปรับใช้ใน Transact-SQL และที่ส่งกลับค่าข้อมูลเดียวเรียกว่าฟังก์ชัน T-SQL Scalar User-Defined (UDFs)
Microsoft SQL Server 2019 ได้เริ่มใช้ฟีเจอร์การลงชื่อเข้าใช้ Scalar UDF ที่สามารถปรับปรุงประสิทธิภาพของคิวรีที่เรียกใช้ T-SQL Scalar UDFs ซึ่งการปฏิบัติการ UDF คือคอขวดหลัก การ Inlining T-SQL Scalar UDF จะแปลง UDF แบบอินไลน์ให้เป็นนิพจน์เชิงสัมพันธ์โดยอัตโนมัติ
การอัปเดตสะสมนี้มีการแก้ไข หลายอย่าง ในพื้นที่ต่อไปนี้ในสถานการณ์ที่คิวรีที่ใช้การ Inlining ของ Scalar UDF อาจส่งกลับข้อผิดพลาดหรือผลลัพธ์ที่ไม่คาดคิด
-
พิมพ์ข้อผิดพลาดไม่ตรงกันถ้าชนิดการส่งกลับ UDF เป็นชนิดsql_variant (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)
-
การเพิกถอน UDF sp_executesqlยกเลิกการปฏิบัติการ (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)
-
UDFs อ้างอิงป้ายชื่อโดยไม่เชื่อมโยง GOTO สั่งส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เพิ่มใน Microsoft SQL Server 2019 CU2)
-
เงื่อนไขในหน่วยความจําไม่เพียงพอและการรั่วไหลของหน่วยความจําเกิดขึ้นเนื่องจาก UDFs สเกลาขนาดใหญ่มาก (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)
-
ตัวแปรที่ไม่ได้เริ่มใช้ในข้อความเงื่อนไข (IF-ELSE) ทําให้เกิดข้อผิดพลาด (ถูกเพิ่มใน Microsoft SQL Server 2019 CU2)
-
ข้อผิดพลาดในการแปลงอย่างชัดเจนถ้า UDF SQL_VARIANTพารามิเตอร์ (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)
-
เกิดข้อผิดพลาดยกตัวขึ้นเมื่อฟังก์ชันสเกลาอ้างอิง CHECKSUM (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)
-
การรีซีก UDF ที่มีการประเมินนิพจน์สเกลาจํานวนมากอาจส่งผลให้เกิดข้อผิดพลาดตัวจัดตารางงานที่ไม่ใช่ผลตอบแทน (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)
-
เกิดข้อผิดพลาดเมื่อ UDF อ้างอิงคิวรีโดยใช้ OPTION (RECOMPILE) (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)
-
ข้อผิดพลาดสิทธิ์ที่เพิ่มขึ้นเมื่อมุมมอง INVOKE INLINED UDFs (เพิ่มใน Microsoft SQL Server 2019 CU9)
-
การละเมิดการเข้าถึงที่เกิดขึ้นเมื่อใช้ฟังก์ชัน XSvent query_tsql_scalar_udf_inlined (ที่เพิ่มใน Microsoft SQL Server 2019 CU9)
-
ลักษณะการเกิดขึ้นไม่สอดคล้องกันเนื่องจากสเกลา UDF Inlining ไม่เคารพเคล็ดลับคิวรี 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' (ที่เพิ่มใน Microsoft SQL Server 2019 CU9)
-
UDF แบบ Inlining ประกอบด้วยการรวมที่อาจส่งผลให้เกิดข้อผิดพลาดตัวจัดตารางงานที่ไม่ใช่ผลตอบแทน (ที่เพิ่มใน Microsoft SQL Server 2019 CU9)
-
มีข้อผิดพลาดด้านหน่วยความจําเกิดขึ้นเนื่องจากลดับของการดําเนินการสเกลาบนตัวแปรเดียวกันในการบล็อกตามเงื่อนไข (ถูกเพิ่มใน Microsoft SQL Server 2019 CU9)
การอัปเดตสะสมนี้ยัง บล็อกการขีดเส้นใต้ในสถานการณ์ต่อไปนี้
-
ถ้า UDF อ้างอิงฟังก์ชันเฉพาะบางอย่าง (ตัวอย่างเช่น @@ROWCOUNT) ที่อาจเปลี่ยนแปลงผลลัพธ์เมื่ออินลิน์ (เพิ่มใน Microsoft SQL Server 2019 CU2)
-
เมื่อฟังก์ชันการรวมถูกส่งเป็นพารามิเตอร์ไปยังสเกลา UDF (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)
-
ถ้า UDF อ้างอิงมุมมองที่มีอยู่แล้วภายใน (ตัวอย่างเช่น: OBJECT_ID) (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)
-
ถ้า UDF ใช้วิธีการ XML (ที่เพิ่มใน Microsoft SQL Server 2019 CU4)
-
ถ้า UDF มี SELECT ที่มี ORDER BY โดยไม่มี "TOP 1" (เพิ่มใน Microsoft SQL Server 2019 CU4)
-
ถ้าคิวรี SELECT มอบหมายงานร่วมกับส่วนสั่ง ORDER BY (ตัวอย่างเช่น SELECT @x = @x +1 FROM table ORDER BY column_name) (เพิ่มใน MICROSOFT SQL Server 2019 CU4)
-
ถ้า UDF มีหลายข้อความส่งกลับ (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)
-
ถ้า UDF ถูกเรียกจากข้อความ RETURN (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)
-
ถ้า UDF อ้างอิงฟังก์ชัน STRING_AGG (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)
-
ถ้าข้อนิยาม UDF อ้างอิงตารางระยะไกล (เพิ่มใน Microsoft SQL Server 2019 CU6)
-
ถ้าคิวรีการโทร UDF ใช้ GROUPING SETS, CUBE หรือ ROLLUP (เพิ่มใน Microsoft SQL Server 2019 CU6)
-
ถ้าคิวรี UDF-calling มีตัวแปรที่ใช้เป็นพารามิเตอร์ UDF ในการมอบหมาย (ตัวอย่างเช่น SELECT @y=2, @x=UDF(@y)) (ที่เพิ่มใน Microsoft SQL Server 2019 CU6)
หลังจากที่คุณอัปเกรดเป็น Microsoft SQL Server 2019 CU2 แต่ก่อนที่คุณจะอัปเกรดเป็น CU5 คุณควรประเมินอีกครั้งว่า UDF มีสิทธิ์ในการลงชื่อเข้าใช้หรือไม่ เมื่อต้องการรีเฟรช UDF ที่มีสิทธิ์สเกลาผ่านวิธีการใดวิธีหนึ่งต่อไปนี้:
-
เรียกใช้ sp_refreshsqlmodule สเกลาที่บังคับใช้ UDF (ดู sp_refreshsqlmodule (Transact-SQL) เพื่อดูรายละเอียดเกี่ยวกับกระบวนงานที่จัดเก็บไว้ในระบบนี้)
-
เปลี่ยนแปลงหรือสร้างสเกลา UDF ที่มีอยู่ใหม่โดยใช้การนิยาม สิทธิ์ และตั้งค่าคุณสมบัติที่มีอยู่ (ดู ฟังก์ชัน ALTER (Transact-SQL))
สคริปต์ต่อไปนี้สร้างสคริปต์เพื่อรีเฟรชเมตาดาต้าของ UDF สเกลาที่ขีดเส้นใต้ที่มีอยู่:
/*
สร้างสคริปต์ที่สามารถใช้เพื่อรีเฟรช Scalar UDFs แบบอินไลน์ที่สามารถใช้งานทั้งหมดได้
หมายเหตุ sp_refreshsqlmoduleจะไม่มีผลต่อสิทธิ์ใดๆ คุณสมบัติเพิ่มเติม
หรือตัวเลือก SET ที่เกี่ยวข้องกับวัตถุ
*/
SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +']' + '[' + OBJECT_NAME(object_id)
+ ']'';' AS 'RefreshStatement'
จาก sys.sql_modules
WHERE is_inlineable = 1
AND inline_type = 1;
GO
หมายเหตุ หลังจากที่คุณอัปเกรดเป็น Microsoft SQL Server 2019 CU5 เราจะรับ UDF แบบอินไลน์ในระหว่างการคอมไพล์อีกครั้งโดยอัตโนมัติ
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
การแก้ไข
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตสะสมต่อไปนี้ของ SQL Server:
เกี่ยวกับการอัปเดตสะสมของ SQL Server
การอัปเดตสะสมใหม่แต่ละรายการของ SQL Server มีการแก้ไขด่วนทั้งหมดและการแก้ไขด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตสะสมก่อนหน้า ดูการอัปเดตสะสมล่าสุดของ SQL Server:
อ้างอิง
เรียนรู้เกี่ยวกับ ศัพท์เฉพาะที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์