2012-02-26 18 views
7

Muy bien, entonces una pregunta SQL rápida aquí (usando sql-server-2008).Seleccionar SQL o Insertar ID de devolución

Tengo una tabla de asignación names con las siguientes columnas

IDDisplayName

Lo que quiero hacer es primero SELECT [ID] FROM [names] WHERE [DisplayName] = 'chuck';

PERO, si el nombre de 'Chuck' no existe en la base de datos, me gustaría crearlo, y devolver el auto incrementado ID.

Me preguntaba si SQL tenía alguna forma de hacerlo de una manera sencilla, o si tengo que hacer una ruta larga.

ruta larga de ser algo como esto

SELECT COUNT(ID) AS count, ID FROM names WHERE DisplayName='chuck' 
IF(count > 0) 
    SELECT ID as ReturnID; 
ELSE 
    BEGIN 
    INSERT INTO names(DisplayName) values('chuck'); 
    SELECT scope_identity() as ReturnID; 
    END 

no he probado esta última afirmación, pero supongo que el camino más largo sería algo por el estilo. Si no hay un camino construido, agradecería que alguien simplemente corrija esa afirmación (ya que estoy seguro de que no es completamente correcta).

+3

Si solo admite 200 * +, use la sintaxis [MERGE] (http://technet.microsoft.com/en-us/library/bb510625.aspx) –

+0

¿Podría dar un ejemplo? Estoy tratando de aprender formas más avanzadas de usar sql. –

+0

@ kelton52: hay ejemplos al final del artículo OMG Ponies linked. Tienes que desplazarte un poco hacia abajo. –

Respuesta

4

Usted debe tener cuidado acerca de las transacciones, así:

set XACT_ABORT on 
begin tran 

declare @ID int 

select @ID = ID from names with (holdlock, updlock) WHERE DisplayName='chuck' 

if @@rowcount = 0 
begin 
    INSERT INTO names(DisplayName) values('chuck'); 
    set @ID = scope_identity(); 
end 

select @ID as ReturnID; 

commit tran 

Nota el uso de sugerencias de tabla - holdlock y updlock. Evitan que otro hilo ejecute exactamente la misma consulta y la creación de la fila por segunda vez. Para obtener más información, busque aislamiento, sincronización, interbloqueos, actualizaciones concurrentes.

+0

Muy bien, así que funcionó esto y ahora las tablas estancadas ... ¿alguna idea? –

+0

también tiene de allí dos veces, suponiendo que no fue intencional –

+0

también sql no reconoce el xac_abort –

0

que haría:

IF (NOT EXISTS(SELECT null from names where DisplayName='Chuck')) 
    INSERT INTO Names (DisplayName) Values ('Chuck') 

SELECT ID as ReturnID FROM Names where DisplayName='Chuck' 

no guarda mucho sin embargo

+0

¿No es esto, en el mejor de los casos, ejecutar 2 consultas, y lo peor, ejecutar 1 consulta? – crush

Cuestiones relacionadas