DECLARE @tmp TABLE( id int, title varchar(50) )
INSERT INTO @tmp
EXEC proc1
SELECT * FROM @tmp
Обработка результата хранимой процедуры
Собственно уже спортивный интерес. Писал вчера скрипучий скрипт, который берет всех юзеров, у которых нет логинов, ну и собственно генерирует для каждого логин. БД: MS SQL Server 2000. Так вот в чем прикол... Для того, чтобы получить список юзеров, у которых нет логина, выполняю хранимку sp_change_users_login 'report', '', ''. Она возвращает результат в виде таблицы в два столбца - Username & SID. Так вот. Задача для этого результата объявить курсор, ну и пробежать в цикле, создавая логины. Так вот при объявлении курсора этот результат не воспринимается как таблица. Соответственно не работает. Сделали так - просто из хранимки выдрали текст нужного запроса, объявили курсор. Все норм. Но вот из спортивного интереса хотелось бы узнать, возможно ли "сконвертировать" результат хранимки в таблицу? например временную...
Цитата: Washington
...
Код:
где proc1:
Код:
CREATE PROCEDURE [dbo].[proc1]
AS
BEGIN
SELECT id, title FROM t1
END
AS
BEGIN
SELECT id, title FROM t1
END
а я так и думал, что надо копать в сторону переменной типа табле.
гм. попробовал. сказало, мол нельзя в качестве источника данных для переменной использовать EXEC. :-/
Цитата: Washington
гм. попробовал. сказало, мол нельзя в качестве источника данных для переменной использовать EXEC. :-/
Да, действительно это фича 2005го сервера - добавлять данные через EXEC/EXECUTE в переменную-таблицу, но для добавления в обычную или временную таблицу способ работает.
а вот не сработало. Terminating this procedure. Cannot have an open transaction when this is run
Цитата: Washington
а вот не сработало. Terminating this procedure. Cannot have an open transaction when this is run
(Жабер жабером, конечно)
Предложение вида
INSERT INTO MyTable EXEC proc @param1, @param2
создает пользовательскую транзакцию
Тогда как в теле sp_change_users_login есть интересные строки:
Код:
-- ERROR IF IN USER TRANSACTION --
if @@trancount > 0
begin
raiserror(15289,-1,-1)
return (1)
end
if @@trancount > 0
begin
raiserror(15289,-1,-1)
return (1)
end