Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция для получения ФИО, MSSQLSERVER 
V
    Опции темы
Kolovorot
Дата 13.10.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 12.1.2009

Репутация: 1
Всего: 3



Только-только взялся за изучение 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

--------------------
Никогда еще истина не повисала на руке безусловного. Фридрих Ницше. Так говорил Заратустра
PM MAIL   Вверх
Zloxa
Дата 13.10.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Код

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


Это сообщение отредактировал(а) Zloxa - 13.10.2010, 14:40


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 13.10.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

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

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


Это сообщение отредактировал(а) Zloxa - 13.10.2010, 14:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kolovorot
Дата 13.10.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 12.1.2009

Репутация: 1
Всего: 3



Благодарю. С тримом я  как раз то же самое проделал 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

--------------------
Никогда еще истина не повисала на руке безусловного. Фридрих Ницше. Так говорил Заратустра
PM MAIL   Вверх
Zloxa
Дата 13.10.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

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

Возможно имело бы смысл создать детерминированную функцию,которая в качестве входных параметров принимала бы 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:35


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 13.10.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

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

Это сообщение отредактировал(а) Zloxa - 13.10.2010, 15:41


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.