Передача большого SQL-запроса из программы

dmites
Дата: 15.06.2011 11:52:22
Есть ERP navision
из которой через 'Microsoft ActiveX Data Objects 2.8 Library' выполняется SQL запрос и обрабатывается результат
Проблема в том, что через метод Execute этой библиотеки можно передать запрос длиной 4000 символов.
Появились запросы большей длины.

Выполнение запроса из файла требует наличие на каждой машине утилит (ISQL / OSQL) - не подходит.

Как возможное решение есть идея создать таблицу с blob-полем, куда накидывать кусками код запроса, затем на стороне SQL-сервера итоговый запрос доставать и выполнять
Сказано-сделано.

Запрос накидываем кусками в таблицу [User Query] (ID - int (ID сессии), [Query Text] - blob - (текст запроса))

DECLARE @ptrval binary(16),

SELECT @ptrval = TEXTPTR(QueryText)
from dbo.[User Query]
where ID=@ID
UPDATETEXT dbo.[User Query].QueryText @ptrval NULL 0 @SQL;


Но когда пытаюсь считать,

SELECT @ptrval = TEXTPTR(QueryText)
from dbo.[User Query]
where ID=@ID
READTEXT dbo.[User Query].QueryText @ptrval 0 0;

результат в виде

0x73656C65637473656C65637473656C65637473656C656374


Вопрос - я вообще тем путем пошел ? Может есть более тривиально решение.
Если с путем все ОК - как из этой дряни итоговый текст запросы получить ?
invm
Дата: 15.06.2011 12:00:36
select @@version
?
dmites
Дата: 15.06.2011 12:03:19
invm,

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) (Build 3790: Service Pack 2)
Acce_Ekb
Дата: 15.06.2011 13:52:43
dmites,

Может, varchar(max) ?
monsenior
Дата: 15.06.2011 14:14:30
Может лучше подкорректировать запросы?
А то:
автор
Оптимизатор запросов SQL Server, возможно, сопоставит инструкции Transact-SQL
из процедуры sp_executesql с планами выполнения из выполнявшихся ранее инструкций, обойдя
тем самым дополнительную нагрузку по созданию нового плана выполнения.


автор
способность оптимизатора запросов SQL Server сопоставлять новую строку Transact-SQL с уже
существующим планом выполнения снижается из-за постоянно изменяющихся значений параметров
в тексте строки, особенно в сложных инструкциях Transact-SQL
dmites
Дата: 15.06.2011 14:58:28
monsenior,
Рад бы подкорректировать, но по бизнес-логике
запросом выбираю данные по списку товаров, предварительно загруженных пользователем из excel.

Пользователь, радуясь такой возможности, загружает список из 50 и более артикулов
и получаем конструкцию в запросе

where .... and ItemNo in ('1919191','9393939', ... 50 артикулов) and ....
Гузы
Дата: 15.06.2011 15:28:13
dmites,
А если загрузить в таблицу и потом джойнить, то запрос будет коротеенькиммм
dmites
Дата: 15.06.2011 16:33:16
Гузы,

да можно и так
и универсальную таблицу сделать ID сессии / Универсальное поле
наполнять и джойнить с ней при выборке с условием в виде большого списка.

Но хотелось бы универсальное решение - как изящно протолкнуть SQL- серверу запрос
любой длины.

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

Почему blob без проблем дает запихнуть в себя текст и не дает его получить назад в том же виде ?
Shakill
Дата: 15.06.2011 16:37:50
dmites, а почему varchar(max) вместо blob не подошёл?
pkarklin
Дата: 15.06.2011 16:54:18
Гм... Если речь идет о методе Execute объекта Command, то у этого самого объекта есть коллекция параметров, которые могут быть гараздо длиннее, чем 4000. А sp_executesql уже давно имеет параметер @stmt с тимом nvarchar(max).