2010-12-08 7 views
6

में टेक्स्ट कनवर्ट करें क्या SQL सर्वर में किसी तालिका कॉलम से पाठ को केवल एक उचित SQL कोड का उपयोग करके पास्कलकेज़ में कनवर्ट करना संभव है?पास्कलकेस

TABLE DEFINITION 
---------------------- 
ID int 
CITTA varchar(50) 
PROV varchar(50) 
CAP varchar(50) 
COD varchar(50) 

फ़ील्ड जिसमें कनवर्ट करने के लिए टेक्स्ट शामिल है CITTA है। इसमें सभी अपरकेस मान शामिल हैं जैसे "अबानो टेरमे", "रोमए", और इसी तरह। शब्द एक अंतरिक्ष द्वारा सीमित हैं।

संपादित

मुझे लगता है कि कुछ शब्दों को यह ' में एक उच्चारण के चरित्र है उल्लेख करना भूल गया। यह चरित्र या तो शब्द के अंत में या बीच में पाया जा सकता है।

संपादित करें 2:

कुछ quirks परिणामों पर पाया:

  • अगर मैं "इसोला BALBA" की तरह एक नाम इस नाम अनुवाद करा है "IsolaBalba" (सही मामला लेकिन याद अंतरिक्ष) के लिए
  • अगर मैं "Isola d'Asti" इस तरह "IsolaD'asti" (पहले और गलत मामले के रूप में अंतरिक्ष याद करने के लिए परिवर्तित हो एक नाम है। इस मामले में सही परिणाम है "इसोला डी 'एस्टी"

क्या आप कृपया मुझे इस छोटी सी समस्या पर कुछ सलाह दे सकते हैं?

+2

शायद। सुनिश्चित नहीं है कि SQL ऐसा करने का सबसे अच्छा वातावरण है लेकिन यदि आप उदाहरण इनपुट और आउटपुट देते हैं तो मुझे जाना होगा! क्या वर्तमान में एक स्थान के साथ शब्द सीमित हैं? यानी क्या इसे 'पास्कल केस' को 'पास्कलकेस' में बदलने की ज़रूरत है? –

+0

@ मार्टिन: आपके त्वरित उत्तर के लिए धन्यवाद। मेरे प्रश्न संपादित करें पर ध्यान दें – Lorenzo

+0

@Lorenzo - क्या यूडीएफ आपके उद्देश्यों के लिए उचित SQL कोड के रूप में गिनती है? –

उत्तर

4
DECLARE @T TABLE 
(
ID INT PRIMARY KEY, 
CITTA VARCHAR(50) 
) 
INSERT INTO @T 
SELECT 1, 'ABANO TERME' UNION ALL SELECT 2, 'ROMA' UNION ALL SELECT 3, 'ISOLA D''ASTI'; 

IF OBJECT_ID('tempdb..#HolderTable') IS NOT NULL 
    DROP TABLE #HolderTable 

CREATE TABLE #HolderTable 
(
Idx INT IDENTITY(1,1) PRIMARY KEY, 
ID INT, 
Word VARCHAR(50) 
) 

CREATE NONCLUSTERED INDEX ix ON #HolderTable(ID) 
; 

WITH T1 AS 
(
SELECT ID, CAST(N'<root><r>' + REPLACE(REPLACE(CITTA, '''', '''</r><r>'), ' ', ' </r><r>') + '</r></root>' AS XML) AS xl 
FROM @T 
) 
INSERT INTO #HolderTable 
SELECT ID, 
     r.value('.','NVARCHAR(MAX)') AS Item 
FROM T1 
CROSS APPLY 
xl.nodes('//root/r') AS RECORDS(r) 

SELECT 
     ID, 
     (SELECT STUFF(LOWER(Word),1,1,UPPER(LEFT(Word,1))) FROM #HolderTable WHERE [@T].ID = #HolderTable.ID ORDER BY Idx FOR XML PATH('')) 
FROM @T [@T] 
+0

साफ-सुथरा सामान - उन पात्रों के साथ समस्याओं के लिए देखें जिनके लिए एक्सएमएल से बचने की आवश्यकता है, ',' हैम और ईजीजीएस 'का उपर्युक्त उपचार नहीं किया जाता है। –

+0

क्वेरी बहुत धीमी है, भले ही यह धीमी हो: 400 रिकॉर्ड के लिए 3 मिनट। और मेरे पास कनवर्ट करने के लिए लगभग 10k है :) डेटा में कोई वर्ण नहीं है जिसे बचने की आवश्यकता है। बहुत धन्यवाद!!! :) – Lorenzo

+0

यह वास्तव में बहुत धीमी है। क्या कुछ पाठ काफी लंबा है? मुझे लगता है कि यह वैसे भी एक काम है? –

2

नीचे दिए गए फ़ंक्शन को आज़माएं (स्ट्रिंग प्रकार को उपयुक्त के रूप में समायोजित करें)। बस इसे WHERE खंड में उपयोग न करें - और कहीं और प्रदर्शन विधियों पर विचार करें। 12345678 कुछ मनमाने ढंग से बड़ा मूल्य है जिसे आप कुछ और उचित के साथ बदलना चाहते हैं!

CREATE FUNCTION dbo.ufn_PascalCase(@str AS VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
BEGIN 
    SET @str = LOWER(@str) 

    DECLARE @result VARCHAR(MAX) = '' 

    DECLARE @spaceIndex INTEGER = CHARINDEX(' ', @str) 
    WHILE @spaceIndex > 0 
    BEGIN 
     SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, @spaceIndex - 2) 
     SET @str = SUBSTRING(@str, @spaceIndex + 1, 12345678) 
     SET @spaceIndex = CHARINDEX(' ', @str) 
    END 

    SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, 12345678) 

    RETURN @result 
END 
+0

@ धन्यवाद, मैं इसे आजमाने की कोशिश कर रहा हूं! क्या आपने प्रश्न पर अपना अंतिम संपादन देखा था? – Lorenzo

+0

@Lorenzo - मेरी खुशी। यह एक साधारण दृष्टिकोण है (और इनपुट के रूप में '' का सामना नहीं करता है - ओह!)। निष्पादन समय के मामले में शायद यह शानदार नहीं है। मार्टिन का दृष्टिकोण अच्छी तरह से बेहतर काम कर सकता है - एक्सएमएल से बचने की जरूरत वाले पात्रों के साथ किसी भी संभावित समस्या के लिए देखें। –

+0

@ लोर्नोजो - एक समस्या को उत्पन्न करने की उम्मीद नहीं करेगा - यह केवल रिक्त स्थान पर विभाजित है और प्रत्येक स्थान के बाद पहले वर्ण को अपरिवर्तित करना - ठीक w/उच्चारण काम करना चाहिए। –

3

मैं आपको कुछ समय पहले ब्लॉग में पोस्ट किए गए कोड को आजमाने के लिए प्रोत्साहित करता हूं। मुझे संदेह है कि यह आपकी आवश्यकताओं को बहुत अच्छी तरह से समायोजित करेगा, और कई अन्य तरीकों से भी बेहतर प्रदर्शन करेगा। क्योंकि यह केवल प्रत्येक शब्द के लिए बड़े अक्षर की आवश्यकता है के लिए एक बार लूप

SQL Server Proper Case Function

CREATE FUNCTION dbo.Proper(@DATA VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @Position INT 

    SELECT @DATA = STUFF(LOWER(@DATA), 1, 1, UPPER(LEFT(@DATA, 1))), 
     @Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin) 

    WHILE @Position > 0 
    SELECT @DATA = STUFF(@DATA, @Position, 2, UPPER(SUBSTRING(@DATA, @Position, 2))), 
      @Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin) 

    RETURN @DATA 
END 

यह समारोह एक सा तुलना में सबसे तेज है।

+0

@G मास्ट्रोस पर मेरी नवीनतम टिप्पणी देखें: आपकी मदद के लिए धन्यवाद! मैंने फ़ंक्शन का प्रयास किया है और यह बहुत अच्छा प्रदर्शन करता है भले ही मुझे यकीन न हो कि उच्चारण वर्ण '' 'सही ढंग से संभाल लें। वैसे भी यह कार्य एक कार्य बंद था और @ मार्टिन द्वारा नवीनतम संपादन बहुत तेज़ काम करता है (नौकरी करने के लिए केवल 5 सेकंड)। सादर – Lorenzo