ไม่มันไม่ได้ถูกบันทึกไว้ทุกที่ ลงคะแนนและระบุกรณีธุรกิจของคุณ นี่คือหนึ่งในรายการสิ่งต่าง ๆ ที่ควรได้รับการแก้ไขใน SQL Server
สิ่งนี้ได้รับการร้องขอเมื่อหลายปีก่อนในการเชื่อมต่อ (อาจเป็นครั้งแรกในช่วงเวลาของ SQL Server 2000 หรือ 2005) จากนั้นอีกครั้งในระบบผลตอบรับใหม่:
และตอนนี้มันถูกส่งในSQL Server 2019 , SQL Server 2017 CU12 และจะปรากฏใน SQL Server 2016 SP2 CU ในอนาคต
ใน CTP สาธารณะแรกสุดของ SQL Server 2019 จะปรากฏเฉพาะภายใต้ค่าสถานะการสืบค้นกลับ 460 ซึ่งฟังดูเป็นความลับ แต่ถูกตีพิมพ์ในเอกสารทางเทคนิคของ Microsoftนี้ นี้จะเป็นพฤติกรรมเริ่มต้น (ไม่มีธงร่องรอยจำเป็น) VERBOSE_TRUNCATION_WARNINGS
ก้าวไปข้างหน้าแม้ว่าคุณจะสามารถที่จะควบคุมนี้ผ่านการกำหนดค่าฐานข้อมูลกำหนดขอบเขตใหม่
นี่คือตัวอย่าง:
USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));
INSERT dbo.x(a) VALUES('foo');
GO
ผลลัพธ์ในรุ่นที่รองรับทั้งหมดก่อน SQL Server 2019:
ข่าวสารเกี่ยวกับ 8152 ระดับ 16 สถานะ 30
สตริง5
หรือข้อมูลไบนารี่จะถูกตัดทอน
คำสั่งถูกยกเลิก
ตอนนี้บน SQL Server 2019 CTPs ด้วยการเปิดใช้งานการตั้งค่าสถานะการสืบค้นกลับ:
DBCC TRACEON(460);
GO
INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);
ผลลัพธ์แสดงตารางคอลัมน์และค่า ( ตัดทอนไม่เต็ม ):
ข่าวสารเกี่ยวกับ 2628, ระดับ 16, สถานะ 1, บรรทัดที่ 11
สตริงหรือข้อมูลไบนารีจะถูกตัดทอนในตาราง 'tempdb.dbo.x', คอลัมน์ 'a' ค่าที่ตัดปลาย: 'f'
คำสั่งถูกยกเลิก
จนกว่าคุณจะสามารถวางทุกอย่างและอัปเกรดเป็น SQL Server 2019 หรือย้ายไปยังฐานข้อมูล Azure SQL คุณสามารถเปลี่ยนรหัส "automagic" ของคุณเพื่อดึง max_length จากsys.columns
พร้อมกับชื่อที่คุณต้องไปที่นั่นแล้วใช้LEFT(column, max_length)
หรือ สิ่งที่เทียบเท่าของ PG คือ หรือเนื่องจากนั่นหมายความว่าคุณจะสูญเสียข้อมูลไปอย่างเงียบ ๆ ลองหาว่าคอลัมน์ใดที่ไม่ตรงกันและแก้ไขคอลัมน์ปลายทางเพื่อให้พอดีกับข้อมูลทั้งหมดจากแหล่งที่มา เมื่อได้รับการเข้าถึงข้อมูลเมตาของทั้งสองระบบและความจริงที่ว่าคุณกำลังเขียนแบบสอบถามที่ต้องจับคู่แหล่งที่มา -> คอลัมน์ปลายทางโดยอัตโนมัติ (มิฉะนั้นข้อผิดพลาดนี้แทบจะเป็นปัญหาที่ใหญ่ที่สุดของคุณ) คุณไม่ควรทำอะไรโหดร้าย คาดเดาทั้งหมด
sys.columns
เพราะฉันไม่รู้ว่าคุณกำลังใช้รหัสใดในการสร้างข้อความค้นหาของคุณโดยอัตโนมัติSELECT name, object_id, max_length FROM sys.columns;
จริงๆมีไม่มากเกินไปที่ซับซ้อนมากขึ้นฉันสามารถคาดเดาเกี่ยวกับการผสมผสานลงในรหัสของคุณมากกว่า เนื่องจากคุณมีรหัสอัตโนมัติที่ต้องทำเช่นนี้ - หรืออะไรทำนองนั้น - ฉันไม่คิดว่าจำเป็นต้องมีตัวอย่าง