我有以下选择使用标量函数来获取全名的查询。我想通过使用变量消除冗余,但迄今为止没有成功。我的查询是如何在选择查询中使用变量?
select
a.Id,
a.UserName,
getFullName(a.UserName),
a.CreateTime
from DataTable;
我不想检索'a.User'两次。我宁愿如果我可以将a.User保存在变量中,然后将其传递给函数,从而提高效率。
目前的解决办法,我想出了是如下
select
Id,
UserName,
getFullName(UserName),
CreateTime
from (select a.Id, a.UserName, a.CreateTime from DataTable) temp
这解决了性能问题,但增加的开销写入相同选择两个时间。任何其他建议都会很棒。
数据表看起来像这样
+----+----------+------------+
| Id | UserName | CreateTime |
+----+----------+------------+
| 1 | ab | 10:00 |
| 2 | cd | 11:00 |
| 3 | ef | 12:00 |
+----+----------+------------+
这里是NamesTable用于获取全名
+----------+----------+
| UserName | FullName |
+----------+----------+
| ab | Aa BB |
| cd | Cc Dd |
| ef | Ee Ff |
+----------+----------+
这里是获取全名
Create function [dbo].[getFullName](@user varchar(150)) returns varchar(500)
as
begin
declare @Result varchar(500);
select @Result = FullName from dbo.NamesTable where UserName = @user;
return @Result;
end;
实这里的性能问题是标量函数的存在。他们是臭名昭着的表演者。那么当你将它粘在一列中时就会变得更糟。也许我们可以帮助您创建一个内联表值函数。它将更加灵活,并且一举成功。我们只需要一些关于它的功能和它使用的表结构的细节。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
咦? “解决方法”与原始查询有什么不同? –
@GordonLinoff在前面的查询中,数据列被重复选择,但是在后面的查询中,它是对投影数据的选择因此更快。 – fredzyadi