SQL Server:不使用函数

时间:2017-01-04 16:34:48

标签: sql sql-server

有关如何使用select语句仅对单元格中每个单词的首字母大写的任何建议 - 不使用函数?我没有权限在数据库中创建函数/视图/表,因此我需要在带有OGR的batchjob中自动运行查询/ select语句。

我只能找到整个单元格的首字母大写或用函数解决问题的例子。

它涉及一个名称列,其字符串如下:
'JOHN DOE'
'JOHN JANE-DOE'
'JOHN-JANE DOE'
''
'JOHN'

2 个答案:

答案 0 :(得分: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 :(得分:1)

抱歉,我是Stackoverflow的新手,我不知道这个问题的复杂程度。

我现在找到了一种解决方法 - 提供数据库基础结构的公司提供了一个具有正确格式化名称的附加表。所以我在我正在使用的桌面上加入了正确的格式化名称。

感谢您的帮助。