2013-12-15 6 views
0

Я пишу хранимую процедуру (SQL Server), которая получает строковый аргумент, который представляет имя другой хранимой процедуры. Эта строка также содержит все сохраненные параметры, поэтому для ее запуска мне просто нужно написать EXEC @vSpCommand.Вставка результата динамической хранимой процедуры в таблицу

Теперь моя проблема: моя процедура должна иметь дело с универсальными SP, поэтому я не знаю, как будет выглядеть таблица результатов. Значит, я не знаю, сколько столбцов имеет таблица, и тип каждого столбца.

Кроме того, внутри данного SP (@vSpCommand) может быть другой динамический вызов для других сохраненных. Поэтому использование OPENROWSET не будет работать. Я пробовал следующее:

SET @vSpCommand = REPLACE(@vSpCommand,'''','''''') 

SET @vCmd = 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable'[email protected]+']'') AND type in (N''U'')) 
DROP TABLE TA_SpTable'[email protected]+' SELECT * INTO TA_SpTable'+ @vExecId+' FROM OPENROWSET(''SQLOLEDB'', ''Server=SERVERNAME,3180;Trusted_Connection=Yes'', 
''EXEC '[email protected]+ ''')' 

EXEC (@vCmd) 

Без каких-либо успехов.

Вопрос в том, как вставить этот результат SP в таблицу?

Если это невозможно, решение предпочтительнее в SQL, иначе использование .NET CLR также возможно.

+0

Что вы хотите делать с этими строками, возвращаемыми вашим SP? –

+0

Сохраните его в таблице, а затем выполните другой заданный SP, который будет работать на этой таблице. – Yuval

ответ

0

Превратите SP в функцию затем использовать SELECT INTO заявления:

CREATE FUNCTION MyFunction() 
RETURNS TABLE 
AS 
RETURN SELECT 'a' as A, 'b' as B 
GO 

SELECT * 
INTO MyTable 
FROM MyFunction() 
GO 

SELECT * FROM MyTable 
GO 
+0

FYI: Вы не можете использовать Dynamic SQL в функции. – RBarryYoung

0

Вы должны установить специальное разрешение в базе данных, прежде чем выполнить этот

sp_configure 'show advanced options', 1; 
RECONFIGURE; 
sp_configure 'Ad Hoc Distributed Queries', 1; 
RECONFIGURE; 
GO 

Попробуйте это, то же самое как вы пытались, но некоторые изменения в коде. Вы можете легко получить его.

DECLARE @vSpCommand NVARCHAR(500),@vCmd NVARCHAR(4000) 

SET @vSpCommand = Replace('TestDB.dbo.spg_GetNames', '''', '''''') 
SET @vCmd = 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TA_SpTable]'') AND type in (N''U'')) 
        DROP TABLE TA_SpTable' 
      + ' select a.* into TA_SpTable from openrowset(''SQLNCLI'',''Server=.;Trusted_Connection=yes;'',''SET NOCOUNT ON;SET FMTONLY OFF; exec '+ @vSpCommand +''') AS a' 

PRINT @vCmd 
EXEC (@vCmd) 

select * from TA_SpTable 

Просто отметьте, что я использовал SP «spg_GetNames» из базы данных «TestDB». Вы можете вносить любые изменения в код и прокомментировать, если требуется какая-либо помощь.

+0

Ty, но он по-прежнему не работает: я получаю - Msg 11514, уровень 16, состояние 1, процедура sp_describe_first_result_set, строка 1 Метаданные не могут быть определены, поскольку выражение 'EXEC (@execStr)' в процедуре «Имя_схемы» содержит динамический SQL , Рассмотрите возможность использования предложения WITH RESULT SETS, чтобы явно описать набор результатов. – Yuval

+0

Я редактировал сообщение, теперь вы можете это сделать. Просто проверьте это. – Anoop

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