Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Функция для получения ФИО


Автор: Kolovorot 13.10.2010, 14:11
Только-только взялся за изучение t-sql. Написал функцию для получения ФИО. Работает как и задумывалось. Вопрос состоит в том, что можно ли её оптимизировать как-то?

Код

USE [GV_db]
GO
/****** Object:  UserDefinedFunction [dbo].[fn_GetFIO]    Script Date: 10/13/2010 14:56:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_GetFIO]
(@MomId bigint)    --@MomId - идентификатор мамы
RETURNS varchar(60)
WITH EXECUTE AS CALLER
AS
BEGIN

DECLARE @FIOresult varchar(60) = '' --конечный результат
DECLARE @Bufer varchar(30)            --промежуточный(проверяется значение null или не null).

SELECT @Bufer = Surname --Получить фамилию по идентификатор(значение может быть null).
FROM Moms
WHERE MomId = @MomId;

IF @Bufer IS NOT NULL --Если фамилия не null добавить к конечному результату.
BEGIN
SET @FIOresult = @FIOresult + @Bufer;
END

SELECT @Bufer = Firstname --Получить имя по идентификатору(значение не может быть null)
FROM Moms
WHERE MomId = @MomId;

SET @FIOresult = @FIOresult + ' ' + @Bufer; --Добавить имя к кончному результату.



SELECT @Bufer = Secondname --Получть очество по идентификатору(значение может быть null).
FROM Moms
WHERE MomId = @MomId;

IF @Bufer IS NOT NULL --Если очество не null добавить к конечному результату.
BEGIN
SET @FIOresult = @FIOresult + ' ' + @Bufer;
END

RETURN @FIOresult
END

Автор: Zloxa 13.10.2010, 14:38
Код

select  trim(isnull(Surname,'')+' '+FirstName +' ' +isnull(Secondname,'')) as fio
from Moms

Автор: Zloxa 13.10.2010, 14:59
Цитата(Zloxa @  13.10.2010,  14:38 Найти цитируемый пост)
trim

черт, не умеет так MS SQL. кто бы мог подумать..
тогда
Код

select  rtrim(ltrim(isnull(Surname,'')+' '+FirstName +' ' +isnull(Secondname,''))) as fio
from Moms

Автор: Kolovorot 13.10.2010, 15:19
Благодарю. С тримом я  как раз то же самое проделал smile .
А есть ли смысл создавать такую отдельную функцию для этого?
Код

CREATE FUNCTION [dbo].[fn_GetFIO]
(@MomId bigint)
RETURNS varchar(60)
WITH EXECUTE AS CALLER
AS
BEGIN

DECLARE @FIOresult varchar(60) 
SELECT  @FIOresult = rtrim(ltrim(isnull(Surname,'')+' '+FirstName +' ' +isnull(Secondname,'')))FROM Moms
WHERE MomId = @MomId;

RETURN @FIOresult
END

Автор: Zloxa 13.10.2010, 15:23
Цитата(Kolovorot @  13.10.2010,  15:19 Найти цитируемый пост)
А есть ли смысл создавать такую отдельную функцию для этого?

не думаю, но Вам тут виднее должно бы быть.

Возможно имело бы смысл создать http://technet.microsoft.com/ru-ru/library/ms178091(SQL.100).aspxфункцию,которая в качестве входных параметров принимала бы Surname,FirstName,Secondname и клеила бы строку.

Добавлено @ 15:26
Цитата(Kolovorot @  13.10.2010,  15:19 Найти цитируемый пост)
то же самое 

в общем виде, с ненужными пробелами, наверное  бы лучше бороться так:
Код

 rtrim(
   ltrim(isnull(val1,'')+' ')
   +ltrim(isnull(val2,'')+' ')
...
   +ltrim(isnull(val{N-1},'')+' ')
   +isnull(valN,''))
 )

Представленный Вами частный случай, когда имя not null позволяет использовать комбинацию ltrim(rtrim

Автор: Zloxa 13.10.2010, 15:40
Цитата(Zloxa @  13.10.2010,  15:23 Найти цитируемый пост)
 детерминированную 

чета я не нашел в MSDN возможности создания детерминированной пользовательской функции  smile 
И наличие в определении детерминизма функции оговорки "использовать одно и то же состояние базы данных" мне не нравится, я с ней не согласен, я б ее убрал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)