我有以下選擇使用標量函數來獲取全名的查詢。我想通過使用變量消除冗餘,但迄今爲止沒有成功。我的查詢是如何在選擇查詢中使用變量?
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