2011-01-04 9 views
6

Al escribir una instrucción INSERT con muchas columnas, sería bueno tener el valor al lado del nombre de columna como en una instrucción UPDATE. Algo como:¿Escribir declaraciones INSERT con valores al lado de los nombres de las columnas?

insert into myTable 
set 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

¿Hay algún truco para imitar esto?

pensé que estaba en algo con esto:

insert into myTable 
select 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

Pero los alias no son en realidad están asociados con las columnas de la tabla de inserción y si alguien ha añadido una nueva columna a la tabla que realmente podrían enredar las cosas . ¿Alguien tiene alguna otra idea de cómo se puede hacer esto?

+0

Esta es una de las verdaderas molestias de SQL.Y causa errores, ya que es fácil hacer que la orden se modifique por accidente y si los tipos de datos son compatibles, de repente está colocando el número de teléfono en la columna de correo electrónico sin errores. – HLGEM

+0

Yo también realmente desearía que SQL proporcionara una manera de hacer esto. Mejoraría la legibilidad dramáticamente. –

Respuesta

9

El que más se aproxima sería para especificar las columnas en el inserto (esto le protegerá de su preocupación por que se añade una nueva columna) y alias de los valores de la selección (que le da un cierto grado del código de auto-documentación).

insert into myTable 
    ([col1], [col2], [col3]) 
    select 'xxx' as [col1], 'yyy' as [col2], 42 as [col3] 
+0

No se requieren alias, suponiendo que la orden de selección coincida con el orden en columnas. Aunque podrían ayudar a mantener las cosas claramente indicadas. :) –

+0

@Rocky Madden: De acuerdo. Como indiqué en mi respuesta, incluí los alias más como un intento de auto-documentar el código. –

+0

Solo quería asegurarme de que estaba claro para el OP. Como de costumbre, ¡tenías razón con el dinero! –

-3

INSERT INTO myTable (col1, col2, col3) 
SELECT 'xxx' [col1], 'yyy' [col2], '42' [col3]
+0

Esto es lo mismo que el ejemplo que di. No quiero esto porque si alguien agrega una columna a myTable potencialmente podría insertar datos en la columna incorrecta. – adam0101

+0

No debe, bajo ninguna circunstancia, hacer una inserción sin especificar las columnas en la inserción. Este es el mal mal codigo malo – HLGEM

+0

Acepto, leí mal la pregunta. Editado – brian

1

Para inserciones grandes, he hecho diseños extravagantes (y tal vez demasiado exigentes). Algunos ejemplos:

INSERT MyTable (MyTableId,  Name,    Description,  SomeStringData1 
       ,SomeStringData2, SomeStringData3, SomeStringData4, MoreStringData1 
       ,MoreStringData2, MoreStringData3, MoreStringData4, SomeNumericData1 
       ,SomeNumericData2, SomeNumericData3, SomeNumericData4, MoreNumericData1 
       ,MoreNumericData2, MoreNumericData3, MoreNumericData4, BigBlobAA 
       ,BigBlobBB,  EnteredAtDate, UpdatedAtDate, RevisedAtDate 
       ,NeedAnotherDate) 
values 
       (@MyTableId,  @Name,    @Description,  @SomeStringData1 
       ,@SomeStringData2, @SomeStringData3, @SomeStringData4, @MoreStringData1 
       ,@MoreStringData2, @MoreStringData3, @MoreStringData4, @SomeNumericData1 
       ,@SomeNumericData2, @SomeNumericData3, @SomeNumericData4, @MoreNumericData1 
       ,@MoreNumericData2, @MoreNumericData3, @MoreNumericData4, @BigBlobAA 
       ,@BigBlobBB,  @EnteredAtDate, @UpdatedAtDate, @RevisedAtDate 
       ,@NeedAnotherDate) 

Esto funciona si usted es bastante maldito seguro de que usted no será nunca la inserción de columnas o de otra manera modificar lo que se inserta. Obtiene todo en una pantalla, y hace que sea bastante simple elegir qué valor va en cada columna.

Si los valores introducidos son propensos a cambiar o son complejos (tales como declaraciones de casos), hago lo siguiente (outdent todo pero cada quinto punto):

INSERT MyTable 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,SomeNumericData1 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 
values 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,case 
     when something then 'A' 
     when orOther then 'B' 
     else 'Z' 
    end 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 

(Después de añadir que la declaración CASE, I " contó con sangrías "para asegurarse de que tenía todo alineado correctamente.)

Se necesita un poco de esfuerzo para distribuir las cosas correctamente, pero puede simplificar el mantenimiento, el soporte y la posterior modificación.

+0

Estoy con usted, personalmente, si tengo muchas columnas, alineo las columnas tres o cuatro en una línea y hago que la línea de la cláusula selts o values ​​coincida exactamente. Todavía tengo que chack manualmente, pero al menos es más fácil cuando las columnas están alineadas correctamente como en tu primer ejemplo. – HLGEM

0

vez que desee insertar varias filas al mismo tiempo, ya sea utilizando 2008 constructores de registros estilo, o el uso de la sintaxis anterior union all, que tienden a ser agradecidos que hacer no tienen que especificar los nombres de columna para cada fila.

2008 fila constructores:

insert into myTable (col1,col2,col3) 
values ('xxx','yyy',42), 
('abc','def',19), 
('HJK','www',-4) 

UNION ALL:

insert into myTable (col1,col2,col3) 
select 'xxx','yyy',42 union all 
select 'abc','def',19 union all 
select 'HJK','www',-4 
+0

Sí, puedo ver que no quiero nombres de columna si está insertando varias filas, pero me refiero a insertar una única fila con muchas columnas. – adam0101

1

Básicamente, no. La sintaxis para SQL INSERT es para listar todas las columnas, luego todos los valores. Incluso si pudieras encontrar un truco para expresar la sintaxis de la forma que quisieras, no sería portátil y sería confuso para la siguiente persona tener que mantener tu código.

Si desea un mapeo visual de las columnas a los valores, use algo similar a la respuesta de Felipe, arriba. Pero no gaste nada de su valioso tiempo para que su código evite la sintaxis estándar.

+0

Buen punto, a veces busco maneras de hacer las cosas más agradables para mí, pero nunca debería hacerlo con el efecto secundario de hacer que mi código sea ilegible o confuso. – adam0101

+0

Aprecio de dónde vienes, y a menudo hago diseños como Philip sugirió (excepto que trato de permanecer en una línea por lo que el valor está directamente debajo del nombre de la columna, incluso si la línea es muy, muy larga). –

Cuestiones relacionadas