|
v7: Прямые запросы. Ошибка "В RPC режиме параметризированные запросы невозможны." | ☑ | ||
---|---|---|---|---|
0
Альбатрос
28.10.13
✎
07:18
|
Не могу понять, как нужно правильно задать параметр?
ТекстЗапроса = "CREATE TABLE #tt2(f_0 CHAR(9), f_1 DATETIME, f_2 CHAR(13), f_3 CHAR(9), f_4 CHAR(9), f_5 CHAR(9))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt2(f_0, f_1, f_2, f_3, f_4, f_5) |SELECT | Журнал.IDDOC, | CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME), | Журнал.DOCNO, | Журнал.SP1165, | Журнал.SP1005, | $Документ.РасходнаяКредит.Склад |FROM | _1SJOURN as Журнал WITH(NOLOCK) | INNER JOIN #tt1 as Клиенты | ON Клиенты.f_0 = Журнал.SP1165 | INNER JOIN $Документ.РасходнаяКредит as РасходнаяКредит WITH(NOLOCK) | ON РасходнаяКредит.IDDOC = Журнал.IDDOC |WHERE | $Документ.РасходнаяНал IN (SELECT Val FROM #СЗ) |"; //глЗапросSQL.РежимPRC(0); глЗапросSQL.УложитьСписокОбъектов13(СЗ, "#СЗ"); глЗапросSQL.Подготовить(ТекстЗапроса); //Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда //глЗапросSQL.УстПараметр(1, СЗ); //// глЗапросSQL.УстПараметр(2, ДатаОкончания); //КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Подскажите, пожалуйста. |
|||
1
mehfk
28.10.13
✎
07:28
|
А не наоборот ли ?
глЗапросSQL.УложитьСписокОбъектов13(СЗ, "#СЗ"); ->> глЗапросSQL.УложитьСписокОбъектов13("#СЗ", СЗ); |
|||
2
mehfk
28.10.13
✎
07:33
|
(1)+ Вы правы, это я запамятовал. Тогда вот так
• RPCMode(nMode) / РежимRPC() – переводит объект в специальный режим выполнения запросов. Только для MSSQL. Когда этот режим включен, выполнение запроса происходит с помощью RPC вызова хранимой процедуры sp_executesql. (Подробнее о назначении этой ХП можно прочитать в BOL (Books Online)). В сущности это – режим парсера, а не режим этого объекта. Не применимо для параметризированных запросов. По умолчанию этот режим выключен. Смысл этого метода в том, что текстовые параметры в тексте запроса заменяются не на их значение, а на T-SQL переменные. Кроме того, на T-SQL переменные заменяются метаимена, разрешающиеся в идентификаторы. В результирующих запросах виртуальных таблиц все параметры также будут заменены на T-SQL переменные. Таким образом, при выполнении различных запросов, отличающихся только значениями текстовых параметров, текст запроса, который уходит на сервер, остается одинаковым (если, конечно, он не изменяется качественно вследствие разрешения какой либо виртуальной таблицы) и будет происходить эффективное использование кэша планов выполнения запросов (сервер будет выполнять меньше компиляций). Рекомендации по использованию. В общем-то, его лучше ставить всегда, или в таких случаях, где неудобно использовать параметризированные запросы (они все же быстрее), особенно в потенциально частых запросах (применяющихся в модуле проведения, например). Ограничения. Так как выполнение происходит по средствам вызова хранимой процедуры, в силе все особенности выполнения в теле хранимой процедуры. Например, если создавать временную таблицу, то запрос отработает, но таблица будет удалена сервером сразу после выполнения запроса (батча). +Параметры: - nMode (Число): 1 – включить режим, 0 – выключить режим. |
|||
3
Альбатрос
28.10.13
✎
07:43
|
(2) Ага, я ступил ))) Надо было .РежимRPC в самом начале устанавливать, у меня там еще одиг запрос с параметрами был.
Но теперь другая проблема: - State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'dh42'. Поискал в ДД, нашел только вот это: #=============================================================================== #==PROCEDURE EscalateTLock # Name |Descr |Parameters |Source P=_1sp_DH42_TLock |EscalateTLock | |set nocount on declare i integer select i=1 from DH42(TABLOCK HOLDLOCK) where 0=1 # #=============================================================================== #==PROCEDURE EscalateTLockX # Name |Descr |Parameters |Source P=_1sp_DH42_TLockX |EscalateTLockX| |set nocount on declare i integer select i=1 from DH42(TABLOCKX HOLDLOCK) where 0=1 # #=============================================================================== |
|||
4
mehfk
28.10.13
✎
07:47
|
(2) Посмотрите полный текст запроса после обработки метапарсером.
|
|||
5
Альбатрос
28.10.13
✎
10:01
|
вроде от ошибок избавился. Но похоже логика запроса страдает:
ТекстЗапроса = "INSERT INTO #tt2(f_0, f_1, f_2, f_3, f_4, f_5) |SELECT | Журнал.IDDOC, | CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME), | Журнал.DOCNO, | Журнал.SP1165, | Журнал.SP1005, | $Документ.РасходнаяКредит.Склад |FROM | _1SJOURN as Журнал WITH(NOLOCK) | INNER JOIN #tt1 as Клиенты | ON Клиенты.f_0 = Журнал.SP1165 | INNER JOIN $Документ.РасходнаяКредит as РасходнаяКредит WITH(NOLOCK) | ON РасходнаяКредит.IDDOC = Журнал.IDDOC |WHERE | Журнал.IDDOC IN (SELECT Val FROM #СЗ) // | CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME) BETWEEN #First AND ? |"; СЗ - это список значений, в нем хранятся ссылки на документы. Мне нужно, чтобы запрос отрабатывал только по этому списку. В результате не отрабатывает никак. Где я натупил? |
|||
6
Mikeware
28.10.13
✎
10:04
|
(5) запрос не может работать со списками значений - на уровне SQL списка значений просто не существует.
|
|||
7
Z1
28.10.13
✎
10:05
|
(5) вместо
глЗапросSQL.УложитьСписокОбъектов13(СЗ, "#СЗ"); пиши глЗапросSQL.УложитьСписокОбъектов(СЗ, "#СЗ"); |
|||
8
Альбатрос
28.10.13
✎
10:22
|
(6) хм... ну так вроде ж метод в таблицу СЗ конвертирует.
"Для таких случаев у объекта ODBCRecordset есть методы УложитьСписокОбъектов(Список, Таблица, ВидСправочника) и УложитьСписокОбъектов13(Список, Таблица). Список – это список или группа. После выполнения этого метода появляется таблица с именем Таблица и колонками Val, IsFolder." http://www.script-coding.com/Direct_queries.html#6. |
|||
9
Альбатрос
28.10.13
✎
10:25
|
(7) Заработало, спасибо! А в чем принципиальная разница у этих 2-х методов?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |