Имя: Пароль:
1C
1С v8
ограничение Command.CommandText на количество символов
,
0 Radkt
 
11.07.17
14:17
Код:
Command.CommandText =
        "merge dbo.Base_tab as dst
        |using (select "
        +id_query1c+" as id_query1c,"
        +id_querydp+" as id_querydp,"
        +ИБ.id+ " as bd, "
        +"'"+СтрокаИзТЗ+"'"+" as bin_tab) as src
        |on (dst.id_query1c = src.id_query1c and dst.id_querydp = src.id_querydp and dst.bd = src.bd)
        |when matched then update set dst.bin_tab = src.bin_tab
        |WHEN NOT MATCHED BY TARGET THEN
        |INSERT ( id_query1c, id_querydp, bd, bin_tab) VALUES ( "
        +id_query1c+", "+id_querydp+", "+ИБ.id+", "+"'"+СтрокаИзТЗ+"'"+" );";
        Колсимв = СтрДлина(Command.CommandText);
        
        Command.CommandTimeout = 500;
         RecordSet = Command.Execute();
        Connection.close();

Стало неприятным открытием Command.CommandText имеет ограничение на количество символов. т.е. СтрокаИзТЗ очень большая и когда малый объем данных пишешь все работает, а когда большой то вываливается с ошибкой.
"Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation."

Сначала было сделано через метод записать()
Внешнего источника данных, тоже с большой строкой не прокатывало
Люди знающие SQL подскажите как обойти это ограничение без перестроения таблиц в SQL? Может есть скрипт который расширяет или снимает ограничение.
1 Serginio1
 
11.07.17
14:53
Попробуй использовать .Net

https://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802

https://msdn.microsoft.com/ru-ru/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx

Здесь есть кроссплатформенный пример
http://catalog.mista.ru/public/544232/

Но можно использовать и не кроссплатформенный без Ъ
2 МихаилМ
 
11.07.17
14:57
зависит от драйвера.
в odbc мс скл раньше было ограничение 64к на размер текста запроса.
а в oledb 2Mb. как сейчас - не знаю
3 Serginio1
 
11.07.17
14:59
4 Вафель
 
11.07.17
15:00
может на временные таблицы переделать?
5 vde69
 
модератор
11.07.17
15:02
(2) +1
еще есть такое ограничение - текст запроса должен полностью помещаться в физическую память, то есть если физической памяти мало (а используется своп) то размер текста запроса равен минимальному размеру памяти выделяемому на запрос (на память вроде 2 кб, это примерно 4 экрана текста).

то есть текст заброса не может помещаться в своп памяти !!!
6 vde69
 
модератор
11.07.17
15:03
(5) + вместе с параметрами если они есть
7 Serginio1
 
11.07.17
15:05
Можешь использовать SqlBulkCopy и DataTable

https://msdn.microsoft.com/en-us/library/ex21zs8x(v=vs.110).aspx
8 Serginio1
 
11.07.17
15:07
7+ Про использование DataTable в 1C можно посмотреть здесь
http://catalog.mista.ru/public/525806/

То есть можно заполнять ТЗ конвертировать в DataTable  и используя SqlBulkCopy  вставлять в таблицу
9 trdm
 
11.07.17
15:31
(0) > Колсимв = СтрДлина(Command.CommandText);
И какая длина?
10 Radkt
 
11.07.17
15:58
(3),(7),(8) спасибо посмотрю, но боюсь Сб завернет сторонние "не безопасные" компоненты.

(5),(6) Спасибо за информацию, но оперативки 40 из 128 занято
(9) 342 492 253
11 trdm
 
11.07.17
16:02
Может зиповать квери?
12 trdm
 
11.07.17
16:03
едрить. скуль запрос размером в 342 Мб О_О...
Надо что-то делать..
13 Radkt
 
11.07.17
16:07
(12) Тоже считаю, что спроектированная система мягко говоря не идеальна)
Видимо придется данные бить на части, а потом при получении объединять, а так не хотелось структуру менять((
14 Radkt
 
11.07.17
16:16
Может можно перенести нагрузку на параметры? чтобы параметры весили 300Мб, а не сам запрос?
15 Serginio1
 
11.07.17
16:22
(10) Можешь написать свою COM компоненту. Там не сложно
16 spock
 
11.07.17
16:30
Чего гадать? Уложить во временную таблицу, потом лалалай.
17 Serginio1
 
11.07.17
16:30
А вообще раз ты используешь merge то можешь создать текстовый файл, с помощью
|INTO #TempPrice
     |FROM OPENROWSET( BULK N'"+ФайлСПрайсом+"',
     |FORMATFILE = N'"+ИмяФайлаФрмата+"',";

Кто силен в SQL? Команда MERGE интересует.
18 Serginio1
 
11.07.17
16:32
19 trdm
 
11.07.17
16:42
Я по тексту запроса не понял, какая задача решается.
20 Radkt
 
11.07.17
18:04
(19) Обновление/добавление строки таблицы
21 Radkt
 
11.07.17
18:05
(17) И хранить в базе пути к файлу? вместо самого текста?
22 trdm
 
11.07.17
18:08
(20) я не о том, что там за данные обрабатываются?
23 Radkt
 
11.07.17
18:13
(22) это серкет фирмы) в общем стат данные
24 trdm
 
11.07.17
18:24
серкеты дело святое.
25 dmitryds
 
11.07.17
18:37
(0) а может просто неэкранированный спецсимвол попадается? (вроде бы можно использовать параметры для обхода этого)
26 Radkt
 
11.07.17
18:41
(25) нет, тогда бы он попадался и в другом периоде,
ЗначениеВСтрокуВнутр() применяется к таблице
Программист всегда исправляет последнюю ошибку.