2012-10-12 168 views
12

I tiene una tabla con una sola columna, que es una identidad generada automáticamente-Insertar varias filas de valores por defecto en una tabla

create table SingleIdTable (
    id int identity(1,1) not null 
) 

I pueden insertar de una sola fila con un id generada automáticamente con:

insert into SingleIdTable default values 

quiero insertar el número de filas y el uso de la sintaxis de salida para obtener sus documentos de identidad, algo así como:

insert into SingleIdTable 
output inserted.Id into @TableOfIds 
    select (default values) from SomeOtherTable where Attribute is null 

Wher e la intención es insertar una fila en SingleIdTable para cada fila en SomeOtherTable donde Attribute es nulo usando una identificación generada automáticamente. Lo anterior no funciona, pero ¿cómo podría hacerlo? Observo que si mi mesa tuviera más de una sola columna podría hacerlo, pero no puedo seleccionar filas vacías, que es lo que realmente quiero hacer.

No puedo cambiar la definición de SomeOtherTable.

Respuesta

21

Si SQL Server 2008+ puede usar MERGE para esto. Ejemplo de sintaxis a continuación.

MERGE INTO SingleIdTable 
USING (SELECT * 
     FROM SomeOtherTable 
     WHERE Attribute IS NULL) T 
ON 1 = 0 
WHEN NOT MATCHED THEN 
    INSERT 
    DEFAULT VALUES 
OUTPUT INSERTED.id; 

No estoy seguro de qué uso práctico tiene esta tabla de una sola columna?

+1

+1 Nunca pensé en MERGE – RichardTheKiwi

+0

Astucia ... La tabla es un artefacto de alguien que aplica mal NHibernate al mapear un grupo. Aceptaré esto, pero ahora me doy cuenta de que podría hacerlo correlacionando la consulta interna con el inserto para poder 'output insert.id, SomeOtherTable.id)'. es posible? Realmente necesito unir mi bolsa de identificadores generados cada uno con un elemento de 'SomeOtherTable' donde 'Attribute' es nulo. ¿Alguna idea? – silasdavis

+0

@silasdavis - Sí, solo use 'OUTPUT INSERTED.id, T.id' –

-1

¿No puede usar SCOPE_IDENTITY() para obtener el ID de la fila insertada? Tu pregunta es un poco vaga, ¿puedes aclarar?

Cuestiones relacionadas