Использование переменной для имени таблицы в предложении «From» в SQL Server 2008 - PullRequest
5 голосов
/ 12 июня 2009

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

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

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

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

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

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

Ответы [ 6 ]

21 голосов
/ 13 июня 2009
SET @SQL = 'SELECT * FROM ' + @table
EXEC (@SQL)  -- parentheses are required
7 голосов
/ 12 июня 2009

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

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

5 голосов
/ 13 июня 2009

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

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

0 голосов
/ 13 июня 2009

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

0 голосов
/ 13 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...