Имя: Пароль:
1C
1С v8
ADODB.Command пытаюсь выполнить запрос UNION +? + 2*FROM, но получаю ошибку
0 TormozIT
 
гуру
23.10.14
12:17
select 1 f
FROM (select 1 f) t
union
SELECT 1 f
FROM (select 1 f) t
WHERE ? <= 2


Сразу после установки этого текста в объект Command обращаюсь к его свойству Parameters.Count и получаю исключение (-2147467259 неверный синтаксис около конструкции ".2")

Если же я делаю тоже самое с запросом

SELECT 1 f
FROM (select 1 f) t
WHERE ? <= 2


или

select 1 f
union
SELECT 1 f
FROM (select 1 f) t
WHERE ? <= 2


или

select 1 f
union
SELECT 1 f
FROM (select 1 f) t
WHERE 1 <= 2


то исключения не возникает.

Акцентирую еще раз, что речь идет даже не о выполнении запроса, а о конкретно вычислении свойства Parameters.Count сразу после установки текста запроса. Т.е. код примерно такой

ОбъектЗапрос = Новый COMОбъект("ADODB.Command");
ОбъектЗапрос.ActiveConnection = СоединениеADO;
ОбъектЗапрос.CommandText = Текст;
Пустышка = ОбъектЗапрос.Parameters.Count;

Варианты явно встраивать в текст константу и выполнять запрос по частям понятны, но интересует именно озвученная проблема. Возможно тут какой то баг в драйвере? Или я просто чего то не знаю? Научите пожалуйста =)

Пробовал 2 провайдера
1. Provider=SQLOLEDB;
2. Provider=SQLNCLI10;

Поведение одинаковое и описание ошибки тоже.
1 Dmitry1c
 
23.10.14
12:22
>select 1 f

что за f?
2 TormozIT
 
гуру
23.10.14
12:25
Забыл сразу указать, что речь про выполнение запроса в MSSQL из 1С.

(1) f и t - псевдонимы поля и таблицы.
3 dk
 
23.10.14
12:36
тоже недавно не смог победить UNION и параметрированный запрос
хотя мне условие нужно было добавить в обе ветки uniona
4 Mordor_1C
 
23.10.14
12:47
(0) Чтобы получить количество параметров их сначала надо добавить. )
5 Ёпрст
 
23.10.14
12:48
мот алиясы разные попробовать в юнионе ?
6 TormozIT
 
гуру
23.10.14
12:52
(4) Это не объясняет РАЗНИЦУ в поведении описанных вариантов запроса.
7 TormozIT
 
гуру
23.10.14
12:53
(5) пробовал без алиасов. Поведение не меняется.
8 Ёпрст
 
23.10.14
12:54
всякие сетнокоунт он/офф  не могут влиять ?
9 Mordor_1C
 
23.10.14
12:56
(7) Объясняет причину, по которой появляется " (-2147467259 неверный синтаксис около конструкции ".2") "
10 Mordor_1C
 
23.10.14
12:58
(7) И что показывает Parameters.Count для запроса?
select 1 f
union
SELECT 1 f
FROM (select 1 f) t
WHERE 1 <= 2
11 TormozIT
 
гуру
23.10.14
13:00
(10) 0 показывает для всех успешных вариантов
12 Mordor_1C
 
23.10.14
13:05
(11) И запрос.
select 1 f
FROM (select 1 f) t
union
SELECT 1 f
FROM (select 1 f) t
WHERE ? <= 2

выполняется если убрать Parameters.Count?
13 Дык ё
 
23.10.14
13:08
(0) с провайдером MSDASQL работает
автоопределение критично? попробуй руками добавить:

ОбъектЗапрос = Новый COMОбъект("ADODB.Command");
ОбъектЗапрос.ActiveConnection = СоединениеADO;
ОбъектЗапрос.NamedParameters = true;
ОбъектЗапрос.Prepared = true;

Параметр = ОбъектЗапрос.CreateParameter("@ID", ТипыADO.adInteger, НаправленияПараметров.adParamInput,, );
ОбъектЗапрос.Parameters.Append(Параметр);

ОбъектЗапрос.CommandText = Текст;
14 TormozIT
 
гуру
23.10.14
13:32
(12) Нет. Парсинг текста внутри объекта Command похоже выполняется при первом обращении к одному из свойств, в список которых входит Parameters. Поэтому его я указал для отсечения дополнительных возможных причин проблемы.
15 TormozIT
 
гуру
23.10.14
13:36
(13) Автоопределение не нужно. Параметр добавляю как раз через CreateParameter.
С MSDASQL не пробовал. Спасибо, поразбираюсь с ним.
16 Mordor_1C
 
23.10.14
14:47
(15) А если хранимую процедуру создать в MSSQL и вместо запроса на объединение ее вызывать?
17 TormozIT
 
гуру
23.10.14
15:32
(16) У меня может не быть прав на создание хранимых процедур. Нужно именно запросом.
18 Torquader
 
23.10.14
19:10
При присваивании Command система должна выполнить Prepare и установить число параметров.
Parameters.Count в этом случае должно быть доступно только на чтение.
Самый главный вопрос - он умеет вообще объединять вложенные запросы ?
19 TormozIT
 
гуру
23.10.14
22:47
(18) Если заменить вложенные запросы именами таблиц, то ситуация не меняется.
20 Fragster
 
гуру
23.10.14
22:50
кто-нибудь победил глюки с асинхронным выполнением, когда параметры одного выражения влияли на другое? я чуть не поседел, отлаживая... пришлось отказаться от асинхронности, что привело к увеличению времени обработки в 3 раза :(
2 + 2 = 3.9999999999999999999999999999999...