Использование OPENROWSET для динамического получения результатов SP, когда SP содержит # временных таблиц

Мой сценарий

Я работаю над базой данных, которая будет содержать много деталей из различных хранимых процедур в разных базах данных по всему серверу. Сейчас пытаюсь собрать: «Что выводит SP?»

При поиске я обнаружил, что ответ лежит в OPENROWSET. Мое первоначальное тестирование было успешным, и все выглядело отлично. Однако после тестирования его с живыми SP Я столкнулся с одной серьезной проблемой: он плохо работает с таблицами temp (#).

Например:

Если бы я взял этот SP:

CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B

, я мог бы легко вставить вывод во временные (#) таблицы. ##) со следующим кодом, затем запросите sysobjects tempdb и создайте список столбцов и их типов данных:

IF OBJECT_ID('tempdb.dbo.##TempOutput','U') IS NOT NULL DROP TABLE ##TempOutput

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * 
               INTO ##TempOutput
               FROM OPENROWSET(''SQLNCLI'', ''Server=' + 
        CONVERT(VARCHAR(100), SERVERPROPERTY('MachineName')) +
                             ';Trusted_Connection=yes;'', ''SET FMTONLY OFF exec ' + 
                               DB_NAME() + 
                              '.dbo.zzTempSP @A=1, @B=2'')'
EXEC(@sql)

SELECT *
FROM ##TempOutput

Отлично! Однако, если бы вместо этого был SP:

CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)

INSERT INTO dbo.#T
SELECT   @A AS A, @B AS B

SELECT *
FROM dbo.#T

Когда я выполняю то же самое Код OPENROWSET , как и раньше. Я получаю следующую ошибку:

Не удается обработать объект «SET FMTONLY OFF exec DatabaseName.dbo.zzTempSP @ A = 1, @ B = 2». OLE DB p rovider «SQLNCLI10» для связанного сервера «(null)» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.

Когда я сокращаю код OPENROWSET (удаляя динамический материал) до следующего:

SELECT   *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
                          'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
              )

Я получаю следующую (гораздо более полезную) ошибку:

Недопустимое имя объекта '#T'.

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

Итак, я пришел к ..

Мой вопрос к вам

Кто-нибудь знает какой-либо способ обойти эту ошибку? Или, возможно, есть альтернативное решение?

Этот процесс будет выполняться нечасто, поэтому мне не нужно слишком беспокоиться об эффективности решения.

Мы будем благодарны за любой вклад.

Спасибо, Зок

PS: Извините за форматирование. Я не совсем понял языковые теги.

10
задан Clockwork-Muse 19 October 2011 в 21:37
поделиться