2008-11-24 42 views
17

¿Tiene algún truco para generar sentencias SQL, principalmente INSERTs, en Excel para varios escenarios de importación de datos?Trucos para generar sentencias SQL en Excel

realmente estoy cansando de escribir fórmulas con como

="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"

Respuesta

30

El punto y coma tiene que estar dentro de la última cotización doble con un paréntesis de cierre. Al agregar comillas simples alrededor de una cadena, recuerde agregarlas fuera de la celda seleccionada.

(espacios añadidos para la visibilidad - retire antes de insertar)

=CONCATENATE("insert into table (id, name) values (",C2,",' ",D2," ');")

Aquí es otra vista:

=CONCATENATE("insert into table (id, date, price) values (",C3,",'",D3,"',",B3,");")

+0

hey guys No soy capaz de ejecutar las fórmulas mencionadas anteriormente en excel 2010, ya que dice error en la fórmula. abd no sé cómo formatear las celdas (como c2 y d2) para texto o número .plz guíame en el mismo –

+0

Funciona bien con cualquier versión de Excel. Es posible que deba colocar un contenedor de Texto() alrededor de los datos. ¿Cómo se ve el SQL "final"? –

0

¿Por qué está generando SQL en Excel? Es más fácil y mucho más rápido exportar una hoja de trabajo como un archivo CSV, y luego usar alguna herramienta para importar ese archivo en una base de datos SQL. Por ejemplo, la declaración LOAD DATA INFILE de MySQL.

Disculpas por no responder a tu pregunta directamente, y sé que esta no es una solución para todas las circunstancias.

+0

"importo" desde Excel por varias razones ... - No puedo simplemente importar datos, así que puedo modificar valores con fórmulas de Excel. - Los usuarios pueden modificar los datos mientras las fórmulas con inserciones ya están en su lugar. - Los formatos de fechas y valores numéricos a menudo necesitan ajustes antes de la importación. - ... –

+0

Sí, lo hago, pero guardo todas las fórmulas en una hoja de trabajo separada, dispuesta para que pueda exportar esa hoja de cálculo como CSV. Puede escribir fórmulas que lean celdas en otra hoja de trabajo como su fuente de datos. Pero YMMV: entiendo que esto puede no aplicarse a su caso. –

0

Estaba haciendo esto ayer, y sí, es molesto obtener las citas correctas. Una cosa que hice fue tener una celda con nombre que solo contenía una sola cita. Escriba en A1 ="'" (es decir, comillas dobles, comilla simple, comillas dobles) y luego denomine esta celda "CITA" tipeando eso en el cuadro a la izquierda de la barra de herramientas más baja.

0

A veces, crear inserciones SQL esta parece ser la forma más fácil. Pero te cansas rápido, y no creo que haya formas "inteligentes" de hacerlo (aparte de la programación de macros/VBA).

Te gustaría señalar para evitar Excel y explorar algunas otras ideas:

  • uso de acceso (filtro de importación gran csv, y luego enlazar a la tabla de base de datos y vamos Acceso manejar el inserto)
  • uso SAPO (aún mejor característica de importación, ya que le permite mezclar y combinar columnas, e incluso importar desde el portapapeles)
  • use SQL Loader (un poco complicado de usar, pero rápido y bastante flexible).
0

Exportar un archivo de Excel como csv puede ser una opción alternativa (ver la publicación de Bill Krawin - como un nuevo póster, no puedo agregar ningún comentario aún). Sin embargo, ten en cuenta que probablemente tengas que cambiar el formato de tus campos de fecha aaaa-mm-dd; de lo contrario, las columnas de fecha mostrarán 00/00/00, esto es porque MySQL usa una fecha de inicio de formulario diferente a Microsoft Excel. Alternativamente, use OpenOffice para guardar el archivo csv.

0

¿Qué le parece consultar e insertar los datos del libro de Excel en la fuente utilizando SQL ACE/Jet (a.k.a. Access)? Esto requiere un ACE/Jet que podría ser otra hoja de cálculo de Excel. Aquí hay un ejemplo rápido:

INSERT INTO 
    [ODBC;Driver={SQL Server};SERVER=MYSERVER;DATABASE=MyDatabase;UID=sa;Pwd=mypassword;].MyTable (ID, Name) 
SELECT F1, F2 
    FROM 
    [Excel 8.0;HDR=NO;IMEX=1;Database=C:\db.xls;].[Sheet1$A1:B4]; 
2

Solía ​​utilizar el método de concatenación de cadenas para crear inserciones SQL en Excel. Puede funcionar bien, pero también puede ser un poco lento y "difícil".

