Solución:
-
Hacen cosas diferentes. Usar
INSERT
cuando la mesa existe. UsarSELECT INTO
cuando no es así. -
Si.
INSERT
sin sugerencias de tabla normalmente se registra.SELECT INTO
se registra mínimamente suponiendo que se establezcan los indicadores de seguimiento adecuados. -
En mi experiencia
SELECT INTO
se usa más comúnmente con conjuntos de datos intermedios, como#temp
tablas, o para copiar una tabla completa como una copia de seguridad.INSERT INTO
se utiliza cuando inserta en una tabla existente con una estructura conocida.
EDITAR
Para abordar su edición, hacen cosas diferentes. Si está haciendo una tabla y desea definir la estructura, use CREATE TABLE
y INSERT
. Ejemplo de un problema que se puede crear: tiene una tabla pequeña con un campo varchar. La cadena más grande en su tabla ahora es de 12 bytes. Su conjunto de datos reales necesitará hasta 200 bytes. Si lo haces SELECT INTO
de su pequeña mesa para hacer una nueva, el más tarde INSERT
fallará con un error de truncamiento porque sus campos son demasiado pequeños.
-
¿Qué afirmación es preferible? Depende de lo que estés haciendo.
-
¿Hay otras implicaciones en el rendimiento? Si la tabla es una tabla permanente, puede crear índices en el momento de la creación de la tabla, lo que tiene implicaciones para el rendimiento tanto negativa como positivamente. Seleccionar en no recrea los índices que existen en las tablas actuales y, por lo tanto, el uso posterior de la tabla puede ser más lento de lo necesario.
-
¿Cuál es un buen caso de uso para SELECT … INTO sobre INSERT INTO …? Seleccionar en se utiliza si es posible que no conozca la estructura de la tabla de antemano. Es más rápido escribir que crear una tabla y una declaración de inserción, por lo que a veces se usa para acelerar el desarrollo. A menudo, es más rápido de usar cuando está creando una tabla temporal rápida para probar cosas o una tabla de respaldo de una consulta específica (tal vez registros que va a eliminar). Debería ser raro verlo utilizado en el código de producción que se ejecutará varias veces (excepto para las tablas temporales) porque fallará si la tabla ya existía.
A veces se usa de manera inapropiada por personas que no saben lo que están haciendo. Y como resultado pueden causar estragos en la base de datos. Creo firmemente que es inapropiado usar SELECT INTO para cualquier otra cosa que no sea una tabla desechable (una copia de seguridad temporal, una tabla temporal que desaparecerá al final del proceso almacenado, etc.). Necesidad de mesas permanentes pensamiento real en cuanto a su diseño y SELECT INTO hace que sea fácil evitar pensar en algo tan básico como qué columnas y qué tipos de datos.
En general, prefiero el uso de la tabla de creación y la declaración de inserción: tiene más controles y es mejor para procesos repetibles. Además, si la tabla es una tabla permanente, debe crearse a partir de un script de creación de tabla separado (uno que esté en control de fuente) ya que la creación de objetos permanentes no debe, en general, en el código insertar / eliminar / actualizar o seleccionar de un mesa. Los cambios de objetos deben manejarse por separado de los cambios de datos porque los objetos tienen implicaciones más allá de las necesidades de una inserción / actualización / selección / eliminación específica. Debe considerar los mejores tipos de datos, pensar en las restricciones de FK, PK y otras restricciones, considerar los requisitos de auditoría, pensar en la indexación, etc.
La principal diferencia es que SELECT INTO MyTable creará una nueva tabla llamada MyTable con los resultados, mientras que INSERT INTO requiere que MyTable ya exista.
Usaría SELECT INTO solo en el caso de que la tabla no existiera y quisiera crearla en función de los resultados de su consulta. Como tal, estas dos declaraciones realmente no son comparables. Hacen cosas muy diferentes.
En general, SELECT INTO se usa con más frecuencia para tareas únicas, mientras que INSERT INTO se usa regularmente para agregar filas a las tablas.
EDITAR:
Si bien puede usar CREATE TABLE e INSERT INTO para lograr lo que hace SELECT INTO, con SELECT INTO no es necesario que conozca la definición de la tabla de antemano. SELECT INTO probablemente esté incluido en SQL porque facilita mucho las tareas como la creación de informes ad hoc o la copia de tablas.