在标量函数中使用表查找功能是否可以?

时间:2010-10-27 05:18:34

标签: sql-server tsql function

在我们的例子中,我们有一些业务逻辑以某种顺序查看几个表,因此使用了一个表中的第一个非空值。虽然查找并不难,但确实需要几行SQL代码才能完成。我已经阅读过有关SQL Server中标量值函数的内容,但不知道重新编译问题是否足以让我以不太方便的方式完成它。

那么一般的经验法则是什么?

你想要像

这样的东西吗?
select id, udfGetFirstNonNull(id), from mytable

或者表值函数是否比标量更好?

select id, 
  (select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
from myTable

3 个答案:

答案 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