Как получить доступ к набору данных в текущей области, сгенерированному вызовом хранимой процедуры в TSQL?

История проблемы

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

С другой стороны, если вы хотите сгенерировать данные с динамической компоновкой столбцов, вы, как правило, должны создавать оператор SQL динамически и выполнять его с "exec sp_executesql". Поскольку макет данных неизвестен во время выполнения, вы не можете создать временную таблицу заранее, и, оказавшись внутри оператора «exec sp_executesql», любые временные таблицы, созданные там, привязываются к этой области и исчезают при возврате вызова, поэтому гораздо сложнее получить доступ к данным (т.е. ваши возможности более ограничены).

Моя конкретная ситуация

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

Таблица создается с помощью хранимая процедура, которая динамически создает запрос, сохраняет его в переменной «@sql nvarchar (max)» и запускает ее, вызывая «exec sp_executesql @statement = @sql».

Оператор @sql был чем-то вроде «select * в #temptable from ... ", но #temptable был уничтожен к моменту возврата" exec sp_executesql ". Быстрое решение этой проблемы заключалось в том, чтобы вместо этого просто использовать "## temptable" (т.е. глобальную временную таблицу), потому что она выживает, когда хранимая процедура возвращает, и я могу легко получить к ней доступ в вызывающей области (потому что она имеет известное / статическое имя ).

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

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

Встроенные функции, возвращающие табличное значение, не подходят, потому что я запускаю циклы кода для построения запроса @sql и вызываю "exec sp_executesql ".

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

Все, что я действительно хочу сделать, это выбрать набор результатов динамического запроса в новую таблицу, но мне это трудно, так как нет из вышеперечисленных работ; особенно раздражает то, что локальные временные таблицы не являются локальными для сеанса, а являются локальными для хранимой процедуры, поэтому они исчезают при возврате.Единственное решение , которое я видел, настаивает на том, что использование OPENROWSET - единственный способ, но я не хочу связываться со строками подключения внутри моей хранимой процедуры по той же причине, по которой я не хочу включать уникальные -name-management code ... он намного сложнее, чем должен быть.

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

8
задан Community 23 May 2017 в 12:22
поделиться