Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
Есть 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


Вопрос - я вообще тем путем пошел ? Может есть более тривиально решение.
Если с путем все ОК - как из этой дряни итоговый текст запросы получить ?
15 июн 11, 11:52    [10814840]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
select @@version
?
15 июн 11, 12:00    [10814926]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
invm,

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) (Build 3790: Service Pack 2)
15 июн 11, 12:03    [10814949]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
Acce_Ekb
Member

Откуда: Екатеринбург
Сообщений: 87
dmites,

Может, varchar(max) ?
15 июн 11, 13:52    [10815882]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
monsenior
Member

Откуда: Москва
Сообщений: 973
Может лучше подкорректировать запросы?
А то:
автор
Оптимизатор запросов SQL Server, возможно, сопоставит инструкции Transact-SQL
из процедуры sp_executesql с планами выполнения из выполнявшихся ранее инструкций, обойдя
тем самым дополнительную нагрузку по созданию нового плана выполнения.


автор
способность оптимизатора запросов SQL Server сопоставлять новую строку Transact-SQL с уже
существующим планом выполнения снижается из-за постоянно изменяющихся значений параметров
в тексте строки, особенно в сложных инструкциях Transact-SQL
15 июн 11, 14:14    [10816058]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
monsenior,
Рад бы подкорректировать, но по бизнес-логике
запросом выбираю данные по списку товаров, предварительно загруженных пользователем из excel.

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

where .... and ItemNo in ('1919191','9393939', ... 50 артикулов) and ....
15 июн 11, 14:58    [10816431]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
Гузы
Guest
dmites,
А если загрузить в таблицу и потом джойнить, то запрос будет коротеенькиммм
15 июн 11, 15:28    [10816684]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
Гузы,

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

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

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

Почему blob без проблем дает запихнуть в себя текст и не дает его получить назад в том же виде ?
15 июн 11, 16:33    [10817289]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
dmites, а почему varchar(max) вместо blob не подошёл?
15 июн 11, 16:37    [10817349]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Гм... Если речь идет о методе Execute объекта Command, то у этого самого объекта есть коллекция параметров, которые могут быть гараздо длиннее, чем 4000. А sp_executesql уже давно имеет параметер @stmt с тимом nvarchar(max).
15 июн 11, 16:54    [10817542]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
Shakill,
[url=]http://www.teratrax.com/articles/varchar_max.html[/url]

не влезет больше 4000 символов в varchar(max). Вернее NVARCHAR видимо ERP посылает.
Собственно так и есть. При запросе больше чем в 4000 символов выдает ошибку.
15 июн 11, 16:56    [10817571]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
monsenior
Member

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

Почему blob без проблем дает запихнуть в себя текст и не дает его получить назад в том же виде ?

Ну вы должны указать, что вы вытаскиваете текст на не блоб, т.е. при извлечении сделать что то
вроде
select
  convert(nvarchar(10000), Text)
from Query

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

еще раз если будете толкать такие длинные динамические запросы то это плохо
скажется на времени исполнении запросов.
Лучше ограничите своих пользователей по кол-ву входящих параметров,
чем потом отвечать почему выборка идет час другой.
15 июн 11, 16:57    [10817575]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
dmites
через 'Microsoft ActiveX Data Objects 2.8 Library' выполняется SQL запрос и обрабатывается результат
Проблема в том, что через метод Execute этой библиотеки можно передать запрос длиной 4000 символов.
Появились запросы большей длины.
А точно есть такое ограничение, в 4000 символов?

Что то не нахожу в документации.

Сам вызов хоть покажите...
15 июн 11, 17:02    [10817610]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
alexeyvg
dmites
через 'Microsoft ActiveX Data Objects 2.8 Library' выполняется SQL запрос и обрабатывается результат
Проблема в том, что через метод Execute этой библиотеки можно передать запрос длиной 4000 символов.
Появились запросы большей длины.
А точно есть такое ограничение, в 4000 символов?

Что то не нахожу в документации.

Сам вызов хоть покажите...
Да, попробовал, нету никаких ограничений, как я и помнил с давних времён, когда работал с адо.

Так что вместо создания собственной супер-исполнительной оболочки поищите багу в коде :-)
15 июн 11, 17:28    [10817826]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
dmites
Shakill,
[url=]http://www.teratrax.com/articles/varchar_max.html[/url]

не влезет больше 4000 символов в varchar(max). Вернее NVARCHAR видимо ERP посылает.
Собственно так и есть. При запросе больше чем в 4000 символов выдает ошибку.


как это не влезет и что за ошибка?
по вашей же ссылке
These data types can hold the same amount of data BLOBs can hold (2 GB)


