Однажды нужно было выполнить небольшой SQL-запрос весом в 100 килобайт:

UPDATE [dbo].[tbl_Query]
SET QueryData =  0x3c3f{ещё сто тысяч буковок и циферок}13e0a
WHERE ID = 'b10832f4-5f3f-4c94-bc05-329d9b4525cf'

Проблема была в том, что на компьютере, на котором это надо было выполнить, был установлен только Query Analyzer из MS SQL Server 2000, который отказывался открывать файлы больше 64К и даже вставлять текст такого размера из буфера обмена. Ведь 64 килобайта хватит каждому!

Помогло создание в Terrasoft XRM скрипта с таким текстом:

//-----------------------------------------
// scr_ScriptTest
//-----------------------------------------

function Main() {
        var Parameters = System.CreateObject('TSObjectLibrary.Parameters');
        try {
                Connector.DBEngine.ExecuteCustomSQL(
                "update [dbo].[tbl_Query] set QueryData =  0x3c3f{ещё сто тысяч буковок и циферок}13e0a where ID = 'b80832f4-5f2f-4c74-bc05-349d9b4525cf'",
                Parameters);
        } catch(e) {
                Log.Write(1, e.message);       
        }
       
}

Запускаем его из TSAdmin по клавишей F9, и содержимое таблицы обновилось.

Нравится

Поделиться

4 комментария

Александр, ограничение 64к не спроста. MSSQL сервер не может выполнить запрос который длиннее - это ограничено на уровне ядра СУБД. Подробности здесь
Вывод: ExecuteCustomSQL не спасет, если запрос длинный, вам его необходимо разбить на части или если одним файлом, то разделить GO (или параметром который укажите для консольной утилиты). Про утилиты можно прочитать здесь

Спасибо за ссылку.

Но:

  • Подобный запрос, только insert, нормально выполнялся из MS SQL Server Management Studio 2008 R2.
  • И в ExecuteCustomSQL таки тоже выполнился, проблема решена.
  • Там написано, что Batch size не более 65,536 * Network Packet Size, а этот Network Packet Size по умолчанию равен 4096 байт.
  • Ниже написано, что максимальный размер хранимой процедуры составляет 250 MB.
  • Запрос из update одного поля разделить затрудняюсь.

Александр, я думал вы выполняли большой sql скрипт, а не загружали данные в одно поле.
Тогда ваше решение имеет нюанс - достигнув ограничения Batch size вас не спасет ExecuteSQLText - сервер физически не сможет принять ваш запрос в виде текста и выполнить. Если необходимо загрузить БОЛЬШОЙ объект в блоб поле, то или писать кастомную утилиту и там использовать параметры или попробовать openrowset

Для решаемой задачи ограничения на Batch size (более 250 MB) не достигались, проблема была в Query Analyzer. За идею с OPENROWSET спасибо.

Показать все комментарии

В Администраторе Terrasoft CRM уже есть некоторые функции, о которых большинство пользователей знают, но кому-то они окажутся ранее неведомой полезностью.

Подсказки и дополнения

При нажатии [Ctrl] + [пробел] показывается список функций, название которой совпадают с тем, что начал водить пользователь.

список функций

При нажатии [Shift] + [пробел] происходит автодополнение популярных конструкций (if, for, function). Для этого должен быть наполнен файл AutoComplete.cfg. Пример содержимого такого файла.

Список функций в скрипте

Нажимаем [Ctrl] + [G] или выбираем пункт в меню "Поиск" и видем окно:
список методов

Туда и обратно

Чтобы перейти от вызова функции к её определению, нажимаем на название функции мышью с зажатым [Ctrl]. Чтобы после этого вернуться обратно, нажимаем [Alt] + [←] (стрелочка "влево").

Двигаем блоки

Чтобы красиво оформить код в соответствии с о структурой for-ов, if-ов и функций, нужно делать отступы. Чтобы из такого:

function GetEnumControlValue(EnumControl) {
var Item = EnumControl.Value;
var Result = (Item ? Item.Code : null)
return Result;
}
получить такое:
function GetEnumControlValue(EnumControl) {
        var Item = EnumControl.Value;
        var Result = (Item ? Item.Code : null)
        return Result;
}

выделяем мышью средние строки и нажимаем [Tab]. Они вместе сдвигаются вправо на табуляцию. Нажатие [Shift] + [Tab] сдвигает влево.

Поиск по всем скриптам проекта

Он же Grep search. О нём точно каждый пользователь знает, но мало ли. Вызывается из меню "Инструменты" или клавишами [Shift] + [Alt] + [S]:
Grep search

В версии для Oracle поиск работает очень неспешно, в MS SQL – шустрее.

Нравится

Поделиться

3 комментария

А в старых версиях (например Terrasoft 3.02 ) эти мелочи будут работать?

В 3.0.2.68 почти ничего не сработало, есть только сдвиг табом.

Не плохо-бы такие вещи отражать в документации. Особенно вот это: "Поиск по всем скриптам проекта". К тому же добавить вот это: http://www.community.terrasoft.ru/blogs/6549, а ещё вот это: http://www.community.terrasoft.ru/developer/advice/4576 и ещё много чего...
Это же так просто, даже писать ничего не надо. Берёте текст из подобного поста и вставляете в документацию.
50% ответов на возникающие вопросы я нахожу на коммьюните, 40% - прямые обращения и лишь 10% - в документации. Это неправильная ситуация.

P.S. Это я к специалистам из Terrasoft обращаюсь.

Показать все комментарии