นำไปใช้กับ
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

อาการ

User-Defined ฟังก์ชัน (UDF) ที่นํามาใช้ใน Transact-SQL และที่ส่งกลับค่าข้อมูลเดียวเรียกว่า T-SQL Scalar User-Defined Functions (UDFs) 

ฟีเจอร์การจัดเรียง UDF สเกลาถูกนํามาใช้ใน Microsoft SQL Server 2019 คุณลักษณะนี้สามารถปรับปรุงประสิทธิภาพของคิวรีที่เรียกใช้ T-SQL Scalar UDF ที่การดําเนินการ UDF เป็นปัญหาคอขวดหลัก การอินไลน์ T-SQL Scalar UDF จะแปลง UDF ที่สามารถจัดเรียงได้ให้เป็นนิพจน์เชิงสัมพันธ์โดยอัตโนมัติ 

การอัปเดตแบบสะสมนี้ (CU) มี การแก้ไข หลายอย่างในพื้นที่ต่อไปนี้สําหรับสถานการณ์ที่คิวรีที่ใช้การ Inlining สเกลา UDF อาจส่งกลับข้อความแสดงข้อผิดพลาดหรือผลลัพธ์ที่ไม่คาดคิด:

  • ข้อผิดพลาดชนิดไม่ตรงกันเกิดขึ้นถ้าชนิดการส่งคืนของ UDF เป็น sql_variant (เพิ่มเข้ามาใน SQL Server CU2 2019)

  • การเรียก UDF จากsp_executesqlยกเลิกการดําเนินการ (เพิ่มใน SQL Server CU2 2019)

  • UDF ที่อ้างอิงป้ายชื่อโดยไม่มีคําสั่ง GOTO ที่เกี่ยวข้องส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (ถูกเพิ่มใน SQL Server CU2 2019)

  • หน่วยความจําไม่เพียงพอและการรั่วไหลของหน่วยความจําเกิดขึ้นเนื่องจาก UDF สเกลาขนาดใหญ่มาก (เพิ่มเข้ามาใน SQL Server CU2 2019)

  • ตัวแปรที่ไม่ได้เตรียมใช้งานที่ใช้ในคําสั่งเงื่อนไข (IF-ELSE) ทําให้เกิดข้อผิดพลาด (เพิ่มใน SQL Server CU2 2019)

  • เกิดข้อผิดพลาดในการแปลงอย่างชัดเจนถ้า UDF มีพารามิเตอร์ sql_variant(เพิ่มเข้ามาใน SQL Server CU7 2019)

  • เกิดข้อผิดพลาดถ้าการอ้างอิงฟังก์ชันสเกลา CHECKSUM(เพิ่มเข้ามาใน SQL Server 2019 CU7)

  • การเรียกใช้ UDF ที่มีการประเมินนิพจน์สเกลาใหม่อีกครั้งจํานวนมากอาจทําให้เกิดข้อผิดพลาดตัวจัดกําหนดการที่ไม่ก่อให้เกิดผลผลิต (เพิ่มเข้ามาใน SQL Server 2019 CU7)

    หมายเหตุ: การแก้ไขปัญหานี้อาจทําให้ประสิทธิภาพการทํางานถดถอยในบางครั้ง เพื่อลดการถดถอยของประสิทธิภาพการทํางานนี้ คุณสามารถปิดใช้งานการแก้ไขเดิมโดยการเปิดติดตามค่าสถานะ (TF) 13156

    Microsoft กําลังดําเนินการแก้ไขสําหรับการถดถอยของประสิทธิภาพซึ่งจะพร้อมใช้งานใน CU ในอนาคต

  • ข้อผิดพลาดเกิดขึ้นถ้าคิวรีการอ้างอิง UDF ใช้ OPTION (RECOMPILE)(ถูกเพิ่มใน SQL Server CU7 2019)

  • ข้อผิดพลาดของสิทธิ์จะเกิดขึ้นถ้ามุมมองเรียกใช้ UDF แบบอินไลน์ (เพิ่มเข้ามาใน SQL Server 2019 CU9)

  • การละเมิดการเข้าถึงจะเกิดขึ้นหากมีการใช้query_tsql_scalar_udf_inlinedXEvent (เพิ่มเข้ามาใน SQL Server 2019 CU9)

  • ลักษณะการทํางานที่ไม่สอดคล้องกันเกิดขึ้นเนื่องจาก Scalar UDF Inlining ไม่เคารพคําแนะนําคิวรี QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n(เพิ่มเข้ามาใน SQL Server 2019 CU9)

  • UDF ที่ด้านในประกอบด้วยการรวมที่อาจทําให้เกิดข้อผิดพลาดของตัวจัดกําหนดการที่ไม่ก่อให้เกิดผลลัพธ์ (ถูกเพิ่มใน SQL Server CU9 2019)

  • ข้อผิดพลาดหน่วยความจําไม่เพียงพอเกิดขึ้นเนื่องจากลําดับของการดําเนินการสเกลาบนตัวแปรเดียวกันในบล็อกเงื่อนไข (เพิ่มเข้ามาใน SQL Server 2019 CU9)

  • หลังจากที่คุณอัปเกรดเป็น CU9 การละเมิดการเข้าถึงจะเกิดขึ้นถ้าวัตถุเรียกใช้ UDF แบบอินไลน์สเกลา (UDF1) ที่มี UDF แบบอินไลน์สเกลา (UDF2) ที่ใช้เป็นพารามิเตอร์การป้อนข้อมูล (เพิ่มใน SQL Server CU11 2019)

  • Inlining UDFs might cause error and generate error code 6846, 1011, and 107 (added in SQL Server 2019 CU11)

  • Inlining UDFs that run as the non-sysadmin account might return the error message, "A severe error occurred on the current command. ควรละทิ้งผลลัพธ์ถ้ามี" (เพิ่มใน SQL Server 2019 CU16)

  • การละเมิดการเข้าถึงจะเกิดขึ้นถ้าตารางชั่วคราวถูกเรียกใช้ภายใน UDF โดยใช้คําเหมือน (เพิ่มใน Microsoft SQL Server 2022 CU1 และ SQL Server CU19)

  • การละเมิดการเข้าถึงจะเกิดขึ้นถ้าข้อกําหนด UDF ประกอบด้วยป้ายชื่อ GOTO และคําสั่งRETURN เท่านั้น (เพิ่มเข้ามาใน SQL Server 2022 CU1 และ SQL Server 2019 CU19)

  • UDF สเกลาจะส่งกลับผลลัพธ์ในรูปแบบวันที่และเวลาที่ต่างกันเมื่อเปิดใช้งานฟีเจอร์การจัดเรียง UDF สเกลา (ถูกเพิ่มลงใน SQL Server 2022 CU3 และ SQL Server 2019 CU20)

  • แฟ้มการถ่ายโอนข้อมูลจะถูกสร้างขึ้นถ้าแบบสอบถามที่มีส่วนคําสั่ง GROUP BY ใช้ UDF แบบอินไลน์ในคําสั่ง SELECT โดยไม่มีฟังก์ชันการรวม (เพิ่มใน SQL Server 2022 CU12 และ SQL Server 2019 CU26)

  • ข้อผิดพลาด "กระบวนงานที่เก็บไว้สูงสุด ฟังก์ชัน ทริกเกอร์ หรือดูระดับการซ้อนเกิน (ขีดจํากัด 32)" จะเกิดขึ้นถ้าฟีเจอร์การอินไลน์ Scalar UDF เปิดอยู่ แม้ว่าระดับการซ้อนจะไม่เกิน (เพิ่มใน SQL Server 2022 CU12 และ SQL Server 2019 CU26)

  • หน่วยความจําเสียหายเกิดขึ้นใน sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf ถ้าฟีเจอร์การอินไลนิ่ง Scalar UDF เปิดอยู่ (เพิ่มเข้ามาใน SQL Server 2022 CU12 และ SQL Server 2019 CU26)

  • ผลลัพธ์ที่ไม่ถูกต้องเกิดขึ้นเนื่องจากการผสมกันของ Scalar UDF Inlining and OPTION (RECOMPILE) ในคิวรีเดียวกัน (เพิ่มเข้ามาใน SQL Server 2022 CU17 และ SQL Server 2019 CU31)

