Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Сквозной запрос с параметром  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Выполняю некий скрипт на SQL:
SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs])
SQLEXEC(_Screen.nCon_DATD,[SELECT * INTO #CurDocsRefs FROM DocsRefs])
SQLEXEC(_Screen.nCon_DATD,[SELECT * FROM #CurDocsRefs],[Cur01])
BROWSE
работает.
пробую тоже самое, только с параметром:
LOCAL lnDocId
lnDocId=49
SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs])
SQLEXEC(_Screen.nCon_DATD,[SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=?lnDocId])
SQLEXEC(_Screen.nCon_DATD,[SELECT * FROM #CurDocsRefs],[Cur01])
BROWSE
получаю ошибку:
Invalid object name '#CurDocsRefs'
Какя тут ошибка? Большое спасибо!
3 окт 07, 19:31    [4751898]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
пробую тоже самое, только с параметром:

Сильно ошибаетесь, совсем не то же самое.

SELECT * INTO #CurDocsRefs FROM DocsRefs
SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=?lnDocId

Какя тут ошибка?

Та самая, которая написана. Временная таблица не найдена. Вы уверены, что doc_id=49 существует?
Кстати, все три SQLEXEC можно легко объединить в один.

SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs ]+;
[SELECT * INTO #CurDocsRefs FROM DocsRefs ]+;
[SELECT * FROM #CurDocsRefs],[Cur01])
3 окт 07, 20:49    [4752052]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
прошелмимо
Guest
стиль, который облегчает разработку


local lcSqlCmd
text to lcSqlCmd noshow pretext 7
	IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs
	SELECT * INTO #CurDocsRefs FROM DocsRefs 
	SELECT * FROM #CurDocsRefs],[Cur01]
endtext
if sqlexec(lnConnection, lcSqlCmd, "SqlResult")>0
    ...
else
	здесь ловим ошибку   
 
4 окт 07, 09:34    [4752911]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Дело в том, что при использовании параметра в сквозном запросе, на сервер будет посылаться команда вида:
exec sp_executesql N'SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=@P1 ',N'@P1 float',1
Т.е. ваша временная таблица будет создана через хранимую процедуру sp_executesql и соответственно удалится после окончания работы этой хранимой процедуры (sp_executesql)
Решение:
1. Не используйет параметра:
Вместо
SQLEXEC(_Screen.nCon_DATD,[SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=?lnDocId])
можно так:
LOCAL lcCommand
TEXT TO lcCommand TEXTMERGE NOSHOW PRETEXT 15
   SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=<<lnDocId>>
ENDTEXT
SQLEXEC(_Screen.nCon_DATD, m.lcCommand)
2. Создайте временную таблицу в коннекте отдельной SQLEXEC и заполняйте ее через команду
INSERT INTO #CurDocsRefs  SELECT * FROM DocsRefs WHERE doc_id=?lnDocId
С уважением, Алексей
4 окт 07, 09:50    [4753015]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Aleksey-K
Дело в том, что при использовании параметра в сквозном запросе, на сервер будет посылаться команда вида:
exec sp_executesql N'SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=@P1 ',N'@P1 float',1
Т.е. ваша временная таблица будет создана через хранимую процедуру sp_executesql и соответственно удалится после окончания работы этой хранимой процедуры (sp_executesql)

Моё решение было следующим:
LOCAL lnDocId    
    lnDocId=49    
    SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs])    
    SQLEXEC(_Screen.nCon_DATD,[SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=]+ALLTRIM(STR(lnDocId)))
в даном случае всё работает нормально.
Почему этот вариант работает, а предыдущий нет? Проблема как бы решена, но вопрос всё равно открыт.
4 окт 07, 10:32    [4753324]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
проходящий.
Guest
Почему этот вариант работает, а предыдущий нет?

Ну Aleksey-K же уже объяснил! Созданное в одном батче не видно в другом. Так как временная таблица при применении параметра создается внутри хранимой процедуры, то при выход из этой процедуры она уничтожается. Сказано же - объединяйте такие команды в один запрос и тогда и с параметром будет работать
4 окт 07, 10:40    [4753396]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Еще раз объясняю!
Когда вы используете параметры, ваш запроса отсылается на сервер и выполняется не напрямую, как в первом варианте, а через вызов специальной хранимой процедуры sp_executesql, куда в качестве параметра передается сам запрос и ваш параметр. Ваш запрос создает временный объект (таблицу #CurDocsRefs), но областью ее определения является не коннект, как в первом варианте, а хранимая процедуры sp_executesql. Как только эта хранимая процедуры закончит работу, ваша временная таблица будет удалена. Локальные временный объеткы (которые начинаются с символа # ) "живут" до тех пор, пока код не выйдет из области их определения. Создали в коннекте - до закрытия коннекта. Создали в хранимой процедуре - до конца работы хранимой процедуры.
Для того, чтобы в этом убедится, запустите SQL Prfiler и посмотрите, что уходит на сервер в первом и во втором случае.
С уважением, Алексей
P.S. Кстати, "проходящий" тут немного ошибается. Batch (пакет) тут не причем. Если я сначала создам в одном пакете временную таблицу (через одну команду SQLEXEC), то нормально могу ее использовать из других batch (из других SQLEXEC), но до тех пор пока не покину ее Scope - область определения. В данном случаем - коннект. Ну или, конечно явно ее не удалю (DROP...)
4 окт 07, 14:48    [4755386]     Ответить | Цитировать Сообщить модератору
 Re: Сквозной запрос с параметром  [new]
проходящий.
Guest
Ну да, не совсем корректно выразился. Пардон.
4 окт 07, 15:42    [4755817]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить