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

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

Выберите * из [dbo].[TableA]

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

Выберите * из [dbo].[@TableName]

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

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

6 ответов

Решение

Это невозможно, динамический SQL не поддерживается в функциях.

Смотрите этот вопрос SO: Выполнение динамического SQL в функции SQLServer 2005

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

Вы можете ОБЪЕДИНИТЬ ВСЕ свои таблицы и включить имя таблицы в виде столбца, а затем указать имя таблицы в качестве предиката для этого. Если вы проверите план запроса для этого примера, вы увидите, что 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'

Вы можете написать UDF CLR, который может сделать динамический SQL. Я должен был реализовать это раньше. Это довольно гладко.

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

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

Другие вопросы по тегам