缓存的函数列

发布于 2024-10-17 20:44:19 字数 702 浏览 5 评论 0原文

看起来 UDF 中的 select * 很危险。考虑这个脚本:

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 * 但可以防止这个问题吗?谢谢。

It looks like select * in a UDF is dangerous. Consider this script:

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

You will get two result sets, both with the same number of columns, even though I added col3. If the table is recreated an an extra column is inserted in the middle, everything will shift one column over, showing the data under the wrong column name. In other words, the columns will stay the same, but the data has an extra column.

I wasn't able to find any information about this, but it seems to me the only way to avoid this is to always specify your columns in a function.

So my question is, what exactly does a UDF cache? It seems output columns are--anything else? Also, any way to still use select * but prevent this problem? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

洒一地阳光 2024-10-24 20:44:19

在第二次调用之前添加 exec sp_refreshsqlmodule 'TestFunction'。

Add exec sp_refreshsqlmodule 'TestFunction' before the second call.

如若梦似彩虹 2024-10-24 20:44:19

该函数的元数据不会自动更新。运行 ALTER 语句。

The function's metadata does not automatically update. Run an ALTER statement.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文