Похоже, 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 *
, но предотвратить эту проблему? Спасибо.