Иметь табличную функцию в таблице возврата T-SQL с переменным количеством столбцов

Возможно ли, чтобы функция T-SQL, возвращающая табличное значение, возвращала таблицу с переменным числом столбцов?
Имена столбцов могут быть просто 1, 2, …, n.

Прямо сейчас у меня есть функция "разделения строк", которая возвращает таблицу 1 x n с одним столбцом, а затем я поворачиваю таблицу к таблице n x 1, но я бы предпочел упростить процесс, возвращая правильный формат таблицы для начала.

Я намерен использовать для этой функции процедуру CLR на C#, я просто не знаю, как настроить определяемую пользователем функцию, чтобы она возвращала мои данные в нужном мне формате: с переменным количеством столбцов, в зависимости от входной строки .


person Protector one    schedule 11.04.2011    source источник
comment
Эта функция называется Функция полиморфной таблицы (определена в SQL Standard 2016) и не поддерживается T -SQL   -  person Lukasz Szozda    schedule 18.12.2020


Ответы (1)


Невозможно вернуть нестатический набор результатов из функции с табличным значением (TVF), будь то написан на T-SQL или .NET/SQLCLR. Только хранимые процедуры могут динамически создавать набор результатов.

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

Однако в хранимой процедуре SQLCLR можно создать динамический набор результатов с помощью SqlMetaData. Пока у вас нет явной необходимости SELECT ... FROM, возможно, сработает хранимая процедура.

Конечно, вам также может сойти с рук сделать это в T-SQL, используя динамический SQL для построения оператора SELECT на основе вывода вашей функции разделения.

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

person Solomon Rutzky    schedule 11.04.2011
comment
Я знаю об использовании SqlMetaData для создания результирующего набора в хранимой процедуре CLR, но возможно ли это также для определяемой пользователем функции? - person Protector one; 12.04.2011
comment
Нет, SqlMetaData предназначен только для хранимых процедур. Как упоминалось в моем ответе, функция, независимо от языка, должна возвращать согласованный/предопределенный тип. Для функции CLR вы определяете структуру для передачи данных обратно, а также определение таблицы в декораторе функции. Ни одно из этих мест нельзя сделать динамическим. Я был бы в восторге, если бы вы могли сделать набор результатов функции динамическим, но этого просто не произойдет. - person Solomon Rutzky; 12.04.2011