powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вызов процедуры через openrowset
4 сообщений из 4, страница 1 из 1
Вызов процедуры через openrowset
    #32032169
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При запуске из 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.
...
Рейтинг: 0 / 0
Вызов процедуры через openrowset
    #32032174
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер, 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 --

Удачи Вам
...
Рейтинг: 0 / 0
Вызов процедуры через openrowset
    #32032175
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение: говоря о том, что та же проблема наблюдается и с постоянными таблицами, я имею ввиду, что процедура _test вначале создает постоянную таблицу, а перед окончанием работы уничтожает, разумеется.
...
Рейтинг: 0 / 0
Вызов процедуры через openrowset
    #32032186
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Спасибо, 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 и т.д.)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вызов процедуры через openrowset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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