2011-11-26 16 views
5

मेरे पास SQL ​​की एक श्रृंखला है जिसे SQL में लिखा जाना आवश्यक है, तालिका में डाले गए डेटा को रोकने के लिए SQL में डेटा को जांचने के लिए मुझे क्या करना चाहिए?मैं SQL सर्वर तालिका में डुप्लिकेट डेटा डालने से कैसे रोक सकता हूं?

उदाहरण डेटा सम्मिलित करने के लिए:

David 
James 
John 

4 डेटा John फिर से है, तो मैं प्रणाली डुप्लिकेट रिकॉर्ड (जॉन) को छोड़ना चाहते।

अब तक मेरे पास है:

SqlConnection myCnn = new SqlConnection(cnn); 
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)"; 
SqlCommand _Query = new SqlCommand(_state, myCnn); 

_Query.Parameters.AddWithValue("@msg", msg); 
_Query.Parameters.AddWithValue("@camID", camID); 
_Query.Parameters.AddWithValue("@path", imageFile); 
_Query.Parameters.AddWithValue("@filename", name); 

try 
{ 
    myCnn.Open(); 
    string checkname = (string)_Query.ExecuteScalar(); 
    myCnn.Close(); 

    getcheckname = checkname; 
    Console.WriteLine("OK"); 
} 
catch (Exception) 
{ 
} 

मैं स्ट्रिंग मान checkname है कि पिछले डाला, मैं क्या डेटा जाँच करते हैं चाहिए मिल गया?

उत्तर

5

सबसे पहले, क्या तुमने कभी एक अद्वितीय सूचकांक या बाधा का उपयोग करके तालिका में ऐसा होने से एक नकली रोका जा सकता है: मैं एक स्थानीय डेटाबेस मेरे पास है पर इस परीक्षण किया गया। नीचे दिए गए सुझावों के साथ एक अनुक्रमणिका/बाधा संगीत कार्यक्रम में काम कर सकती है। यदि आप केवल एक अद्वितीय अनुक्रमणिका का उपयोग करते हैं और नीचे दिए गए समाधानों में से कोई एक नहीं, डुप्लिकेट रिकॉर्ड डालने से एक त्रुटि फेंक जाएगी और आपको इसे दूसरे छोर पर संभालना होगा।

इसके अतिरिक्त, मैं शायद संग्रहीत प्रक्रिया के माध्यम से डेटा डालता हूं जो यह देखने के लिए जांचता है कि पंक्ति पहले से मौजूद है या नहीं। ऐसा करने के लिए, आप उपयोग कर सकते हैं या तो एक मर्ज बयान, इस छद्म कोड में दिखाया गया है:

create procedure MyProcedure 
(
    @Name nvarchar(100), 
    ... 
) 
as 

merge MyTable 
using 
(
    select @Name,... 
) as source (Name, ...) 
on MyTable.Name = source.Name 
when not matched then 
    insert (Name,...) values (source.Name,...) 
when matched then 
    update set Name = @Name,... 

या, आप रिकॉर्ड होने की जाँच और डालने या मैन्युअल रूप से अपडेट कर सकते हैं:

create procedure MyProcedure 
(
    @Name nvarchar(100), 
    ... 
) 
as 

    if not exists (select * from MyTable where Name = @Name) 
    begin 
     insert into MyTable (Name,...) values (@Name,...) 
    end 
    else 
    begin 
      update MyTable 
      set ... 
      where Name = @Name 
    end 
+0

मैं मानता हूं कि आपको डुप्लिकेट डेटा से निपटने के लिए अकेले बाधा/सूचकांक का उपयोग नहीं करना चाहिए, लेकिन यह जानना अच्छा है कि आपको डेटा को स्वच्छ करने की आवश्यकता नहीं होगी क्योंकि आपके पास उस बाधा है। मुझे लगता है कि आप 'MERGE' फ़ंक्शन को देखने में रूचि रख सकते हैं जो SQL Server 2008 ने जोड़ा है, यह आपके विकल्प के लिए सिंटैक्स को जोड़ता है' अगर मौजूदा अद्यतन प्रविष्टि मौजूद है 'और मेरा मानना ​​है कि उन्होंने इसे और अधिक कुशल बना दिया है। http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

हाँ, निश्चित रूप से MERGE कथन का उपयोग करें और उपयोग करें। एक उदाहरण शामिल करने के लिए मेरे जवाब को संशोधित कर सकते हैं। – Bert

+0

इस तरह के विवरण देने के लिए धन्यवाद, मैं अब कोशिश कर रहा हूं :) – KayX

2

यदि आप को डुप्लिकेट डेटा डालने से रोकना चाहते हैं, तो आप उन क्षेत्रों पर unique index or unique constraint का उपयोग कर सकते हैं।

यदि आप केवल एक कठिन सम्मिलन कथन चलाने के लिए चाहते हैं, लेकिन यदि कोई मान मौजूद है तो यह कुछ भी नहीं है, ऐसा कुछ काम करना चाहिए।

declare @subject as varchar(100); 
set @subject = 'hello' 

insert into Subjects ([name]) 
select @subject 
where not exists (select 1 from Subjects where [name] = @Subject) 
6

आप डुप्लिकेट डेटा नहीं करना चाहते हैं, तो आप एक UNIQUE CONSTRAINT या एक UNIQUE INDEX

एसक्यूएल सर्वर 2008 भी एक MERGE बयान आप के लिए इस्तेमाल कर सकते हैं के साथ डीबी स्तर पर लागू करने पर विचार करना चाहिए कि मिलान किए गए रिकॉर्ड की जांच करें। यदि आप मौजूदा रिकॉर्ड को अपडेट करना चाहते हैं तो यह सहायक हो सकता है।

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