可以在标量函数中使用表查找功能吗?
问题描述:
在我们的案例中,我们有一些业务逻辑按照某个顺序查看几个表,以便使用来自一个表的第一个非空值。虽然查找并不困难,但它需要几行SQL代码才能完成。我已经阅读了SQL Server中的标量函数,但不知道重新编译问题是否影响到我以不太方便的方式进行。可以在标量函数中使用表查找功能吗?
那么一般的经验法则是什么?
你愿意有这样的事情
select id, udfGetFirstNonNull(id), from mytable
或者是表值函数比标好些了吗?
select id,
(select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
from myTable
答
标量udf将查找myTable中的每一行,随着数据的增加,它可以呈指数级增长。实际上你有一个CURSOR。如果你有几行,那当然没有关系。
我自己也是这样做,我不希望有很多行(超过几百)。
但是,我会考虑一个表值函数,我在这里放置了“foo”。 “foo”也可以是UDF中的CTE(未测试):
select id,
(select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
from
myTable M
JOIN
(SELECT value, id as firstNonNull
FROM OtherTable
WHERE value IS NOT NULL
GROUP BY id
ORDER BY value) foo ON M.id = foo.id
答
你的第一个查询很好。我工作的一个地方是绝对痴迷于速度和优化,他们以这种方式大量使用UDF。
答
我认为为了可读性和可维护性,我宁愿使用标量函数,因为它就是它的返回值。