Мой сценарий
Я работаю над базой данных, которая будет содержать множество деталей из различных хранимых процедур в разных базах данных по всему серверу. Информация, которую я сейчас пытаюсь собрать, звучит так: «Что выводит SP?»
При поиске я обнаружил, что ответ лежит в OPENROWSET. Мое первоначальное тестирование прошло успешно, и все выглядело великолепно. Однако, протестировав его с живыми SP, я столкнулся с одной серьезной проблемой: он плохо работает с временными (#) таблицами.
Например:
Если бы я взял этот SP:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
Я могу легко вставить вывод в таблицу temp (##) с помощью следующего кода, затем запросить 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 «SQLNCLI10» для связанного сервера «(null)» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.
Когда я урезаю код OPENROWSET (путем удаления динамического материала) до этого:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
Я получаю следующую (гораздо более полезную) ошибку:
Недопустимое имя объекта '#T'.
Где я ударился о стену. В моих поисках кажется, что решения нет, но я пока не мог заставить себя отказаться от него.
И поэтому я привел к ..
мой вопрос к вам
Кто-нибудь знает какой-либо возможный способ обойти эту ошибку? Или возможно есть альтернативное решение?
Этот процесс не будет выполняться часто, поэтому мне не нужно слишком беспокоиться об эффективности решения.
Мы будем очень признательны за любой вклад.
Спасибо, Зок
P.S. Извините за формат. Не совсем понял языковые теги.