การอัปเดตแบบสะสมนี้จะ บล็อกอินลิ่งในสถานการณ์ต่อไปนี้ด้วย:

  • ถ้า UDF อ้างอิงฟังก์ชันภายในบางอย่าง (ตัวอย่างเช่น @@ROWCOUNT) ที่อาจเปลี่ยนแปลงผลลัพธ์ถ้า UDF เป็นแบบอินไลน์ (เพิ่มใน SQL Server 2019 CU2)

  • ถ้าฟังก์ชันการรวมถูกส่งผ่านเป็นพารามิเตอร์ไปยัง UDF สเกลา (เพิ่มเข้ามาใน SQL Server 2019 CU2)

  • ถ้าการอ้างอิง UDF เป็นมุมมองที่มีอยู่แล้วภายใน (ตัวอย่างเช่น OBJECT_ID) (เพิ่มเข้ามาใน SQL Server CU2 2019)

  • ถ้า UDF ใช้วิธีการ XML (เพิ่มใน SQL Server 2019 CU4)

  • ถ้า UDF มีคําสั่ง SELECTที่ใช้ส่วนคําสั่งORDER BYแต่ไม่ TOP 1(เพิ่มลงใน SQL Server CU4)

  • ถ้าคําสั่งSELECT ดําเนินการมอบหมายพร้อมกับส่วนคําสั่ง ORDER BY (ตัวอย่างเช่น SELECT @x = @x +1 FROM table ORDER BY column_name) (เพิ่มใน SQL Server 2019 CU4)

  • ถ้า UDF มีคําสั่ง RETURN หลายคําสั่ง (เพิ่มเข้ามาใน SQL Server 2019 CU5)

  • ถ้าเรียก UDF จากคําสั่ง RETURN (เพิ่มใน SQL Server 2019 CU5)

  • ถ้า UDF อ้างอิงฟังก์ชัน STRING_AGG (เพิ่มเข้ามาใน SQL Server 2019 CU5)

  • ถ้าข้อกําหนด UDF อ้างอิงตารางระยะไกล (เพิ่มเข้ามาใน SQL Server 2019 CU6)

  • ถ้าคิวรีการเรียก UDF ใช้ GROUPING SETSCUBEหรือ ROLLUP (เพิ่มเข้ามาใน SQL Server CU6 2019)

  • ถ้าคิวรีการเรียก UDF มีตัวแปรที่ใช้เป็นพารามิเตอร์ UDF สําหรับงานที่มอบหมาย (ตัวอย่างเช่น SELECT @y=2, @x=UDF(@y)) (เพิ่มใน SQL Server 2019 CU6)

  • ถ้า UDF อ้างอิงคอลัมน์ที่เข้ารหัสลับ (เพิ่มเข้ามาใน SQL Server 2019 CU11)

  • ถ้า UDF มีการอ้างอิงไปยัง WITH XMLNAMESPACES(เพิ่มเข้ามาใน CU11 SQL Server 2019)

  • ถ้าคิวรีที่เรียกใช้ UDF มีนิพจน์ตารางทั่วไป (CTEs) (เพิ่มเข้ามาใน SQL Server CU11 2019)

  • ถ้าข้อกําหนด UDF มีตารางหรือคําเหมือนชั่วคราวสําหรับตารางชั่วคราว (เพิ่มเข้ามาใน SQL Server 2022 CU1 และ SQL Server 2019 CU19)

  • ถ้าข้อกําหนด UDF มีคําสั่งSELECTพร้อมกับส่วนคําสั่งDISTINCTบนคอลัมน์งานที่มอบหมายหลายคอลัมน์ (เพิ่มเข้ามาใน SQL Server 2022 CU4 และ SQL Server 2019 CU20)

  • ถ้า UDF มีคําสั่ง SELECT ที่ใช้ส่วนคําสั่ง TABLESAMPLE PERCENT และการกําหนดตัวแปรหลายรายการ (เพิ่มใน SQL Server CU7)

  • ถ้ามีคิวรี INSERT อยู่บนตารางที่อ้างอิงโดยมุมมองที่มีการทําดัชนีที่มี UDF (ถูกเพิ่มลงใน SQL Server 2022 CU12 และ SQL Server 2019 CU26)

