2010-10-27 28 views
1

在我们的案例中,我们有一些业务逻辑按照某个顺序查看几个表,以便使用来自一个表的第一个非空值。虽然查找并不困难,但它需要几行SQL代码才能完成。我已经阅读了SQL Server中的标量函数,但不知道重新编译问题是否影响到我以不太方便的方式进行。可以在标量函数中使用表查找功能吗?

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

你愿意有这样的事情

select id, udfGetFirstNonNull(id), from mytable 

或者是表值函数比标好些了吗?

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

回答

1

标量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 
1

你的第一个查询很好。我工作的一个地方是绝对痴迷于速度和优化,他们以这种方式大量使用UDF。

1

我认为为了可读性和可维护性,我宁愿使用标量函数,因为它就是它的返回值。

相关问题