2012-02-16 8 views
21

का उपयोग कर आदेश एसक्यूएल सर्वर सम्मिलित से मूल्य, मैं इस तरह एक तालिका में एक पंक्ति सम्मिलित कर रहा हूँ:वापसी दृश्य स्टूडियो में सी # का उपयोग करना C#

INSERT INTO foo (column_name) 
VALUES ('bar') 

मैं इस तरह कुछ करना चाहता हूँ, लेकिन मुझे नहीं पता सही सिंटैक्स पता:

INSERT INTO foo (column_name) 
VALUES ('bar') 
RETURNING foo_id 

इस नव डाला पंक्ति से foo_id स्तंभ लौट आते हैं।

इसके अलावा, अगर मुझे इसके लिए सही वाक्यविन्यास मिल जाए, तो मुझे एक और समस्या है: मेरे पास SqlDataReader और SqlDataAdapter है। जहां तक ​​मुझे पता है, पूर्व डेटा पढ़ने के लिए है, दूसरा डेटा में हेरफेर करने के लिए है। रिटर्न स्टेटमेंट के साथ एक पंक्ति डालने पर, मैं डेटा को जोड़ और पढ़ रहा हूं, इसलिए मुझे यकीन नहीं है कि क्या उपयोग करना है। हो सकता है कि इसके लिए कुछ अलग है, मुझे इसका उपयोग करना चाहिए?

उत्तर

62

SCOPE_IDENTITY रिटर्न एक ही दायरे में एक पहचान स्तंभ में डाला पिछले पहचान मूल्य। एक गुंजाइश एक मॉड्यूल है: एक संग्रहीत प्रक्रिया, ट्रिगर, फ़ंक्शन, या बैच। इसलिए, दो कथन एक ही दायरे में हैं यदि वे एक ही संग्रहीत प्रक्रिया, फ़ंक्शन या बैच में हैं।

आप SqlCommand.ExecuteScalar का उपयोग डालने आदेश निष्पादित और एक क्वेरी में नया आईडी पुनः प्राप्त कर सकते हैं।

using (var con = new SqlConnection(ConnectionString)) { 
    int newID; 
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)"; 
    using (var insertCommand = new SqlCommand(cmd, con)) { 
     insertCommand.Parameters.AddWithValue("@Value", "bar"); 
     con.Open(); 
     newID = (int)insertCommand.ExecuteScalar(); 
    } 
} 
+0

क्या एक महान उदाहरण टिम, मुझे बहुत मदद की। इस नेको जैसे प्रश्न पोस्ट करने के लिए धन्यवाद, ठीक वही जो मैं खोज रहा था! – WhySoSerious

+0

मुझे एसक्यूएल बयान –

13

इस प्रयास करें:

INSERT INTO foo (column_name) 
OUTPUT INSERTED.column_name,column_name,... 
VALUES ('bar') 

आउटपुट एक परिणाम सेट (अन्य बातों के अलावा) लौट सकते हैं, देखें: OUTPUT Clause (Transact-SQL)। साथ ही, यदि आप एकाधिक मान डालते हैं (INSERT SELECT) यह विधि प्रति पंक्ति पंक्ति में एक पंक्ति लौटाएगी, जहां अन्य विधियां केवल अंतिम पंक्ति पर जानकारी लौटाएंगी।

काम कर उदाहरण:

declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5)) 

INSERT INTO @YourTable (YourCol1) 
OUTPUT INSERTED.YourID 
VALUES ('Bar') 

उत्पादन:

YourID 
----------- 
1 

(1 row(s) affected) 
+0

यह काम करता है। मैं अब तक OUTPUT के बारे में कभी नहीं जानता था। धन्यवाद! – lamarant

+0

यह काम नहीं करता है जब टेबल पर ट्रिगर्स होते हैं। उस स्थिति में आपको निम्न त्रुटि मिल जाएगी: 'डीएमएल कथन की लक्ष्य तालिका में कोई भी सक्षम ट्रिगर नहीं हो सकता है यदि कथन में खंड में बिना आउटपुट क्लॉज शामिल है।' सुनिश्चित नहीं है कि 'बिना खंड के' के साथ उनका क्या मतलब है, क्योंकि मेरे INSERT कथन में एक INTO खंड है ... –

+1

@ लुइस सॉमर, केवल एक सादा 'आउटपुट' खंड परिणाम सेट लौटाएगा। यदि आप ''INTO'' जोड़ते हैं तो इसे एक तालिका में डाला जाएगा। एक टेबल वैरिएबल बनाएं: 'DECLARE @Temp तालिका (xyz int, abc varchar (5))' और आपके पास 'OUTPUT' पंक्तियां इस तालिका में जा सकती हैं, फिर' INSERT' के बाद आप ''चुनें' एक परिणाम सेट वापस करने के लिए Temp' तालिका। इस तरह कुछ उपयोग करें: 'INSERT 'INSERTED.col1, INSERTED.col2 INTO @ Temp' के बाद' INSERT' के बाद कुछ: '; चुनें * Temp' से चुनें। –

-1

मुझे लगता है कि आप इसके लिए @@ पहचान का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि इसके आसपास कुछ विशेष नियम/प्रतिबंध हैं?

using (var con = new SqlConnection("connection string")) 
{ 
    con.Open(); 
    string query = "INSERT INTO table (column) VALUES (@value)"; 

    var command = new SqlCommand(query, con); 
    command.Parameters.Add("@value", value); 
    command.ExecuteNonQuery(); 

    command.Parameters.Clear(); 
    command.CommandText = "SELECT @@IDENTITY"; 

    int identity = Convert.ToInt32(command.ExecuteScalar()); 
} 
+4

के अंत के बाद पाया एक त्रुटि पात्रों बनाया [आप वास्तव में उपयोग करना चाहिए 'SCOPE_IDENTITY()' और ** नहीं ** '@@ IDENTITY' - कि आश्चर्यजनक रूप से गलत परिणाम वापस हो सकता है!] (Http: // ब्लॉग। sqlauthority।com/2007/03/25/एसक्यूएल सर्वर-पहचान-बनाम-SCOPE_IDENTITY-बनाम-ident_current पुनर्प्राप्ति-अंतिम डाला-पहचान-ऑफ-द रिकॉर्ड /) –

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