Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сквозной запрос с параметром / 8 сообщений из 8, страница 1 из 1
03.10.2007, 19:31
    #34844997
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
Выполняю некий скрипт на SQL:
Код: plaintext
1.
2.
3.
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
работает.
пробую тоже самое, только с параметром:
Код: plaintext
1.
2.
3.
4.
5.
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
получаю ошибку:
Код: plaintext
Invalid object name '#CurDocsRefs'
Какя тут ошибка? Большое спасибо!
...
Рейтинг: 0 / 0
03.10.2007, 20:49
    #34845077
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
пробую тоже самое, только с параметром:
Сильно ошибаетесь, совсем не то же самое.

Код: plaintext
SELECT * INTO #CurDocsRefs FROM DocsRefs
Код: plaintext
SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=?lnDocId

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

Код: plaintext
1.
2.
SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDocsRefs') IS NOT NULL DROP TABLE #CurDocsRefs ]+;
[SELECT * INTO #CurDocsRefs FROM DocsRefs ]+;
[SELECT * FROM #CurDocsRefs],[Cur01])
...
Рейтинг: 0 / 0
04.10.2007, 09:34
    #34845627
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
стиль, который облегчает разработку


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
	здесь ловим ошибку   
 
...
Рейтинг: 0 / 0
04.10.2007, 09:50
    #34845677
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
Дело в том, что при использовании параметра в сквозном запросе, на сервер будет посылаться команда вида:
Код: plaintext
1.
exec sp_executesql N'SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=@P1 ',N'@P1 float', 1 
Т.е. ваша временная таблица будет создана через хранимую процедуру sp_executesql и соответственно удалится после окончания работы этой хранимой процедуры (sp_executesql)
Решение:
1. Не используйет параметра:
Вместо
Код: plaintext
SQLEXEC(_Screen.nCon_DATD,[SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=?lnDocId])
можно так:
Код: plaintext
1.
2.
3.
4.
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 и заполняйте ее через команду
Код: plaintext
1.
INSERT INTO #CurDocsRefs  SELECT * FROM DocsRefs WHERE doc_id=?lnDocId
С уважением, Алексей
...
Рейтинг: 0 / 0
04.10.2007, 10:32
    #34845834
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
Aleksey-KДело в том, что при использовании параметра в сквозном запросе, на сервер будет посылаться команда вида:
Код: plaintext
1.
exec sp_executesql N'SELECT * INTO #CurDocsRefs FROM DocsRefs WHERE doc_id=@P1 ',N'@P1 float', 1 
Т.е. ваша временная таблица будет создана через хранимую процедуру sp_executesql и соответственно удалится после окончания работы этой хранимой процедуры (sp_executesql)
Моё решение было следующим:
Код: plaintext
1.
2.
3.
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)))
в даном случае всё работает нормально.
Почему этот вариант работает, а предыдущий нет? Проблема как бы решена, но вопрос всё равно открыт.
...
Рейтинг: 0 / 0
04.10.2007, 10:40
    #34845873
Сквозной запрос с параметром
Почему этот вариант работает, а предыдущий нет?
Ну Aleksey-K же уже объяснил! Созданное в одном батче не видно в другом. Так как временная таблица при применении параметра создается внутри хранимой процедуры, то при выход из этой процедуры она уничтожается. Сказано же - объединяйте такие команды в один запрос и тогда и с параметром будет работать
...
Рейтинг: 0 / 0
04.10.2007, 14:48
    #34846960
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сквозной запрос с параметром
Еще раз объясняю!
Когда вы используете параметры, ваш запроса отсылается на сервер и выполняется не напрямую, как в первом варианте, а через вызов специальной хранимой процедуры sp_executesql, куда в качестве параметра передается сам запрос и ваш параметр. Ваш запрос создает временный объект (таблицу #CurDocsRefs), но областью ее определения является не коннект, как в первом варианте, а хранимая процедуры sp_executesql. Как только эта хранимая процедуры закончит работу, ваша временная таблица будет удалена. Локальные временный объеткы (которые начинаются с символа # ) "живут" до тех пор, пока код не выйдет из области их определения. Создали в коннекте - до закрытия коннекта. Создали в хранимой процедуре - до конца работы хранимой процедуры.
Для того, чтобы в этом убедится, запустите SQL Prfiler и посмотрите, что уходит на сервер в первом и во втором случае.
С уважением, Алексей
P.S. Кстати, "проходящий" тут немного ошибается. Batch (пакет) тут не причем. Если я сначала создам в одном пакете временную таблицу (через одну команду SQLEXEC), то нормально могу ее использовать из других batch (из других SQLEXEC), но до тех пор пока не покину ее Scope - область определения. В данном случаем - коннект. Ну или, конечно явно ее не удалю (DROP...)
...
Рейтинг: 0 / 0
04.10.2007, 15:42
    #34847173
Сквозной запрос с параметром
Ну да, не совсем корректно выразился. Пардон.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сквозной запрос с параметром / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]