Публикация

Выполнение SQL-запроса большого размера

Однажды нужно было выполнить небольшой 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 спасибо.

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