Использование переменной для имени таблицы в разделе "От" в SQL Server 2008

У меня есть UDF, который запрашивает данные из таблицы. Однако таблица должна быть определена как параметр. Например, я не могу:

Выбрать * Из [dbo]. [ТаблицаA]

Мне нужно что-то вроде:

Выбрать * Из [dbo]. [@TableName]

Вышеприведенная строка не работает, а также UDF запрещает мне устанавливать запрос в виде строки и вызывать exec(). Я могу сделать это в процедуре, но я не могу вызывать процедуру из UDF.

Кто-нибудь знает, как я могу это сделать в UDF без какого-либо массового оператора switch?

Ответ 2

SET @SQL = 'SELECT * FROM ' + @table
EXEC (@SQL)  -- parentheses are required

Ответ 3

Вы можете СОЕДИНИТЬ ВСЕ ваши таблицы и включать имя таблицы в качестве столбца, а затем указывать имя таблицы как предикат. Если вы проверите план запроса для этого примера, вы увидите, что t2 не тронут

create table t1 (i int)
create table t2 (i int)

insert t1 values(1)
insert t1 values(2)
insert t1 values(3)
insert t2 values(4)
insert t2 values(5)
insert t2 values(6)


;with tableSet as (
    select i, 't1' as tableName from t1
    union all select i, 't2' as tableName from t2
)
select i from tableSet where tableName = 't1'

Ответ 4

Вы можете написать udf clr, который может выполнять динамический sql. Я должен был реализовать это раньше. Это довольно пятно.

Ответ 5

Вы не можете этого сделать. Какую проблему вы решаете, могут быть и другие решения.

Ответ 6

Если вы дадите более подробную информацию о том, какую основную проблему вы пытаетесь решить, у нас могут быть лучшие ответы. Одним из решений является создание кода для создания UDF для каждой таблицы. Другим является использование динамического SQL из SP. Какое право для вашей ситуации трудно сказать.