Saya memiliki database yang penuh dengan baris dengan Huruf Besar yang perlu saya konversi ke Huruf Kalimat menggunakan prosedur tersimpan di TSQL. Misalnya: String Asli:

THIS IS THE FIRST SENTENCE. THIS IS THE SECOND SENTENCE!     THIS IS THE THIRD SENTENCE?  THIS IS THE FOURTH SENTENCE.

String yang Dikonversi:

This is the first sentence. This is the second sentence!     This is the third sentence?  This is the fourth sentence.
-1
Jerms3033 20 Mei 2015, 18:02
Silahkan google FUNGSI STRING SQL
 – 
Tab Alleman
20 Mei 2015, 18:05
Ini tidak terlihat seperti pekerjaan initcap bagi saya @Tab Alleman
 – 
miracle_the_V
20 Mei 2015, 18:06
Tidak mengatakan itu, tetapi ini adalah pekerjaan untuk fungsi string sql standar.
 – 
Tab Alleman
20 Mei 2015, 18:13
Akan sangat membantu untuk menandai pertanyaan basis data dengan perangkat lunak yang sesuai (MySQL, Oracle, DB2, ...) dan versi, mis. sql-server-2014. Perbedaan sintaks dan fitur sering mempengaruhi jawaban.
 – 
HABO
21 Mei 2015, 05:55

1 menjawab

Jawaban Terbaik

Nah, hal semacam ini akan lebih baik ditangani dalam fungsi CLR atau di lapisan presentasi, tetapi di sini ada satu cara untuk melakukannya hanya dengan menggunakan tsql:

Pembaruan:
Saya telah meningkatkan kode untuk mendeteksi kalimat yang dimulai dengan angka, sehingga akan diabaikan (yaitu jika kalimat adalah 4th sentence, t setelah 4 akan tetap menjadi huruf kecil .)

DECLARE @OriginalString varchar(200) = 'THIS IS THE FIRST SENTENCE. THIS IS THE SECOND SENTENCE!     THIS IS THE THIRD SENTENCE?  4TH SENTENCE.'

DECLARE @TargetString varchar(200),
        @Index int = 2,
        @CurrentChar CHAR(1),
        @FoundBeginingOfSentence bit = 0,
        @BeginingOfSentenceIsANumber bit = 0

SET @TargetString = LEFT(@OriginalString, 1) + LOWER(RIGHT(@OriginalString, LEN(@OriginalString)-1))


WHILE @Index < LEN(@OriginalString)
BEGIN

    SET @CurrentChar = SUBSTRING(@OriginalString, @Index, 1)
    SET @Index = @Index + 1
    IF @CurrentChar IN('.', '!', '?') 
    BEGIN
         WHILE @FoundBeginingOfSentence = 0 AND @Index < LEN(@OriginalString)
         BEGIN
             SET @CurrentChar = SUBSTRING(@OriginalString, @Index, 1)
             IF PATINDEX('[0-9]', @CurrentChar) = 1 
             BEGIN
                 SELECT @FoundBeginingOfSentence = 1,
                        @BeginingOfSentenceIsANumber = 1
             END
             IF @BeginingOfSentenceIsANumber = 0 
             BEGIN
                 IF PATINDEX('[A-Z]', @CurrentChar) = 1 BEGIN
                     SET @FoundBeginingOfSentence = 1
                     SET @TargetString = LEFT(@TargetString, @Index-1) + UPPER(SUBSTRING(@TargetString, @Index, 1)) + SUBSTRING(@TargetString, @Index+1, LEN(@TargetString))
                 END
                 SET @Index = @Index + 1
             END
         END
    END

    SELECT @FoundBeginingOfSentence = 0,
           @BeginingOfSentenceIsANumber = 0 
END

Lihat biola di sini

Catatan: Anda dapat menambahkan pembatas kalimat apa pun yang Anda inginkan ke pernyataan if pertama.

3
Zohar Peled 21 Mei 2015, 08:30
@Jerms3033: Apakah saran saya menjawab pertanyaan Anda? jika tidak, Bagaimana saya bisa memperbaikinya?
 – 
Zohar Peled
25 Mei 2015, 14:32
Saya masih berpikir metode CLR akan memiliki kinerja yang lebih baik, tetapi selama Anda senang dengan saran saya maka saya juga senang :-)
 – 
Zohar Peled
27 Mei 2015, 16:51