2013-07-25 3 views
0

У меня возникла проблема с использованием SELECT конкретных столбцов из инструкции EXEC в хранимой процедуре. Я пытаюсь найти COUNT(*), что хранимая процедура возвращает, которую я успешно делают с:ВЫБОР конкретных столбцов из хранимой процедуры EXEC

INSERT INTO #temp 
EXEC dbo.my_sp 
SET @count = (SELECT COUNT(*) FROM #temp) 
DELETE FROM #temp 

Однако это работает только в том случае, если столбцы вернулся матч именно с колонок таблицы и так как я пытаюсь найти количество из многих различных хранимых процедур (каждый из которых возвращает разные столбцы), я не могу использовать этот метод, не создавая новую таблицу для каждой хранимой процедуры.

Есть ли способ я могу SELECT конкретные столбцы от EXEC dbo.my_sp?

ответ

1

Будет ли @@ ROWCOUNT работать на вас?

if OBJECT_ID('SomeProc') is null 
    exec ('create procedure dbo.SomeProc as select 1 as SomeValue union all select 2 as SomeValue;') 

exec dbo.SomeProc 

Select @@ROWCOUNT as RowsAffected 

http://technet.microsoft.com/en-us/library/ms187316(v=sql.105).aspx

+0

Это работает для меня. Но теперь каждый вызов 'exec' фактически возвращает данные, которых раньше не было. Я использую 'EXEC dbo.my_sp1' ' SET @ value1 = (SELECT @@ ROWCOUNT) ' ' EXEC dbo.my_sp2' 'SET @ значение2 = (SELECT @@ ROWCOUNT)' ' ВЫБРАТЬ @ value1, @ value2' Я хочу только два значения, а не значения из' exec' – AToya

+0

Что конечный результат хранимой процедуры ? Используете ли вы возвращаемые данные? –

+0

Он возвращает строки данных, которые мне нужны для других целей. И на данный момент, я хочу подсчитать, сколько строк возвращается – AToya

3

Создайте связанный loopback-сервер с локальным экземпляром, чтобы обеспечить доступ к данным. Допустим, у вас есть локальный именованный экземпляр под названием YourServer\SQL2008:

USE [master]; 
GO 
EXEC sp_addlinkedserver 
    @server  = N'LoopbackLocal', 
    @srvproduct = N'', 
    @provider = N'SQLNCLI', 
    @datasrc = N'.\SQL2008', 
    @catalog = N'tempdb'; 
GO 

EXEC sp_serveroption 
    @server = N'LoopbackLocal', 
    @optname = N'collation compatible', 
    @optvalue = N'true'; 
GO 

EXEC sp_serveroption 
    @server = N'LoopbackLocal', 
    @optname = N'data access', 
    @optvalue = N'true'; 
GO 

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname = N'LoopbackLocal', 
    @locallogin = NULL , 
    @useself = N'True'; 
GO 
-- you may need to configure other security here 

Затем вы можете использовать OPENQUERY для запуска хранимой процедуры, как если бы это был специальный запрос.

SELECT COUNT(*) 
    FROM OPENQUERY 
    (
    LoopbackLocal, 
    'EXEC dbo.my_sp' 
) AS y; 

Теперь, если dbo.my_sp отвалов информации в таблицу #temp первых, вы будете не иметь проблемы, так как он больше не является блоком кода, который может обрабатывать OPENQUERY. Например, если вы попытаетесь выполнить sp_who2 таким образом, по крайней мере, в SQL Server 2012 вы получите сообщение об ошибке sp_describe_first_result_set, которое OPENQUERY было изменено для использования (так что, возможно, это работает для вас сейчас, у меня нет теста 2008 года , но это будет проблемой, когда-нибудь):

Msg 11526, уровень 16, состояние 1, процедура sp_describe_first_result_set, строка 1
метаданные не могут быть определены, потому что ... использует временную таблицу.

Если вы собираетесь делать это много, почему бы не сделать специализированные хранимые процедуры (или добавить параметры к ним), чтобы возвращался только счет?

+0

Я вижу эту работу, однако у меня нет разрешения на выполнение этой задачи (я не работаю из дома, так это то, что я, к сожалению, не могу исправить/изменить). Также я не буду выполнять задачу много, поэтому я хотел бы сохранить процесс в одной простой хранимой процедуре, если это возможно. – AToya

+0

Есть ли способ сделать это, когда процедура использует временную таблицу? SQL 2012 дает ошибку о том, что sp_describe_first_result_set не работает с procs, используя хранилище temp table. Редактировать: nevermind, просто видел ваше редактирование! –

+0

@KevinDahl Я так не думаю, кажется, что «OPENQUERY» был изменен, чтобы использовать эти новые процедуры внутри, и это известное ограничение с ними ('OPENROWSET()' не работает одинаково). –

 Смежные вопросы

  • Нет связанных вопросов^_^