
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
08.06.2002, 21:45:39
|
|||
|---|---|---|---|
Вызов процедуры через openrowset |
|||
|
#18+
При запуске из QA вываливается ошибка Server: Msg 208, Level 16, State 1, Line 1 Invalid object name '#t'. select * from OPENROWSET('SQLOLEDB','myServer';'sa';'', 'exec myDb.._test') a Вот текст процедуры _test: CREATE PROCEDURE _test AS create table #t(i int) select * from #t Очевидно, просто exec myDb.._test отрабатывает нормально. Выглядит так как будто процедура не видит создаваемой временной таблицы (ошибка происходит именно на селекте!) Где же грабли? P.S. Я наблюдал это на SQL 7.0 SP3, SQL 7.0 SP4, SQL 2000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.06.2002, 02:04:52
|
|||
|---|---|---|---|
Вызов процедуры через openrowset |
|||
|
#18+
Добрый вечер, maximf Дело в том, что MS SQL Server запрашивает метаданные прежде, чем запросить набор записей от процедуры (_test). Для этого используется вызов процедуры после установки опции FMTONLY (SET FMTONLY ON). Естественно, что так как объекта нет, то метаданные будут отсутствовать. Кстати, это справедливо и для постоянных таблиц (попробуйте заменить создание временной таблицы на постоянную – эффект будет тот же). Родственные проблемы описаны в документах: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q297368, http://support.microsoft.com/default.aspx?scid=kb;en-us;Q294141 Что касается решения – таблица должна существовать до вызова процедуры. Либо использовать переменные типа ‘таблица’. -- start sample code -- CREATE PROCEDURE _test AS set nocount on – крайне важная строка declare @t table (i int) insert @t values (666) select * from @t -- end sample code -- Удачи Вам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.06.2002, 02:11:20
|
|||
|---|---|---|---|
Вызов процедуры через openrowset |
|||
|
#18+
Дополнение: говоря о том, что та же проблема наблюдается и с постоянными таблицами, я имею ввиду, что процедура _test вначале создает постоянную таблицу, а перед окончанием работы уничтожает, разумеется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.06.2002, 15:53:38
|
|||
|---|---|---|---|
Вызов процедуры через openrowset |
|||
|
#18+
Добрый день! Спасибо, jimmers, за подробный ответ! Как я понял способа выполнить select * from OPENROWSET('SQLOLEDB','myServer';'sa';'', 'exec myDb.._test') a в MSSQL7 нет. Для выполнения хранимой процедуры можно использовать Linked Server (exec myServer.myDb.dbo._test). Правда, для моих целей это не подходит, поскольку я хочу использовать результат хранимой процедуры как источник данных в from. Я пишу утилиту, которая сравнивает данные исполнения двух запросов, для автоматизации тестирования сложных отчётов. Упрощённо говоря, resultsetCompare 'exec test', 'exec test2' возвращает различия в возвращаемых процедурами рекордсетах. Для решения этой задачи надо узнавать метаданные для возвращаемых процедурами рекордсетов. Я делал это с помощью select * into ##t from OPENROWSET('SQLOLEDB','myServer';'sa';'', 'exec myDb.._test') a, и далее исследовал структуру ##t. Единственный способ обойти эту проблему использовать каккой-то клиентский интерфейс для получения метаданных (ADO, JDBC и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&tablet=1&tid=1822440]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
284ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 224ms |
| total: | 599ms |

| 0 / 0 |
