При попытке оптимизировать процесс обмена данными между 1С и SQL Server мы часто сталкиваемся с необходимостью добавления множества записей за один раз. Однако попытка собрать длинную строку с конструкцией INSERT INTO ... VALUES (...), (...), ... нередко приводит к ошибке Incorrect syntax near ','. Давайте разберемся, почему это происходит и как правильно организовать массовую загрузку данных.
Когда мы отправляем запрос через ADODB.Connection и Execute, мы полностью зависим от того, как этот запрос интерпретирует драйвер и сам сервер. Основные причины ошибок при массовом добавлении:
ODBC могут не поддерживать современный синтаксис множественного добавления (поддерживается в MS SQL начиная с версии 2008).47 335) приводит к тому, что SQL сервер воспринимает запятую как разделитель значений, а не десятичный разделитель.Прежде всего, приведем данные к «чистому» виду. SQL сервер не понимает пробелы внутри чисел как разделители разрядов, а запятая в качестве десятичного разделителя в SQL-коде запрещена. Для работы с числами всегда используйте точку. Если вы передаете даты, приводите их к формату YYYYMMDD или используйте стандартный ISO-формат YYYY-MM-DDTHH:MM:SS.
Вместо стандартного Microsoft OLE DB Provider for ODBC Drivers, который является «оберткой» и часто имеет ограничения, попробуйте перейти на прямой SQLOLEDB или MSOLEDBSQL. Это позволит избежать лишних слоев абстракции и повысить стабильность выполнения команд.
Если массовый INSERT всё равно вызывает ошибку, не обязательно писать по одной строке в цикле — это крайне медленно. Рассмотрим более эффективный подход — использование временной таблицы:
Алгоритм работы:
CREATE TABLE #TempTable (...).INSERT INTO TargetTable SELECT * FROM #TempTable.Пример реализации через пакетный запрос:
// Пример формирования пакета
ТекстЗапроса = "INSERT INTO #TempTable (Nomer, Summa) VALUES ";
Для Каждого Строка Из ДанныеЦикла Цикл
ТекстЗапроса = ТекстЗапроса + "(" + Строка.Номер + ", " + Формат(Строка.Сумма, "ЧДЦ=2; ЧРД=.; ЧГ=0") + "),";
КонецЦикла;
// Убираем последнюю запятую и отправляем на сервер
Чтобы навсегда забыть о проблемах с форматированием (пробелы, запятые, даты), лучше всего использовать объект ADODB.Command. При использовании параметров драйвер сам заботится о правильной передаче типов данных, исключая ошибки синтаксиса и угрозу SQL-инъекций.
Рассмотрим структуру использования:
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "INSERT INTO Block_oper (Nomer, Summa) VALUES (?, ?)";
// Добавляем параметры
Параметр1 = Команда.CreateParameter("Nomer", 200, 1, 50, ЗначениеНомера);
Команда.Parameters.Append(Параметр1);
Команда.Execute();
Для решения задачи массовой загрузки данных в SQL Server из 1С, мы рекомендуем следующий порядок действий:
OLEDB провайдер.Работа с внешними базами данных через 1С — это задача, требующая аккуратности в типах данных. Проанализировав ваш код, можно заметить, что передача \"красивых\" отчетов 1С (с пробелами в суммах) напрямую в SQL невозможна. Приведите данные к машиночитаемому виду, и проблема исчезнет сама собой!