Как обработать результаты процедуры, которая возвращает более одного набора данных?

Ramzay_
Дата: 23.01.2013 17:56:06
Существует процедура. Она возвращает три набора данных.
Картинка с другого сайта.

Нужно извлечь средствами SQL первый набор данных. Например, вставить этот набор данных во временную таблицу.
Гавриленко Сергей Алексеевич
Дата: 23.01.2013 18:04:14
Не выйдет.
invm
Дата: 23.01.2013 18:22:24
Первый можно:
use tempdb;
go

create procedure dbo.spTest
as
begin
 set nocount on;
 
 select 1 as f1;
 
 select 1 as f1, 2 as f2;
end;
go

exec dbo.spTest;

declare @t table (f1 int);
insert into @t (f1)
 select f1 from openrowset('SQLNCLI', 'Server=.;Trusted_connection=yes;', 'exec tempdb.dbo.spTest;');
 
select * from @t;
go

drop procedure dbo.spTest;
go
Гость333
Дата: 23.01.2013 18:25:08
invm,

А если сервер не "." ?
invm
Дата: 23.01.2013 18:30:48
Гость333
invm,

А если сервер не "." ?
declare @s varchar(max) = 'select f1 from openrowset(''SQLNCLI'', ''Server=' + @@servername + ';Trusted_connection=yes;'', ''exec tempdb.dbo.spTest;'')';
declare @t table (f1 int);
insert into @t (f1)
 exec(@s);
Ramzay_
Дата: 23.01.2013 20:25:20
invm,
Да, все так. Твой пример проходит. Вся фишка, как я понял в функции openrowset.

Пробую запустить свою процедуру через эту функцию:

select * from openrowset('SQLNCLI', 'Server=.;Trusted_connection=yes;', 'exec dbo.sc_Treaty_CalcReserve23 @DayDate = 41270 , @SystemId = 5000 , @KindId = 19 , @UseSubKinds = 1 , @CurrencyTag = ''*'' , @BranchId = NULL , @ClientId = 163936 , @GroupId = NULL , @StateFlag = 12 , @OutMode = 0 , @CalculationMode = 0 , @CalculationId = NULL;'); 


Возвращает ошибку:
Сообщение 7357, уровень 16, состояние 2, строка 29
Cannot process the object "exec dbo.sc_Treaty_CalcReserve23 @DayDate = 41270 , @SystemId = 5000 , @KindId = 19 , @UseSubKinds = 1 , @CurrencyTag = '*' , @BranchId = NULL , @ClientId = 163936 , @GroupId = NULL , @StateFlag = 12 , @OutMode = 0 , @CalculationMode = 0 , @CalculationId = NULL;". 

The OLE DB provider "SQLNCLI" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.



Права на процедуру для public - разрешено выполнение.
Если просто выполняю процедуру через exec dbo.sc_Treaty_CalcReserve23 ... зайдя через Trusted_connection, то процедура выполняется.
Пробовал сервер прописывать и как в твоем примере и руками явно (имя сервера SQL2005) - ошибка таже.
Может подскажешь в чем дело? Куда посмотреть, где поискать? И что это за Linked server такой NULL?
Crimean
Дата: 23.01.2013 21:01:30
Ramzay_
что это за Linked server такой NULL?


а у вас случаем select @@servername null не возвращает? если да - исправляйтесь
Гость333
Дата: 24.01.2013 10:06:11
Ramzay_,

Так попробуйте:
select * from openrowset('SQLNCLI', 'Server=.;Trusted_connection=yes;', 'exec ИмяБазы.dbo.sc_Treaty_CalcReserve23 @DayDate = 41270 , ...;'); 
Ramzay_
Дата: 24.01.2013 12:56:59
select @@servername - возвращает SQL2005 ( как это и должно быть)

Пробовал указывать имя сервера в запросе - результат не изменлся.

-------------------------------------------------------------------------

Дело, похоже, не в процедуре, дело похоже в базе данных.

Тот пример, который привел invm выполняется только на базе tempdb.

На рабочей (или на тестовой базе) пример выдает ту же ошибку.

Возможно, нужно изменить какие-то настройки базы... Если у кого есть мысли - подскажите.
mike909
Дата: 24.01.2013 13:20:44
Ramzay_,

А если так:
CREATE PROCEDURE [dbo].[test] 
AS
BEGIN
  SET NOCOUNT ON;
  SELECT 1 as [X] UNION ALL SELECT 2
  SELECT 1 as [X], 2 as [Y]
  SELECT 1 as [X], 2 as [Y], 3 as [Z]
END
GO

declare @t table (id int identity(1,1), Line nvarchar(180) )

insert into @t( Line )
exec xp_cmdshell 'sqlcmd -S LocalHost -Q "exec test.dbo.test"'

SELECT *
from @t

Ну а дальше дело техники...