โอเวอร์โฟลว์ทางคณิตศาสตร์ของคิวรี SELECT


9

ฉันพบปัญหาทางคณิตศาสตร์มากเกินไปในคำสั่ง SELECT แบบง่าย ข้อความค้นหาดังต่อไปนี้เช่น

SELECT [SaleValue] FROM Sales

[SaleValue]เป็นประเภทข้อมูลdecimal(9,0)ไม่ใช่คอลัมน์ที่คำนวณ

decimal(10,0)เหตุผลที่เกิดขึ้นนี้เป็นเพราะอย่างใดคอลัมน์มีแถวที่สนามนี้ได้รับการจัดเก็บค่าที่มากกว่าประเภทข้อมูลที่ระบุเช่น

ฉันจะได้รับเลือกให้ทำงานเมื่อฉันเพิ่มขนาดของคอลัมน์ ตารางที่มีปัญหามีสองอินสแตนซ์อื่นในคอลัมน์และแถวอื่น ๆ ที่สอง

สถานการณ์นี้เป็นไปได้อย่างไร ค่านอกช่วงถูกบันทึกไว้ในคอลัมน์ตั้งแต่แรกอย่างไร

ฉันใช้เซิร์ฟเวอร์ Microsoft SQL + นี่คือตารางพื้นฐานไม่ใช่มุมมอง


1
วิธีเดียวที่เป็นไปได้ที่ฉันสามารถคิดได้ว่าการบังคับให้สิ่งนี้เกิดขึ้นคือการแก้ไขตารางระบบผ่าน DAC ซึ่งเป็นกระบวนการที่ค่อนข้างรุนแรงซึ่งใครบางคนหวังว่าจะสามารถบอกคุณได้ว่ามันถูกทำกับฐานข้อมูลนี้หรือไม่ ถึงอย่างนั้นฉันก็ไม่แน่ใจว่ามันจะเป็นไปได้ด้วยดี (หรือเป็นไปได้) นอกเหนือจากนั้นเราจำเป็นต้องมีสคริปต์การเล่นซ้ำเพื่อดูสถานการณ์นี้สำหรับตัวเราเองและฉันคิดว่าการสร้างการเล่นซ้ำถ้าเป็นไปได้อาจใช้เวลาหลายปีในการทดลอง
Damien_The_Unbeliever

ยิ่งจำไว้ว่า 9/10 เป็นจุดตัดสำหรับขนาดหน่วยเก็บข้อมูลdecimal- a decimal(9,0)ควรมีขนาด5 ไบต์และdecimal(10,0)9 ดังนั้นฉันคิดว่ามันมีโอกาสน้อยที่คุณสามารถทำได้ผ่านการแก้ไขตารางระบบเนื่องจากคุณไม่มี ขนาดที่เก็บข้อมูลที่ถูกต้องสำหรับข้อมูลในแต่ละแถว
Damien_The_Unbeliever

1
@Damien_The_Unbeliever ไม่รู้ว่าจะทำซ้ำอย่างไร ฉันใช้เวลาหนึ่งชั่วโมงกว่าจะเข้าใจว่าเกิดอะไรขึ้น เมื่อเห็นว่ามันเหมือนเห็นน้ำแห้งหรือความร้อนเย็น สุจริตมันทำให้ฉันนิ่งงัน

คำตอบ:


15

สิ่งนี้สามารถเกิดขึ้นได้หลายวิธีตัวอย่างเช่นอธิบายไว้ในการแก้ไขปัญหาข้อผิดพลาด DBCC 2570 ใน SQL Server 2005 และรุ่นที่ใหม่กว่า :

ข้อมูลไม่ถูกต้องหรืออยู่นอกช่วงอาจถูกจัดเก็บในฐานข้อมูล SQL Server ในรุ่นก่อนหน้าด้วยเหตุผลดังต่อไปนี้:

  • มีข้อมูลที่ไม่ถูกต้องในแหล่งที่มาขณะที่ใช้วิธีการแทรกจำนวนมากเช่นยูทิลิตี bcp
  • ข้อมูลไม่ถูกต้องถูกส่งผ่านการเรียกเหตุการณ์ RPC ที่เกิดขึ้นกับ SQL Server
  • สาเหตุที่เป็นไปได้อื่น ๆ ของความเสียหายของข้อมูลทางกายภาพทำให้ค่าคอลัมน์อยู่ในสถานะไม่ถูกต้อง

บทความนั้นมีข้อมูลที่เป็นประโยชน์มากมายในหัวข้อ สำหรับข้อมูลเบื้องต้นโปรดดูเอกสารประกอบDBCC CHECKDBและDATA_PURITYตัวเลือกโดยเฉพาะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.