2016-05-13 3 views
0

У меня есть функция скалярного значения, которая принимает целое число как один из его входных данных. Мне нужен запрос, который запускает эту функцию для набора целых чисел (1,2,3,4,5). Это то, что я сделал до сих пор:Выберите последовательные числа в виде строк, которые будут использоваться в качестве входных данных для определенной пользователем функции

SELECT dbo.MyFunction('2016-05-13', Number) 
FROM (SELECT TOP 5 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Number FROM SomeTable) AS T 

И это работает. Есть ли способ сделать это без FROM SomeTable, так как я фактически не использую никакой информации, содержащейся в таблице?

В качестве альтернативы, существует ли более чистый способ написать весь запрос?

+1

Следует отметить, что ваш текущий запрос не определен, в том случае, если 'SomeTable' содержит более 5 строк, существует * no * гарантия того, что вы действительно получите 5 строк с номерами 1-5 , –

+0

Возможно, переосмысление этого процесса было бы лучшим подходом. Вместо использования скалярной функции (которая ужасно неэффективна) вы можете переосмыслить ее как функцию встроенной таблицы, которая использует таблицу таблиц. Это было бы быстрее и гибче, чем повторять скалярную функцию снова и снова. Если вы можете поделиться содержимым своей функции, я собираюсь собрать что-то вместе, чтобы продемонстрировать. –

+0

Производительность @SeanLange на самом деле не проблема, мне просто нужно вытащить эти значения в таблицу один раз в день. Спасибо, в любом случае. – Dan

ответ

1

С SQL Server 2008, мы имеем table value constructors:

SELECT dbo.MyFunction('2016-05-13', Number) 
FROM (VALUES (1), (2), (3), (4), (5)) AS T(Number) 

Если «5» произвольное число и вам это нужно задавить любую последовательную последовательность, вам все равно придется использовать nums таблицу некоторых Сортировать. Вместо того, чтобы повторять различные методы для этого здесь, я ссылаюсь на this question и его ответы.

+0

Отлично, вот что я искал. – Dan

+0

Извиняется за этот дополнительный вопрос, но если я хочу использовать результат 'dbo.MyFunction' в предложении WHERE, нужно ли вложить его в внешний запрос? – Dan

+0

Если вы действительно хотите использовать результаты в 'WHERE', для начала используйте встроенную функцию, ориентированную на таблицу. Скалярные функции имеют ужасную производительность. В качестве дополнительного бонуса, когда вы «CROSS APPLY», они получают столбец, который легко фильтруется в 'WHERE'. –