ฉันกำลังติดตามคำถามนี้เกี่ยวกับค่าแปลก ๆ ในPERSISTED
คอลัมน์ที่คำนวณ คำตอบนั้นทำให้เดาไม่กี่เกี่ยวกับพฤติกรรมนี้
ฉันถามสิ่งต่อไปนี้: นี่ไม่ใช่ข้อผิดพลาดทันทีหรือไม่ จะPERSISTED
คอลัมน์ที่เคยได้รับอนุญาตให้ทำงานในลักษณะนี้หรือไม่?
DECLARE @test TABLE (
Col1 INT,
Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1
INSERT INTO @test (Col1) VALUES
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5))
SELECT * FROM @test --shows impossible data
UPDATE @test SET Col1 = Col1*1 --"fix" the data by rewriting it
SELECT * FROM @test --observe fixed data
/*
Col1 Contains2
2 0
2 0
0 1
4 0
3 0
Col1 Contains2
2 1
2 1
0 0
4 0
3 0
*/
โปรดทราบว่าข้อมูลจะปรากฏเป็น "เป็นไปไม่ได้" เพราะค่าของคอลัมน์ที่คำนวณไม่สอดคล้องกับคำจำกัดความ
เป็นที่ทราบกันดีว่าฟังก์ชั่นที่ไม่ได้กำหนดค่าไว้ในการสืบค้นสามารถทำงานแปลก ๆ แต่ที่นี่ดูเหมือนจะเป็นการละเมิดสัญญาของคอลัมน์ที่คำนวณแล้วและดังนั้นจึงควรผิดกฎหมาย
การใส่ตัวเลขสุ่มอาจจะมีสถานการณ์ที่วางแผนไว้ แต่สิ่งที่ถ้าเราใส่NEWID()
ค่าหรือSYSUTCDATETIME()
? ฉันคิดว่านี่เป็นปัญหาที่เกี่ยวข้องซึ่งอาจแสดงให้เห็นจริง