หลังจากที่คุณอัปเกรดเป็น SQL Server 2019 CU2 แต่ก่อนที่คุณจะอัปเกรดเป็น SQL Server CU5 2019 คุณควรประเมินอีกครั้งว่า UDF มีสิทธิ์สําหรับอินบุกหรือไม่ เมื่อต้องการทําเช่นนี้ ให้รีเฟรช UDFs สเกลาที่มีสิทธิ์ผ่านวิธีใดวิธีหนึ่งต่อไปนี้:

  • เรียกใช้ sp_refreshsqlmodule สําหรับ UDF สเกลาที่เกี่ยวข้อง สําหรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการที่เก็บไว้ของระบบนี้ ให้ดูที่ sp_refreshsqlmodule (Transact-SQL)

  • เปลี่ยนแปลงหรือสร้าง UDF สเกลาที่มีอยู่ใหม่โดยใช้ข้อกําหนด สิทธิ์ และการตั้งค่าคุณสมบัติที่มีอยู่ สําหรับข้อมูลเพิ่มเติม ให้ดู ฟังก์ชัน ALTER (Transact-SQL)

คําสั่งต่อไปนี้สร้างสคริปต์เพื่อรีเฟรช Metadata ของ UDF สเกลาแบบอินไลน์ที่มีอยู่:

/*

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

หมายเหตุ: หลังจากที่คุณอัปเกรดเป็น SQL Server CU5 แล้ว เราจะดําเนินการเรียกความยืดหยุ่น UDF โดยอัตโนมัติในระหว่างการคอมไพล์

การแก้ไข

ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตสะสมสําหรับ SQL Server ต่อไปนี้:

แต่ละปรับปรุงสะสมใหม่สําหรับ SQL Server ประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมด และการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการปรับปรุงสะสมก่อนหน้านี้ ดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:

สถานะ

Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นําไปใช้กับ"

อ้างอิง

เรียนรู้เกี่ยวกับ คําศัพท์ ที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