在我们的例子中,我们有一些业务逻辑以某种顺序查看几个表,因此使用了一个表中的第一个非空值。虽然查找并不难,但确实需要几行SQL代码才能完成。我已经阅读过有关SQL Server中标量值函数的内容,但不知道重新编译问题是否足以让我以不太方便的方式完成它。
那么一般的经验法则是什么?
你想要像
这样的东西吗?select id, udfGetFirstNonNull(id), from mytable
或者表值函数是否比标量更好?
select id,
(select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
from myTable
答案 0 :(得分:1)
您的第一个查询没问题。我工作的一个地方绝对痴迷于速度和优化,他们以这种方式大量使用UDF。
答案 1 :(得分:1)
我认为为了可读性和可维护性,我更愿意使用标量函数,因为它正在返回。
答案 2 :(得分:1)
标量udf将查找myTable中的每一行,随着数据的增加,该行可以以指数方式运行。实际上你有一个游标。如果你有几行,那当然没关系。
我自己也这样做,我不期望有很多行(超过几百个)。
但是,我会考虑一个表值函数,我在这里放置了“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