sp_executesql
जैसी संग्रहीत कार्यविधियों को निष्पादित करते समय त्रुटि संदेश 214, स्तर 16 का सामना करना काफी आसान है या sp_describe_first_result_set
।
सौभाग्य से इसे ठीक करना भी आसान है!
यह त्रुटि प्राप्त करने का सबसे आम कारण यह है कि आप अपनी स्ट्रिंग को N
. के साथ उपसर्ग करना भूल गए हैं ।
इसलिए, इस समस्या को ठीक करने के लिए, अपनी स्ट्रिंग को N
. के साथ उपसर्ग करने का प्रयास करें ।
कोड का उदाहरण जो त्रुटि का कारण बनता है
निम्न कोड इस त्रुटि का कारण बनता है।
EXEC sp_executesql 'SELECT * FROM Cats';
परिणाम:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
इस त्रुटि का कारण यह है कि sp_executesql
. का पहला तर्क प्रक्रिया या तो यूनिकोड स्थिरांक या यूनिकोड चर होना चाहिए।
इसलिए, जब आप एक स्ट्रिंग के रूप में तर्क प्रदान कर रहे हैं, तो आपको इसे N
. के साथ उपसर्ग करना होगा ।
समाधान
यहाँ उपरोक्त समस्या का समाधान है।
EXEC sp_executesql N'SELECT * FROM Cats';
परिणाम:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
ध्यान दें कि इसका तालिका के कॉलम से कोई लेना-देना नहीं है। उदाहरण के लिए, मेरे Cats
. में तालिका, CatId
कॉलम int . है और CatsName
कॉलम varchar(60) . है ।
चर
यदि आप एक स्ट्रिंग के बजाय एक चर पारित कर रहे हैं, तो आप चर प्रकार बदल सकते हैं। ऐसा करने से आप N
. के साथ तर्क को उपसर्ग करने से बचेंगे ।
यहां एक वैरिएबल का उदाहरण दिया गया है जो गड़बड़ी पैदा करता है।
DECLARE @tsql_query varchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
परिणाम:
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
एक बार फिर हमें 214 त्रुटि मिलती है, क्योंकि तर्क यूनिकोड स्थिरांक या यूनिकोड चर नहीं है।
हम वैरिएबल को यूनिकोड वैरिएबल घोषित करके इसे ठीक कर सकते हैं।
DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT * FROM Cats';
EXEC sp_executesql @tsql_query;
परिणाम:
+---------+-------------+ | CatId | CatName | |---------+-------------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | | 4 | Bulldog | | 5 | King George | | 6 | Sharp | | 7 | Fritz | | 8 | Garfield | | 9 | Boss | +---------+-------------+
एक और उदाहरण
उपरोक्त उदाहरण sp_executesql
. का उपयोग करते हैं प्रक्रिया, लेकिन आप यह त्रुटि किसी भी समय प्राप्त कर सकते हैं जब कोई प्रक्रिया यूनिकोड की अपेक्षा कर रही है लेकिन इसे प्राप्त नहीं करती है।
एक अन्य सिस्टम प्रक्रिया जो यूनिकोड तर्क को स्वीकार करती है वह है sp_describe_first_result_set
. इसलिए, हम उस प्रक्रिया का उपयोग करके उसी त्रुटि को बाध्य कर सकते हैं।
EXEC sp_describe_first_result_set
@tsql = 'SELECT * FROM Cats',
@params = null,
@browse_information_mode = 1;
परिणाम:
Msg 214, Level 16, State 21, Procedure sp_describe_first_result_set, Line 1 Procedure expects parameter '@tsql' of type 'nvarchar(max)'.
हालांकि सटीक शब्दांकन थोड़ा अलग है, यह वही त्रुटि है (संदेश 214, स्तर 16), और एक ही सुधार है।