2008-09-10 15 views
34

सबसे अच्छा तरीका है एसक्यूएल सर्वर में एक स्ट्रिंग में प्रत्येक शब्द के पहले अक्षर को कैपिटल करना क्या है में एक स्ट्रिंग में प्रत्येक शब्द के पहले अक्षर को कैपिटल करना क्या है।सबसे अच्छा तरीका है एसक्यूएल सर्वर

+0

इस एसक्यूएल सर्वर में किया जाना है? ऐसा कुछ नहीं है जो मैं डेटाबेस सर्वर से जोड़ता हूं, लेकिन फॉर्म सत्यापन या यहां तक ​​कि एक दृश्य द्वारा किया गया कुछ भी। –

+0

PostgreSQL उपयोगकर्ता: अद्यतन [तालिका] SET your_col = initcap (निचला (your_col)); यह एक पोस्टग्रे सवाल नहीं है, लेकिन यह पहले Google पर पहले दिखाई देता है। –

उत्तर

64

से http://www.sql-server-helper.com/functions/initcap.aspx

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 

वहाँ एक सरल/छोटे यहाँ ("अमान्य लंबाई पैरामीटर सही कार्य करने के लिए पारित कर दिया।" लेकिन अगर किसी भी पंक्ति रिक्त स्थान नहीं है काम नहीं करता है,) है:

http://www.devx.com/tips/Tip/17608

+0

UPPER (@Char)! = 'एस' का अर्थ क्या है? हम इसका इस्तेमाल क्यों कर रहे हैं? – Sharique

+1

'एस' की तुलना जब की तरह 'that's' – Espo

+0

धन्यवाद, कि मुझे मदद की शब्द लिख कि एस पूंजीकृत नहीं है सुनिश्चित करने के लिए है!) –

0

एक मैं पिछले कुछ समय से उपयोग कर रहे हैं की एक विविधता है:

CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS 
BEGIN 
    SET @string = LOWER(@string) 
    DECLARE @i INT 
    SET @i = ASCII('a') 
    WHILE @i <= ASCII('z') 
    BEGIN 
     SET @string = REPLACE(@string, ' ' + CHAR(@i), ' ' + CHAR(@i-32)) 
     SET @i = @i + 1 
    END 
    SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1) 
    RETURN @string 
END 

यदि आप चाहें तो रिक्त स्थान के अलावा अन्य वस्तुओं के बाद वर्णों को संभालने के लिए आप आसानी से संशोधित कर सकते हैं।

1

पाश का उपयोग किए बिना एक अन्य समाधान - पुनरावर्ती CTE

create function [dbo].InitCap (@value varchar(max)) 
returns varchar(max) as 
begin 

    declare 
     @separator char(1) = ' ', 
     @result varchar(max) = ''; 

    with r as (
     select value, cast(null as varchar(max)) [x], cast('' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j 
     union all 
     select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value] 
     , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end) [x] 
     , left(r.[value], 1) 
     , [no] + 1 [no] 
     from r where value > '') 

    select @result = @result + 
    case 
     when ascii([char]) between 97 and 122 
      then stuff(x, 1, 1, char(ascii([char])-32)) 
     else x 
    end + @separator 
    from r where x is not null; 

    set @result = rtrim(@result); 

    return @result; 
end 
0

यहाँ के साथ शुद्ध सेट-आधारित दृष्टिकोण सरल एक पंक्ति का कोड है।

select 
     LEFT(column, 1)+ lower(RIGHT(column, len(column)-1)) 
    from [tablename] 
+0

नोट, प्रत्येक कॉलम को व्हाइटस्पेस या इस ब्रेक की छंटनी की जानी चाहिए। – JohnnyBizzle

+1

इसके अलावा, आप पहले अक्षर पर ऊपरी नहीं कर रहे हैं। – JohnnyBizzle

+0

यह केवल स्तंभ – slayernoah

-1

आप इस कोशिश के बजाय

Select INITCAP(column_name) from table_name; 

यह उल्लेख जिम्मेदार बताते हैं प्रविष्टियों का प्रथम अक्षर को बड़ा होगा चाहिए।

+2

" INITCAP "एक अंतर्निहित समारोह नहीं है - आप समारोह परिभाषा प्रदान करने की जरूरत है। – chazbot7

+0

मैं Oracle MySQL में INITCAP का उपयोग करें और यह बिल्कुल ठीक –

+4

हाँ, पर सवाल विशेष रूप से कहा गया है एसक्यूएल सर्वर काम करता है। – chazbot7

0

एक मेज-मान समारोह के रूप में:

CREATE FUNCTION dbo.InitCap(@v AS VARCHAR(MAX)) 
RETURNS TABLE 
AS 
RETURN 
WITH a AS (
    SELECT (
     SELECT UPPER(LEFT(value, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS 'data()' 
     FROM string_split(@v, ' ') 
     FOR XML PATH (''), TYPE) ret) 

SELECT CAST(a.ret AS varchar(MAX)) ret from a 
GO 

ध्यान दें कि string_split की आवश्यकता है COMPATIBILITY_LEVEL 130.

0
BEGIN 
DECLARE @string varchar(100) = 'asdsadsd asdad asd' 
DECLARE @ResultString varchar(200) = '' 
DECLARE @index int = 1 
DECLARE @flag bit = 0 
DECLARE @temp varchar(2) = '' 
WHILE (@Index <LEN(@string)+1) 
BEGIN 
    SET @temp = SUBSTRING(@string, @Index-1, 1) 
    --select @temp 
    IF @temp = ' ' OR @index = 1 
     BEGIN 
      SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1)) 
     END 
    ELSE 
     BEGIN 

      SET @ResultString = @ResultString + LOWER(SUBSTRING(@string, @Index, 1)) 
     END 

    SET @Index = @Index+ 1--increase the index 
END 
SELECT @ResultString 

अंत

+0

SQL सर्वर में पहले वर्ण को कैपिटल करने का बहुत आसान तरीका –

संबंधित मुद्दे