2011-02-08 11 views
12

मैं अपने डेटाबेस के विकास में सहायता के लिए एक संग्रहीत प्रक्रिया लिखने की कोशिश कर रहा हूं, लेकिन मुझे इसका उपयोग करने में कुछ परेशानी हो रही है। उदाहरण के लिए:एक संग्रहीत प्रक्रिया पैरामीटर सूची में एक अभिव्यक्ति (उदा। फंक्शन कॉल) के परिणाम का उपयोग कर?

DECLARE @pID int; 
SET @pID = 1; 
EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar); 

यह

संदेश 102, स्तर 15, राज्य 1 (SQL सर्वर 2005 पर) त्रुटि पैदावार, रेखा 4 गलत वाक्य रचना के पास '+'।

क्या कोई मुझे बता सकता है कि मेरा वाक्यविन्यास गलत क्यों है, और इस समस्या को हल करने का सही तरीका क्यों है?

उत्तर

18

आपको एक मध्यवर्ती चर का उपयोग करने की आवश्यकता है। SQL सर्वर पैरामीटर सूची में इस प्रकार के ऑपरेशन का समर्थन नहीं करता है, हालांकि यह कुछ वर्षों तक TODO सूची पर रहा है! (Connect Item: Use scalar functions as stored procedure parameters देखें)

grammar for EXEC

[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH <execute_option> [ ,...n ] ] 
    } 
[;] 

प्रलेखन वर्तमान कि value के लिए एक स्वीकार्य प्रारूप पर स्पष्ट नहीं है लेकिन यह केवल "सरल" इस तरह के शाब्दिक मान या @@ पहले से जुड़ा हुआ प्रणाली कार्यों के रूप में भाव हो रहा है (जैसे @@IDENTITY)। SCOPE_IDENTITY() जैसे अन्य सिस्टम फ़ंक्शंस की अनुमति नहीं है (यहां तक ​​कि जिनके लिए CURRENT_TIMESTAMP जैसे कोष्ठक की आवश्यकता नहीं है)।

तो कुछ समय के लिए आप इस तरह के रूप में नीचे

DECLARE @pID INT; 

SET @pID = 1; 

/*If 2008+ for previous versions this needs to be two separate statements*/ 
DECLARE @string VARCHAR(50) = 'Could not find given id: ' + CAST(@pID AS VARCHAR(11)) 

EXEC WriteLog 
    'Component', 
    'Source', 
    @string 
+3

मैं मध्यवर्ती चर से बचने की उम्मीद कर रहा था। क्या उन्हें पेश किए बिना ऐसा करने का कोई सही तरीका है? – WorkerThread

+0

आह, बस अपनी व्याख्या देखी। इसे स्पष्ट करने के लिए धन्यवाद। – WorkerThread

+0

@Worker - यह सब कुछ परेशान है। एमएस यहां बहुत कुछ स्वीकार करता है https://connect.microsoft.com/SQLServer/feedback/details/352110/t-sql-use-scalar-functions-as-stored-procedure-parameters –

2
DECLARE @pID int; 
declare @IdAsString varchar(100) 

SET @pID = 1; 

Select @IdAsString ='Could not find given id: ' + Cast(@pId as varchar(10)) 

EXEC WriteLog 'Component', 'Source', @IdAsString 

के रूप में मार्टिन द्वारा बताया सिंटैक्स का उपयोग करने की आवश्यकता है, तो निम्न केवल नहीं कॉलम चर पर लागू होता है।

ध्यान दें कि मैं varchar(10) करने के लिए अपने कलाकारों में संशोधन किया है इस पूर्णांकों 1 अंकों की तुलना में बड़ा के लिए अनुमति देगा। varchar केवल 1 चरित्र

+1

@ बैरी - यह कॉलम के लिए सच है लेकिन 'वर्कर' चर के लिए डिफ़ॉल्ट 10 है। 'कास्ट चुनें (' 1234567890 'वर्चर के रूप में) '। यदि आप नकारात्मक के लिए अनुमति देने जा रहे हैं तो आपको 'int' की पूरी श्रृंखला के लिए' 11' की आवश्यकता है। –

+0

@ मार्टिन - ठीक है, मुझे यह नहीं पता था। इंगित करने के लिए धन्यवाद। क्या आप जानते हैं कि व्यवहार अलग क्यों है? – codingbadger

+0

@ बैरी - नहीं - यह काफी परेशान असंगतता प्रतीत होता है। मुझे लगता है कि शायद कुछ ऐतिहासिक कारण है ... –

1

आप एक संग्रहीत प्रक्रिया के मापदंडों पर कार्रवाई नहीं कर सकते की अनुमति देगा। आपको उस मान को किसी अन्य चर पर असाइन करना चाहिए और फिर इसे अपने एसपी पर भेजना चाहिए।

DECLARE @pID int, @nameId VARCHAR(100); 
SET @pID = 1; 
SET @nameId = 'Could not find given id: ' + CAST(@pID AS varchar); 

EXEC WriteLog 'Component', 'Source', @nameId 
0

शायद ऐसा कुछ?

DECLARE @pID int; 
SET @pID = 1; 

DECLARE @Message NVARCHAR(50); 

SET @Message = 'Could not find given id: ' + CAST(@pID AS varchar) 
EXEC WriteLog 'Component', 'Source', @Message; 
0

इस बजाय का प्रयास करें ...

DECLARE @pID int; 
SET @pID = 1; 

DECLARE @message varchar(255); 
SET @message = 'Could not find given id: ' + CAST(@pID AS varchar) 

EXEC WriteLog 'Component', 'Source', @message; 
0

घोषित @id int

सेट @id = 10

चयन LTRIM (RTRIM (एसटीआर (@id))) के रूप में stringValue

संबंधित मुद्दे

 संबंधित मुद्दे