मैं एक संगणित कॉलम में अजीब मूल्यों के बारे में इस सवाल का अनुसरण कर रहा हूं 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()
? मुझे लगता है कि यह एक प्रासंगिक मुद्दा है जो व्यावहारिक रूप से खुद को प्रकट कर सकता है।