DECLARE @a nvarchar(MAX) =
	CAST(REPLICATE('a', 8000) AS nvarchar(MAX)) + 
	CAST(REPLICATE('b', 7000) AS nvarchar(MAX)) + 
	CAST(REPLICATE('c', 6000) AS nvarchar(MAX))
	
SELECT LEN(@a)
15 июн 11, 17:45    [10817947]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
dmites
Member

Откуда: Москва
Сообщений: 27
alexeyvg
alexeyvg
пропущено...
А точно есть такое ограничение, в 4000 символов?

Что то не нахожу в документации.

Сам вызов хоть покажите...
Да, попробовал, нету никаких ограничений, как я и помнил с давних времён, когда работал с адо.

Так что вместо создания собственной супер-исполнительной оболочки поищите багу в коде :-)




Хотите погрузится в частности ? Ок.
Надо выбрать одним запросом товар из списка заданного пользователем, имеющий продажи за период и/или остаток на конец периода

Сам запрос
select dd.[Vendor No_]
,dd.[Agreement No_]
,dd.[Item No_]
,dd.[Variant Code]
,dd.[Location Code]
,CONVERT(MONEY,Sum(dd.remain),0) as remain
,CONVERT(MONEY,sum(dd.sales),0) as SalesQty
,Season from

(select ce.[Vendor No_]
,isnull(ce.[Agreement No_],'-' ) as [Agreement No_]
,ce.[Item No_]
,ce.[Variant Code]
,ce.[Location Code]
,Sum(Quantity) as remain
,0 as sales
,Season
,CostPerUnitIncVAT
from dbo.ConsEntryPlus CE
where [Posting Date] <='20110614'
and [Entry Type]<>7
and ([Item No_] in ('074221','084648','098751','107154','110399','111166','111168','114807','114871','115506','115547','115823','116691','118807','119228','119240','120361','121266','121441','121640','121646','125701','125722'))
and ce.[Agreement No_] <> 'Д0085610 '
group by ce.[Vendor No_]
,ce.[Agreement No_]
,ce.[Item No_]
,ce.[Variant Code]
,ce.[Location Code]
,Season
,CostPerUnitIncVAT
having Sum(Quantity)<>0

union

select ce.[Vendor No_]
,isnull(ce.[Agreement No_],'-' )
,[Item No_]
,[Variant Code]
,ce.[Location Code]
,0
,Sum(Quantity) as sales
,Season
,CostPerUnitIncVAT
from dbo.ConsEntryPlus CE
where [Posting Date] between '20110608' and '20110614'
and [Entry Type]=1
and [Location Code] like 'М'
and ([Item No_] in ('074221','084648','098751','107154','110399','111166','111168','114807','114871','115506','115547','115823','116691','118807','119228','119240','120361','121266','121441','121640','121646','125701','125722'))
and ce.[Agreement No_] <> 'Д0085610 '
group by ce.[Vendor No_]
,ce.[Agreement No_]
,[Item No_]
,[Variant Code]
,[Location Code]
,Season
,CostPerUnitIncVAT
having Sum(Quantity)<>0
) dd

group by [Vendor No_]
,dd.[Agreement No_]
,[Item No_]
,[Variant Code]
,[Location Code]
,Season
having (sum(dd.sales)<>0
or Sum(dd.remain)<>0)
order by dd.[Vendor No_]
,dd.[Agreement No_]
,[Season]
,dd.[Item No_]


Если список товара большой - запрос не пролазит.
Баг это ERP или ADO - мне без разницы.
Мне нужен результат - реализация передачи запроса кусками на сервер, затем его сборка и вызов
16 июн 11, 11:24    [10820614]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
dmites,

Ну так пользуйтесь типом varchar(max), вместо text и будет вам счастье.
16 июн 11, 11:34    [10820718]     Ответить | Цитировать Сообщить модератору
 Re: Передача большого SQL-запроса из программы  [new]
Yury609
Member

Откуда:
Сообщений: 203
dmites, решили проблему?

Кстати, каким образов вы достаете результат запроса потом (так же через ADO?) и что вы делаете с полученными данными? (показываете в отчете? или сохраняете в файл?)

Есть вариант вообще не использовать 'Microsoft ActiveX Data Objects 2.8 Library'.
1. нужно положить запрос в "таблицу1" Navi
2. исполнить запрос на сервере с выводом данных в "таблицу2"
3. получить данные в самом Navi из "таблицы2" и потом делать с ними что угодно в самом Navi
16 июн 11, 12:06    [10820955]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить