Трюки для генерации операторов SQL в Excel

18

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

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

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

Теги:
excel-vba
excel
metaprogramming

11 ответов

30
Лучший ответ

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

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

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

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

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

  • 0
    Эй, ребята, я не могу выполнить вышеупомянутые формулы в Excel 2010, так как это говорит об ошибке в формуле. abd я не знаю, как отформатировать ячейки (например, c2 и d2) для текста или числа
  • 0
    Он отлично работает с любой версией Excel. Возможно, вам понадобится обернуть текст () оболочкой вокруг данных. Как выглядит «окончательный» SQL?
2

Иногда я использую замену для замены шаблонов в команде 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 для обработки некоторых символов или varchars, которые являются числовыми, за исключением того, что они имеют начальные нули, такие как 007. Excel преобразуется в число 7.

2

Я использовал метод конкатенации String для создания вставки 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

Я знаю эту боль. Я закончил писал об этом в своем блоге... дважды.
Я создал 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

подход 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

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

=CONCATENATE("INSERT INTO 'database_name'.'table_name'('Column_Name','Column_Name') VALUES ( '",A1,"',",B1,"); ")
0

Как насчет запроса и вставки данных из книги 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

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

0

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

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

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

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

0

Почему вы создаете SQL в Excel? Это проще и быстрее экспортировать рабочий лист в виде файла CSV, а затем использовать какой-либо инструмент для импорта этого файла в базу данных SQL. Например MySQL LOAD DATA INFILE.

Извините, что не ответил на ваш вопрос напрямую, и я знаю, что это не решение для всех обстоятельств.

  • 0
    Я "импортирую" из Excel по ряду причин .... - Я не могу просто импортировать данные, поэтому я могу изменять значения с помощью формул Excel. - Пользователи могут изменять данные, пока формулы со вставками уже на месте. - Форматы дат и числовых значений часто нуждаются в настройке перед импортом. - ...
  • 0
    Да, я делаю это, но я храню все формулы на отдельном рабочем листе, так что я могу экспортировать этот рабочий лист как CSV. Вы можете написать формулы, которые читают ячейки в другой рабочей таблице как их исходные данные. Но YMMV - я понимаю, это может не относиться к вашему делу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню