У меня есть следующий запрос выбора, который использует скалярную функцию для получения полного имени. Я хочу исключить избыточность, используя переменную, но до сих пор нет успеха. Мой запрос:Как использовать переменные в выбранном запросе?
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
Это решает проблему производительности, но добавляет накладные расходы, чтобы написать же выбрать два времени. Любые другие предложения были бы замечательными.
DataTable выглядит следующим образом
+----+----------+------------+
| 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