आप डिफ़ॉल्ट का उपयोग उस तरीके से नहीं कर रहे हैं जिस तरह से इसका इरादा है। यह कुछ ऐसा है जो SQL सर्वर डालने के समय आंतरिक रूप से मूल्यांकन करता है (या संभावित रूप से अपडेट करें यदि default
कीवर्ड का उपयोग किया जाता है)।
यह SELECT
. में उपयोग के लिए अभिप्रेत नहीं है . विचार करें कि इसमें मनमाने भाव हो सकते हैं जैसे DEFAULT CAST(GETDATE() AS INT) % 2
या स्केलर यूडीएफ को कॉल करना। स्ट्रिंग से बिट में कास्ट करने से आपके लिए उन भावों का मूल्यांकन नहीं होगा।
ऐसा कुछ करने का एकमात्र तरीका यह होगा कि आप इसका अलग से मूल्यांकन करें
DECLARE @B BIT
, @Definition NVARCHAR(max)
SELECT @Definition = N'SELECT @B = '
+ object_definition(default_object_id)
FROM sys.columns
WHERE NAME = 'value'
AND object_id = OBJECT_ID('dbo.t2')
EXEC sys.sp_executesql
@Definition,
N'@B BIT OUTPUT',
@B = @B OUTPUT
SELECT t1.*,
ISNULL(t2.value, @B)
FROM t1
LEFT JOIN t2
ON t1.id = t2.id