एसक्यूएल सर्वर 2012 और बाद में
बस बजाय Try_Convert
का उपयोग करें:
TRY_CONVERT यह को भेजे गए मान लेता है और यह निर्दिष्ट DATA_TYPE में बदलने की कोशिश करता है।यदि कलाकार सफल होता है, तो TRY_CONVERT मान को निर्दिष्ट डेटा_ प्रकार के रूप में देता है; अगर कोई त्रुटि होती है, तो शून्य वापस आ जाता है। हालांकि अगर आप ऐसे रूपांतरण का अनुरोध करते हैं जिसे स्पष्ट रूप से अनुमति नहीं है, तो TRY_CONVERT किसी त्रुटि के साथ विफल हो जाता है।
Read more about Try_Convert।
एसक्यूएल सर्वर 2008 और इससे पहले
इस से निपटने के पारंपरिक तरीके से एक मामले बयान के साथ हर अभिव्यक्ति की रखवाली ताकि वह चाहे जब भी मूल्यांकन किया जाता है, यह एक त्रुटि नहीं बनाएगा कर रहा है, यहां तक कि यह अगर तार्किक ऐसा लगता है कि केस स्टेटमेंट की आवश्यकता नहीं है। कुछ इस तरह:
SELECT
Account_Code =
Convert(
bigint, -- only gives up to 18 digits, so use decimal(20, 0) if you must
CASE
WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
ELSE X.Account_Code
END
),
A.Descr
FROM dbo.Account A
WHERE
Convert(
bigint,
CASE
WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
ELSE X.Account_Code
END
) BETWEEN 503100 AND 503205
हालांकि, मैं इस तरह के SQL सर्वर 2005 के साथ इस रूप में और ऊपर रणनीतियों का उपयोग पसंद:
SELECT
Account_Code = Convert(bigint, X.Account_Code),
A.Descr
FROM
dbo.Account A
OUTER APPLY (
SELECT A.Account_Code WHERE A.Account_Code NOT LIKE '%[^0-9]%'
) X
WHERE
Convert(bigint, X.Account_Code) BETWEEN 503100 AND 503205
क्या इस रणनीतिक X
तालिका के अंदर NULL
करने के लिए Account_Code
मूल्यों स्विच है करता है जब वे संख्यात्मक नहीं हैं। मैंने शुरुआत में CROSS APPLY
का उपयोग किया था, लेकिन Mikael Eriksson के रूप में उपयुक्त रूप से इंगित किया गया, इसके परिणामस्वरूप एक ही त्रुटि हुई क्योंकि क्वेरी पार्सर अभिव्यक्ति आदेश को बल देने के मेरे प्रयास को दूर करने की सटीक समस्या में भाग गया (भविष्यवाणी पुशडाउन इसे हराया)। OUTER APPLY
पर स्विच करके यह ऑपरेशन के वास्तविक अर्थ को बदल दिया ताकि X.Account_Code
में बाहरी क्वेरी के भीतर NULL
मान हो, इस प्रकार उचित मूल्यांकन आदेश की आवश्यकता हो।
आप इस मूल्यांकन आदेश मुद्दे के बारे में Erland Sommarskog's Microsoft Connect request पढ़ने में रुचि रखते हैं। वह वास्तव में इसे एक बग कहते हैं।
यहां अतिरिक्त समस्याएं हैं लेकिन मैं अब उन्हें संबोधित नहीं कर सकता।
पीएस मैं आज एक brainstorm था। मैंने सुझाए गए "पारंपरिक तरीके" के लिए एक वैकल्पिक एक बाहरी संदर्भ के साथ SELECT
अभिव्यक्ति है, जो SQL Server 2000 में भी काम करता है। (मैंने देखा है कि CROSS/OUTER APPLY
सीखने के बाद से मैंने पुराने SQL सर्वर संस्करणों के साथ अपनी क्वेरी क्षमता में सुधार किया है, भी - जैसा कि मैंने SELECT
, ON
, और WHERE
खंड के "बाहरी संदर्भ" क्षमताओं के साथ अधिक बहुमुखी हो रही है)
SELECT
Account_Code =
Convert(
bigint,
(SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
),
A.Descr
FROM dbo.Account A
WHERE
Convert(
bigint,
(SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
) BETWEEN 503100 AND 503205
यह CASE
बयान की तुलना में बहुत कम है।
एसक्यूएल सर्वर के किन संस्करणों मदद करने की कोशिश? – ErikE