2017-01-04 2 views
0

Любые предложения о том, как использовать только первую букву каждого слова в ячейке с помощью оператора select - без использования функции? У меня нет разрешения на создание функций/представлений/таблиц в базе данных, поэтому мне нужно запустить автоматический запрос запроса/выбора в batchjob с OGR.SQL Server: использовать первую букву каждого слова без использования функции

Я могу найти примеры, когда первая буква всей ячейки капитализируется или решает проблему с помощью функции.

Это относится имя-столбца со строками, как:
'JOHN DOE'
'JOHN JANE-DOE'
'JOHN-JANE DOE'
''
'JOHN'

+5

Если у вас нет надлежащих разрешений в базе данных, вы должны сделать это со стороны приложения. –

+2

Даже если это была разумная идея сделать это в слое базы данных, я надеюсь, вы понимаете сложность того, что вы просите? Правильные имена имен не так просты, как «Заглавие первой буквы». Такие имена, как 'O'Neill' или' McDonald', не будут хорошо воспроизводиться. – iamdave

+0

Даже если у вас есть правильные разрешения, вы, вероятно, захотите сделать это в чем-то отличном от SQL - есть решения, использующие чистый T-SQL, но они, скорее всего, не будут работать очень хорошо. Вы даже можете подумать о создании пакета SSIS, который вызывается вместо вашего оператора SQL. –

ответ

2

Просто для удовольствия

Declare @YourTable table (ID int,Name varchar(50)) 
Insert Into @YourTable values 
(1,'JOHN DOE'), 
(2,'JOHN JANE-DOE'), 
(3,'JOHN-JANE DOE'), 
(4,''), 
(5,'JOHN'), 
(6,'PATTY O''BRIAN'), 
(7,'OLD MCDONALD') 


Declare @Str varchar(max) = (Select ID,Name=Lower(Name) from @YourTable for XML Raw) 
Select @Str = Replace(@Str,MapFrom,MapTo) 
From (
     Select MapFrom=P+C 
       ,MapTo =Upper(P+C) 
     From (Select * From (Values ('"'),(' '),('-'),(' O'''),(' Mc')) P (P)) A 
     Cross Join (Select Top 26 C=Char(96+Row_Number() Over (Order By Number)) From master..spt_values) C 
     Union All 
     Select * From (Values (' MC',' Mc')) P (MapFrom,MapTo) 
    ) A 
Declare @XML xml = cast(@Str as XML) 
Select ID = r.value('@ID','int') 
     ,Name = r.value('@Name','varchar(50)') 
From @XML.nodes('/row') as A(r) 
Cross Apply A.r.nodes('./@*') AS B(attr) 
Where attr.value('local-name(.)','varchar(100)') not in ('ID','Active') 

Возвращает

ID Name 
1 John Doe 
2 John Jane-Doe 
3 John-Jane Doe 
4 
5 John 
6 Patty O'Brian 
7 Old McDonald 
1

Извините, я новичок в Stackoverflow, и я не знал о степени сложности этого вопроса.

Обнаружен обходной путь: компания, предоставляющая нашу инфраструктуру базы данных, предоставляет дополнительную таблицу с правильными отформатированными именами. Поэтому я присоединился к правильным форматированным именам в таблице, с которой я работаю.

Благодарим за помощь.

Смежные вопросы