2015-01-02 3 views
0

Я нашел следующую функцию с заглавной буквы каждого слова в колонке:SQL Первая заглавная буква - Функция плохой производительности

CREATE FUNCTION [dbo].[InitCap] (@InputString varchar(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 

DECLARE @Index   INT 
DECLARE @Char   CHAR(1) 
DECLARE @PrevChar  CHAR(1) 
DECLARE @OutputString VARCHAR(255) 

SET @OutputString = LOWER(@InputString) 
SET @Index = 1 

WHILE @Index <= LEN(@InputString) 
BEGIN 
    SET @Char  = SUBSTRING(@InputString, @Index, 1) 
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' 
         ELSE SUBSTRING(@InputString, @Index - 1, 1) 
        END 

    IF @PrevChar IN (' ') 
    BEGIN 
     IF @PrevChar != '''' OR UPPER(@Char) != 'S' 
      SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) 
    END 

    SET @Index = @Index + 1 
END 

RETURN @OutputString 

END 

GO 

Если есть иметь следующий список имя:

ruth adams 
sara black 
john balley 

я должен получить следующий результат

Ruth Adams 
Sara Black 
John Balley 

Но вместо того, что я получаю это:

Uth Adams 
Sara Black 
John Balley 

Я потерял первую букву первого слова. Я проанализировал функцию несколько раз, но на этом этапе я могу понять этот набор результатов. Можете ли вы указать мне, где проблема, и если возможно, как ее исправить.

Благодаря

+0

Укажите, пожалуйста, какой тип dbms-продукта вы используете. (Так как это, конечно, не стандарт ANSI/ISO SQL.) – jarlh

+0

SQL Server 2012, это вы имеете в виду? – d2907

+0

Правильно! (Вы получите более эффективный ответ быстрее, если вы укажете dbms, по крайней мере, когда спросите о специфических функциях провайдера.) – jarlh

ответ

1

Вы этот блок логики:

BEGIN 
    IF @PrevChar != '''' OR UPPER(@Char) != 'S' 
----------------------------^ 
     SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) 
END 

Вы намеренно извлекая 'S' с. Я предполагаю, что вы просто хотите:

BEGIN 
    IF @PrevChar <> '''' 
     SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) 
END 
+0

спасибо за ваш повтор, но я думаю, что эта часть кода предназначена для британских фамилий, что-то вроде «johnson's» или что-то вроде что. Даже если вы предлагаете изменения, конечный результат все тот же. – d2907

0

Наконец-то я нашел решение. Я не знал, что функция len в sql не учитывает последний символ, если это пустое пространство, поэтому необходимо было использовать функцию RTRIM в столбце перед использованием функции заглавной буквы

0

Это может быть быть альтернативным способом:

CREATE FUNCTION [dbo].[NameCap] (@InputString varchar(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 

DECLARE @Index INT 

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

WHILE @Index <= LEN(@InputString) 

BEGIN 
    IF SUBSTRING(@InputString, @Index - 1, 1) = ' ' 
     SET @InputString = STUFF(@InputString, @Index, 1, UPPER(SUBSTRING(@InputString, @Index, 1))) 

    SET @Index = @Index + 1 
END 

RETURN @InputString 

END 

GO 

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

  • Нет связанных вопросов^_^