Трюки для создания операторов SQL в Excel - PullRequest
18 голосов
/ 25 ноября 2008

Есть ли у вас какие-либо приемы для генерации операторов SQL, в основном вставок, в Excel для различных сценариев импорта данных?

Я действительно устал от написания формул с

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

Ответы [ 11 ]

31 голосов
/ 25 ноября 2008

Точка с запятой должна быть внутри последней двойной кавычки с закрывающей пареню. При добавлении одинарных кавычек вокруг строки не забудьте добавить их за пределы выбранной ячейки.

(пробелы добавлены для видимости - удалите перед вставкой)

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

Вот еще один вид:

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

2 голосов
/ 09 июля 2009

Иногда я использую замену для замены шаблонов в команде SQL вместо того, чтобы пытаться создать команду sql из конкатенации. Скажем, данные в столбцах A и B. Вставьте верхнюю строку. В ячейку C1 поместите команду SQL, используя шаблон:

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

Затем в строках 2 поместите формулу Excel:

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

Обратите внимание на использование абсолютной адресации ячеек $C$1 для получения шаблона. Особенно приятно работать с char или varchar и смешивать одинарные и двойные кавычки в конкатенации. Сравните с:

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

Еще одна вещь, которая укусила меня более одного раза, - это попытка использовать Excel для обработки некоторых числовых или типовых символов, за исключением того, что они имеют начальные нули, например 007. Excel преобразуется в число 7.

2 голосов
/ 09 июля 2009

Я использовал метод конкатенации строк для создания вставок SQL в Excel. Это может хорошо работать, но также может занимать немного времени и быть «неудобным».

Я создал надстройку Excel, которая упрощает создание вставок из Excel:

(см. Видео внизу страницы) 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

1 голос
/ 16 февраля 2015

Я знаю эту боль. Я закончил тем, что написал об этом в своем блоге ... дважды .
Я создал UDF, который объединяет ряд ячеек вместе с несколькими опциями. Это всегда будет разделять значения запятыми, но при необходимости добавит одинарные кавычки и / или круглые скобки.

Итак, вы пишете простую часть оператора sql.

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

или

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

А приведенная ниже пользовательская функция Excel превратит значения в диапазоне электронных таблиц в приятную для вас строку.

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
1 голос
/ 12 апреля 2011

подход VBA будет: объявите вашу строку и присвойте свой оператор SQL следующим образом

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

Подход Excel аналогичен, но с использованием функции SUBSTITUTE.

Я предпочитаю этот подход, потому что он делает текст SQL разборчивым и избегает всех раздражающих и связанных проблем. Да, требуется дополнительная ячейка, но она того стоит для контрольного журнала.

0 голосов
/ 19 февраля 2019

Для вставки данных в таблицу sql

=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")
0 голосов
/ 16 июня 2009

Как насчет запросов и вставки данных из книги Excel в источник с помощью ACE / Jet (a.k.a. Access) SQL? Это требует ACE / Jet, который может быть другой электронной таблицей Excel. Вот быстрый пример:

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];
0 голосов
/ 16 июня 2009

Альтернативным вариантом может быть экспорт файла Excel в формате csv (см. Пост Билла Кроуина - в качестве нового автора я пока не могу добавить комментарий). Однако имейте в виду, что вам, вероятно, придется изменить форматирование полей даты на yyyy-mm-dd, в противном случае все столбцы даты будут отображать 00/00/00 - это потому, что MySQL использует другой формат даты для Microsoft Excel. Или используйте OpenOffice для сохранения файла csv.

0 голосов
/ 25 ноября 2008

Иногда создание SQL-вставок кажется наиболее простым способом. Но вы устали от этого быстро, и я не думаю, что есть «умные» способы сделать это (кроме, может быть, программирования макросов / VBA).

Я бы хотел, чтобы вы избегали Excel и исследовали некоторые другие идеи:

  • использовать Access (отличный фильтр импорта CSV, затем ссылку на таблицу БД и позволить Access обработать вставку)
  • использовать TOAD (еще лучшая функция импорта, поскольку она позволяет смешивать и сопоставлять столбцы и даже импортировать из буфера обмена)
  • использовать SQL Loader (немного сложно, но быстро и довольно гибко).
0 голосов
/ 25 ноября 2008

Я делал это вчера, и да, это раздражает, чтобы правильно расставить цитаты. Одна вещь, которую я сделал, имела именованную ячейку, которая содержала одну кавычку. Введите A1 ="'" (равно, двойная кавычка, одинарная кавычка, двойная кавычка), а затем назовите эту ячейку "QUOTE", введя ее в поле слева от нижней панели инструментов.

...