Кэшированные столбцы функций - PullRequest
0 голосов
/ 16 февраля 2011

Похоже, select * в UDF опасно. Рассмотрим этот сценарий:

create table TestTable (col1 int, col2 varchar(1))
insert into TestTable values (123, 'a')
go

create function TestFunction
(
    @param1 bit
)
returns table
as
return
(
    select * from TestTable
)
go

select * from TestFunction(0)

alter table TestTable
add col3 varchar(1)

select * from TestFunction(0)

drop function TestFunction
drop table TestTable
go

Вы получите два набора результатов, оба с одинаковым количеством столбцов, хотя я добавил col3. Если таблица воссоздается, или в середину вставляется дополнительный столбец, все смещается на один столбец, показывая данные под неправильным именем столбца. Другими словами, столбцы останутся прежними, но у данных есть дополнительный столбец.

Я не смог найти никакой информации об этом, но мне кажется, что единственный способ избежать этого - всегда указывать ваши столбцы в функции.

Итак, мой вопрос, что именно делает кэш UDF? Кажется, выходные столбцы - что-нибудь еще? Кроме того, есть ли способ использовать select *, но предотвратить эту проблему? Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Добавить exec sp_refreshsqlmodule 'TestFunction' перед вторым вызовом.

1 голос
/ 16 февраля 2011

Метаданные функции не обновляются автоматически. Запустите оператор ALTER.

...