creé un Excel Add-In que hace que la generación de inserciones de Excel más fácil:

(ver el video en la parte inferior de la página) http://www.howinexcel.com/2009/06/generating-sql-insert-statements-in-excel.html

http://www.querycell.com/SQLGenerator.html

http://www.oneclickcommissions.com/excel-statement.html

2

A veces uso sustitutos para reemplazar patrones en el comando SQL en lugar de intentar construir el comando sql sin concatenación. Supongamos que los datos están en las columnas A & B. Inserte una fila superior. En lugar de células C1 el comando SQL usando patrón:

insert into table t1 values('<<A>>', '<<B>>') 

Luego, en filas 2 lugar la fórmula excel:

=SUBSTITUTE(SUBSTITUTE($C$1, "<<A>>", A2), "<<B>>", B2) 

Nota el uso de células direccionamiento absoluto $C$1 para obtener el patrón. Especialmente agradable cuando se trabaja con char o varchar y tener que mezclar las comillas simples y dobles en la concatenación. Comparar con:

=concatenate("insert into table t1 values '", A2, "', '", B2, "')" 

Otra cosa que me ha mordido más de una vez está tratando de utilizar Excel para procesar algunos caracteres o varchars que son numéricas, excepto que tienen ceros a la izquierda como 007. Excel se convertirá en el número 7.

1

el enfoque VBA sería: declarar la cadena y asignar la instrucción SQL como este enfoque

dim SqlString as String 
SqlString = "SELECT * FROM %1 WHERE (var=%2)" 
SqlString = Replace("%1", "Table_Name") 
SqlString = Replace("%2", ""value"") 

Excel es similar, pero usando la función SUBSTITUTE.

Prefiero este enfoque porque hace que el texto SQL sea legible y evita todos los molestos & y concatenan problemas. Sí, toma una celda extra, pero vale la pena para el seguimiento de auditoría.

1

Sé este dolor. Terminé writing about it on my blog ... twice.
Creé una UDF que concatena un rango de celdas junto con varias opciones. Esto siempre ordenará separar los valores, pero también agregará opcionalmente comillas simples y/o paréntesis según sea necesario.

Por lo tanto, escribe la parte fácil de la declaración sql.

INSERT INTO table 
VALUES /*string that we don't want to type by hand*/ 

o

SELECT * 
FROM table 
WHERE foo IN (/*another string I don't want to type out*/) 

Y la costumbre sobresalen por debajo de la función a su vez, los valores en un rango de hoja de cálculo en una bonita cadena para usted.

Function SQLConcat(rng As Range, Optional quoted As Boolean = False, Optional parenthesis As Boolean = False) As String 
' *************************************************************** 
' * Returns a comma separated list for use in SQL IN statements * 
' * Params * 
' * - rng: Range of cells to concatenate * 
' * - quoted: True/False. If true, values are placed inside * 
' * of single quotes. Default of false * 
' * - parenthesis: Boolean. * 
' * Useful for INSERT INTO tbl VALUES(53),(90),(397) * 
' * * 
' * Author: Christopher J. McClellan * 
' * Published under Creative Commons Attribution-Share Alike * 
' * http://creativecommons.org/licenses/by-sa/3.0/ * 
' * You are free to change, distribute, and pretty much do * 
' * whatever you like with the code, but you must give credit * 
' * to the original author and publish any derivitive of this * 
' * code under the same license. * 
' *************************************************************** 

Dim tmp As String 'temporary string 
Dim row As Long 'first cell is special case 
row = 0 'initalize row count 
Dim c As Object 'cell 
Dim txtwrapperLeft As String, txtwrapperRight As String 

If quoted = True And parenthesis = False Then 
txtwrapperLeft = "'" 
txtwrapperRight = "'" 
ElseIf quoted = True And parenthesis = True Then 
txtwrapperLeft = "('" 
txtwrapperRight = "')" 
ElseIf quoted = False And parenthesis = True Then 
txtwrapperLeft = "(" 
txtwrapperRight = ")" 
Else 
'quoted = false and parenthesis = false 
txtwrapperLeft = "" 
txtwrapperRight = "" 
End If 

For Each c In rng.Cells 
If row = 0 Then 
tmp = txtwrapperLeft & c.Value & txtwrapperRight 
Else 
tmp = tmp & "," & txtwrapperLeft & c.Value & txtwrapperRight 
End If 
row = row + 1 
Debug.Print tmp 
Next c 

'return 
SQLConcat = tmp 
End Function 
Cuestiones relacionadas