2011-11-26 110 views
5

Tengo una serie de datos que deben escribirse en SQL, ¿qué debo hacer para verificar los datos en SQL para evitar que los mismos datos se inserten en la tabla? a insertarse¿Cómo puedo evitar insertar datos duplicados en una tabla de SQL Server?

Datos de ejemplo:

David 
James 
John 

Si el cuarto de datos es John nuevo, quiero el sistema para omitir el registro duplicado (Juan).

hasta ahora tengo:

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) 
{ 
} 

me dieron el valor checkname cadena que se inserta el pasado, ¿qué debería hacer comprobar los datos?

Respuesta

5

En primer lugar, se puede evitar un duplicado ocurra siempre en la tabla mediante el uso de un índice único o restricción. Un índice/restricción puede funcionar en concierto con las siguientes sugerencias. Si solo usa, utilice un índice único y ninguna de las soluciones siguientes, insertando un registro duplicado generará un error y deberá manejarlo en el otro extremo.

Además, probablemente insertaría los datos a través de un procedimiento almacenado que verifica si la fila ya existe. Para ello, puede utilizar ya sea una declaración MERGE, tal como se exhiben en este pseudo-código:

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,... 

o, se puede comprobar la existencia registros e insertar o actualizar manualmente:

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

Acepto que no debe usar la restricción/índice solo para tratar datos duplicados, pero es bueno saber que nunca tendrá que desinfectar los datos ya que tiene esa restricción en su lugar. Creo que le puede interesar ver la función 'MERGE' que SQL Server 2008 agregó, combina la sintaxis para su opción de' If Existe la actualización Else Insert 'y creo que lo han hecho más eficiente. http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

Sí, definitivamente conozca y use la instrucción MERGE. Puede modificar mi respuesta para incluir un ejemplo. – Bert

+0

Gracias por darme esa respuesta detallada, lo intento ahora :) – KayX

2

Si desea evitar que se inserten datos duplicados, puede usar unique index or unique constraint en esos campos.

Si solo desea ejecutar una instrucción de inserción, pero no hacer nada si existe un valor, algo como esto debería funcionar. He probado esto en una base de datos local que tengo:

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

Si no desea datos duplicados, debe considerar aplicarlos en el nivel de base de datos con un UNIQUE CONSTRAINT o un UNIQUE INDEX

SQL Server 2008 también tiene una declaración MERGE que podría usar para verificar si hay registros coincidentes. Esto podría ser útil si desea actualizar un registro existente.

Cuestiones relacionadas