Я работаю с SQL Server 2008.
У меня есть пользовательская функция fn_takeTableArg, и мне нужно иметь возможность использовать ее следующим образом:
select dbo.fn_takeTableArg(<a union of multiple selects>) as MyField from MyTable
Пользовательский аргумент table:
CREATE TYPE [dbo].[TableArg] AS TABLE(
Value VARCHAR(2000),
RepOrApp CHAR
SortOrder INT
)
Функция - это что-то вроде:
CREATE FUNCTION dbo.fn_takeTableArg
(
@t [dbo].[TableArg] READONLY
)
RETURNS VARCHAR(max)
AS
... Do something over the passed in table with a with clause, etc.
Но похоже, что этого не может быть сделано поскольку я получаю "Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS". error.
Предположительно, потому что я должен сначала создать переменную таблицы temp, а затем вызвать свою функцию с этой переменной?
Но я не могу этого сделать, потому что мне нужно позвонить эта функция изнутри другого выбирает.
Я действительно сомневаюсь, что ваш подход - это лучшее, что вы можете выбрать, но чтобы ответить на ваш вопрос: сначала вы должны заполнить типизированный параметр, как и любую другую таблицу, и передать его:
UPDATE
Просто увидела ваше замечание
Существует такая хитрость: вы можете обернуть
SELECT ... FOR XML
в paranthesis и обрабатывать возвращаемый XML, похожий на скалярное значение.Внутри функции XML выглядит следующим образом:
Все имена ('sys.objects', 'name' и т. Д.) Можно контролировать с помощью псевдонимов, которые вы выберете.
Примечание
Скалярные функции плохи в производительности. Скалярная функция, связанная с XML, которая должна быть создана для каждой и любой строки, будет очень медленной ... Есть гораздо более эффективные подходы, предположительно ...
Вы можете передать значение в
scalar function
как