Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将名称列的第一个字符始终设置为大写[MsSQL]_Sql_Sql Server_Database - Fatal编程技术网

将名称列的第一个字符始终设置为大写[MsSQL]

将名称列的第一个字符始终设置为大写[MsSQL],sql,sql-server,database,Sql,Sql Server,Database,我的MsSQL数据库看起来像这样 在Rick Smith hopkins的案例中,如何在短跑后大写字符? 像这样: Rick Smith-Hopkins 我的问题是: SELECT LEFT([Person], 1) + LOWER(SUBSTRING([Person], 2, CHARINDEX(' ', [Person] + ' ') - 2)) 'name' ,LEFT(SUBSTRING([Person], CHARINDEX(' ', [Person])

我的MsSQL数据库看起来像这样

在Rick Smith hopkins的案例中,如何在短跑后大写字符? 像这样:

Rick Smith-Hopkins
我的问题是:

SELECT 
      LEFT([Person], 1) + LOWER(SUBSTRING([Person], 2, CHARINDEX(' ', [Person] + ' ') - 2)) 'name'
      ,LEFT(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 1, LEN([Person])), 1) + LOWER(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 2, LEN([Person]))) 'full surname'

      ,LEFT(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 1, LEN([Person])), 1) 
      + LOWER(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 2, LEN([Person]))) 'surname 1st with -'

      ,LEFT([Person], 1) + LOWER(SUBSTRING([Person], 2, CHARINDEX(' ', [Person] + ' ') - 2)) + ' ' +
      LEFT(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 1, LEN([Person])), 1) 
      + LOWER(SUBSTRING([Person], CHARINDEX(' ', [Person]) + 2, LEN([Person]))) 'Person'

FROM [db].[dbo].[table]

我想您需要一些scaller函数,它以char(-),string_值作为参数。但是,让我尝试使用
stuff()
函数来处理这个问题,并将其替换为大写字符

SELECT 
     stuff(name, charindex('-', name)+1, 1, 
             upper(substring(name, charindex('-', name)+1, 1))) name,
      ....
FROM table

注意:这将仅限于一个字符(-)位置。

正如Ivan所建议的,您应该仅在客户端处理此问题

如果需要在数据库级别执行此操作,请创建一个函数,如下所示:

CREATE FUNCTION [dbo].[fnConvert_TitleCase] (@InputString VARCHAR(4000) )  
RETURNS VARCHAR(4000)  
AS  
BEGIN  
DECLARE @Index INT  
DECLARE @Char CHAR(1)  
DECLARE @OutputString VARCHAR(255)  

SET @OutputString = LOWER(@InputString)  
SET @Index = 2  
SET @OutputString = STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1)))  

WHILE @Index <= LEN(@InputString)  
BEGIN  
    SET @Char = SUBSTRING(@InputString, @Index, 1)  
    IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(')  
    IF @Index + 1 <= LEN(@InputString)  
BEGIN  
    IF @Char != ''''  
    OR  
    UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S'  
    SET @OutputString =  
    STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1)))  
END  
    SET @Index = @Index + 1  
END  

RETURN ISNULL(@OutputString,'')  
END
创建函数[dbo].[fnConvert\u TitleCase](@InputString VARCHAR(4000))
返回VARCHAR(4000)
像
开始
声明@Index INT
声明@Char(1)
声明@OutputString VARCHAR(255)
设置@OutputString=LOWER(@InputString)
设置@Index=2
设置@OutputString=STUFF(@OutputString,1,1,UPPER(子字符串(@InputString,1,1)))

而@Index则在客户端执行此操作。将
马尔科姆·麦克道尔、柯南·奥布莱恩、乔纳森·里斯·戴维斯和卡尔·范德沃尔特
添加到样本数据中。结果是马尔科姆·麦克道尔、柯南·奥布莱恩、乔纳森·里斯·戴维斯和卡尔·范德沃尔特!哪个sql server版本??sql server 2016