Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
Существует процедура. Она возвращает три набора данных.
Картинка с другого сайта.

Нужно извлечь средствами SQL первый набор данных. Например, вставить этот набор данных во временную таблицу.
23 янв 13, 17:56    [13817290]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Не выйдет.
23 янв 13, 18:04    [13817357]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Первый можно:
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
23 янв 13, 18:22    [13817461]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
invm,

А если сервер не "." ?
23 янв 13, 18:25    [13817468]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Гость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);
23 янв 13, 18:30    [13817487]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
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?
23 янв 13, 20:25    [13818012]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Ramzay_
что это за Linked server такой NULL?


а у вас случаем select @@servername null не возвращает? если да - исправляйтесь
23 янв 13, 21:01    [13818177]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ramzay_,

Так попробуйте:
select * from openrowset('SQLNCLI', 'Server=.;Trusted_connection=yes;', 'exec ИмяБазы.dbo.sc_Treaty_CalcReserve23 @DayDate = 41270 , ...;'); 
24 янв 13, 10:06    [13819719]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
select @@servername - возвращает SQL2005 ( как это и должно быть)

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

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

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

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

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

Возможно, нужно изменить какие-то настройки базы... Если у кого есть мысли - подскажите.
24 янв 13, 12:56    [13820948]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
mike909
Member

Откуда:
Сообщений: 662
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

Ну а дальше дело техники...
24 янв 13, 13:20    [13821167]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
mike909
exec xp_cmdshell 'sqlcmd -S LocalHost -Q "exec test.dbo.test"'


Так работает, но возвращает несколько наборов данных.
24 янв 13, 13:51    [13821392]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
А ларчик открывался вот так:
select * from openrowset('SQLNCLI', 'Server=;Trusted_connection=yes;', 'set NoCount on; set fmtonly off; exec eicb.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;');


Перед процедурой добавил: set NoCount on; set fmtonly off;
24 янв 13, 14:01    [13821463]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ramzay_
Перед процедурой добавил: set NoCount on; set fmtonly off

А вы знаете, что это за настройки ?
24 янв 13, 14:02    [13821479]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
Glory
А вы знаете, что это за настройки ?


NOCOUNT Запрещает вывод количества строк, на которые влияет инструкция Transact-SQL или хранимая процедура, в составе результирующего набора.


FMTONLY Возвращает клиенту только метаданные. Может использоваться для тестирования формата ответа без фактического выполнения запроса.

Если вы можете объяснить почему отрабатывает с этими параметрами - пожалуйста объясните.
24 янв 13, 14:29    [13821684]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ramzay_
FMTONLY Возвращает клиенту только метаданные.

Ну вы то как раз отключили FMTONLY. Потому что ваша процедура не может вернуть эти самые метаданные.
На что сервер вполне резонно вам и сообщает "the object has no columns ".

Ramzay_
Если вы можете объяснить почему отрабатывает с этими параметрами - пожалуйста объясните.

Потому что теперь процедура срабатывает дважды. Один раз как бы для получения метаданных, которые на самом деле будут реальными данными. А второй раз для получения результата.
24 янв 13, 14:34    [13821731]     Ответить | Цитировать Сообщить модератору
 Re: Как обработать результаты процедуры, которая возвращает более одного набора данных?  [new]
mike909
Member

Откуда:
Сообщений: 662
Ramzay_
mike909
exec xp_cmdshell 'sqlcmd -S LocalHost -Q "exec test.dbo.test"'


Так работает, но возвращает несколько наборов данных.

Я ж сказал
+ Ну а дальше дело техники...
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"'

DECLARE @RecorSetNumber int
set @RecorSetNumber = 1
--set @RecorSetNumber = 2
--set @RecorSetNumber = 3

;WITH RS as (
  SELECT ROW_NUMBER() OVER(ORDER BY id) as [RN], id + 1 as [StartLine]
  FROM (
    SELECT id
    FROM @t
    WHERE LEFT(Line, 1) = '-' 
    
    UNION ALL 
    
    SELECT COUNT(*)+1 as [id]
    FROM @t
  ) as t
) 
,RS_Range as (
  SELECT t1.RN, t1.StartLine, t2.StartLine-3 as [StopLine]
  FROM RS as t1
  INNER JOIN RS as t2 ON
    t1.RN = t2.RN -1
)
select t.Line 
from @t as t
INNER JOIN RS_Range as r on
  t.id between r.StartLine and r.StopLine
WHERE r.RN = @RecorSetNumber
24 янв 13, 14:51    [13821888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить