2010-10-25 5 views
8

मैं एक नई डाली गई पंक्ति की आईडी वापस करने के लिए संग्रहीत प्रक्रिया में OUTPUT कथन का उपयोग करने का प्रयास कर रहा हूं। संग्रहीत प्रक्रिया है:इस OUTPUT कथन (SQL सर्वर 2005) के सिंटैक्स के साथ क्या गलत है?

CREATE PROCEDURE PROC_RESTORE_REQUEST_TO_QUEUE 
    @cs_uri_stem varchar(900), 
    @cs_uri_query varchar(2500), 
    @date datetime, 
    @time datetime, 
    @queue_state smallint, 
    @process_id int, 
    @simulation_start_time bigint, 
    @num_failures smallint 

AS 

SET NOCOUNT ON 

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

OUTPUT INSERTED.id 

जब मैं इस संग्रहीत प्रक्रिया संकलित करने के लिए प्रयास करते हैं, मुझे एक त्रुटि संदेश मिलता है:

गलत वाक्य रचना के पास 'आउटपुट'।


मैं कोई लाभ नहीं हुआ (एक ही त्रुटि संदेश) के लिए इस कोड के कई क्रमपरिवर्तन की कोशिश की है, सम्मिलित करें बयान के रूप में एक ही लाइन पर आउटपुट बयान चलती भी शामिल है। क्या आप जानते हैं कि मेरे वाक्यविन्यास के साथ समस्या क्या है? आपकी मदद के लिए अग्रिम धन्यवाद,

-Eric

+0

मुझे लगता है कि यदि आप केवल एक ही मूल्य लौट रहे हैं, तो आउटपुट पैरामीटर (मेरा उत्तर देखें) का उपयोग टी-एसक्यूएल या सी # जैसी भाषा का उपभोग करने के लिए थोड़ा आसान है। –

उत्तर

13

इसका आदेश से। The OUTPUT clauseINSERT और VALUES लाइनों के बीच जाना चाहिए।

बस, तुम्हारा ले जाने के इस तरह:

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
OUTPUT INSERTED.id 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 
+0

धन्यवाद, यह काम करता है! –

1

MSDN

DECLARE @MyTableVar table(NewScrapReasonID smallint, 
          Name varchar(50), 
          ModifiedDate datetime); 

INSERT Production.ScrapReason 
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate 
     INTO @MyTableVar 
VALUES (N'Operator error', GETDATE()); 
2

मुझे लगता है कि यह होना चाहिए की तरह:

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 

OUTPUT INSERTED.id 

VALUES 
(@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

तुम भी जोड़ सकते हैं एक "@MyVariable जांच" या "MyTable में" ouput के बाद बयान

+0

यदि आप बाद में आउटपुट वैरिएबल का उपयोग करना चाहते हैं तो इसे टेबल वैरिएबल में आउटपुट करना सर्वोत्तम होता है (यदि आप कई पंक्तियों को सम्मिलित/अपडेट/हटाए जाने की उम्मीद करेंगे) या यदि आप सिंटैक्स का उपयोग कर रहे हैं तो एक व्यवहार्य है जो केवल एक रिकॉर्ड की गारंटी देगा । – HLGEM

+0

हाँ, मेरा मतलब एक तालिका परिवर्तनीय था ... – Antonio

0

होना चाहिए कुछ की तरह:

CREATE PROCEDURE PROC_RESTORE_REQUEST_TO_QUEUE 
    @cs_uri_stem varchar(900), 
    @cs_uri_query varchar(2500), 
    @date datetime, 
    @time datetime, 
    @queue_state smallint, 
    @process_id int, 
    @simulation_start_time bigint, 
    @num_failures smallint, 
    @new_id int OUTPUT 

AS 

SET NOCOUNT ON 

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

SET @new_id = SCOPE_IDENTITY() 
संबंधित मुद्दे