2012-01-30 14 views
6

क्या SQL सर्वर में कोई फ़ंक्शन है जो एकवचन से बहुवचन रूप में संज्ञा को बदलता है?एसक्यूएल फ़ंक्शन को बहुवचन बनाने के लिए

+4

बहुवचन की अनियमितता के कारण यह मुश्किल होगा (अंग्रेजी में, वैसे भी)। बिल्ली-> बिल्लियों, माउस-> चूहे, गुज़-> गीस, व्यक्ति-> लोग ... –

+0

किस भाषा में? :) निश्चित रूप से, मानक मौजूद नहीं है। –

+1

क्या कोई SQL फ़ंक्शन है जो किसी दिए गए भाषा के लिए व्याकरण को समझता है ??? नहीं :) – MatBailie

उत्तर

4

यह फ़ंक्शन SQL सर्वर में मौजूद नहीं है।

0

नहीं, लेकिन यदि आपके पास जांच करने के लिए शब्दों का सीमित सेट है तो इसके लिए एक टेबल बनाना बहुत आसान होगा।

उदाहरण:

CREATE TABLE dbo.Plurals 
( 
    id int IDENTITY, 
    singular varchar(100), 
    plural varchar(100) 
) 

INSERT INTO dbo.Plurals 
VALUES 
('cat', 'cats'), 
('goose', 'geese'), 
('man', 'men'), 
('question', 'questions') 

वैकल्पिक रूप से, आप कर सकते हैं तालिका सिर्फ अपवाद हैं, यानी ऐसे शब्द हैं जो एक s का सरल इसके अलावा के साथ इनका बहुवचन नहीं किया जा सकता हो - तो आप उस पर एक EXISTS जांच कर सकता है तालिका, यदि यह वहां नहीं है तो s जोड़ें और यदि यह तब बहुवचन को देखे।

4

एसक्यूएल के पास ऐसा कुछ भी नहीं है - लेकिन आप .NET PluralizationService का उपयोग .NET 4 में पेश करने का प्रयास कर सकते हैं - वही कार्यक्षमता जो इकाई फ्रेमवर्क नामों को ऑब्जेक्ट करने के लिए तालिका नामों को बहुवचन/एकवचन करने के लिए उपयोग करती है।

आपको बहुवचन सेवाओं में टैप करने के लिए एक एसक्यूएल-सीएलआर असेंबली लिखनी होगी, लेकिन यह निश्चित रूप से एक काम करने योग्य चीज़ की तरह दिखता है!

+0

+1 - अच्छा, इसके बारे में नहीं पता था। – JNK

+0

एसक्यूएल सर्वर सीएलआर में .NET 4.0 असेंबली का उपयोग करना संभव है? –

+1

@ मार्टिनस्मिथ - एसक्यूएल सीएलआर वर्तमान में (एसक्यूएल 2008 आर 2) ढांचे के संस्करण 3.5 तक सीमित है। System.Data.EntityDesign असेंबली लक्ष्य 4.0 (नीचे मेरा उत्तर देखें) – EBarr

2

फ़ंक्शन SQL सर्वर में मौजूद नहीं है, जैसा कि @ एएफ ने उल्लेख किया है। एक जगह जो मुझे पता है कि यह मौजूदा इकाई फ्रेमवर्क 4+ में है। बहुवचन वस्तु वास्तव में instantiated and used हो सकती है।

एसक्यूएल में सीएलआर कोड चलाने की क्षमता है - एसक्यूएल सीएलआर के माध्यम से। मुख्य समस्या यह है कि एसक्यूएल सीएलआर .NET Framework 3.5 तक ही सीमित है। इसलिए आपको या तो कुछ .net 4 कोड लिखने की आवश्यकता होगी जो आपकी टेबल पर चलती हैं। वैकल्पिक रूप से, आप एक उत्पाद का उपयोग कर सकते हैं जैसे रिफ्लेक्टर और रिवर्स इंजीनियर 3.5 संगत संस्करण और इसे SQL सर्वर के अंदर चलाएं।

2
CREATE FUNCTION dbo.Pluralize 
(
    @noun nvarchar(50) 
) 
RETURNS nvarchar(50) 
AS 
BEGIN 

DECLARE @QueryString nvarchar(4000) 
SET @QueryString = N'FORMSOF(INFLECTIONAL,"' + @noun + N'")' 
RETURN 
(SELECT TOP 1 display_term 
FROM sys.dm_fts_parser(@QueryString,1033,0,0)) 

END 
GO 

SELECT noun, 
     dbo.Pluralize(noun) 
FROM (VALUES('cat'), 
       ('mouse'), 
       ('goose'), 
       ('person'), 
       ('man'), 
       ('datum')) nouns(noun) 

रिटर्न

noun 
------ ------------------------------ 
cat cats 
mouse mice 
goose geese 
person persons 
man men 
datum data 

दुर्भाग्य से यह सिर्फ अवलोकन है कि संज्ञा के लिए TOP 1 विस्तार अवधि बहुवचन रूप है पर निर्भर करता है। मुझे संदेह है कि यह कहीं भी दस्तावेज है।

0

क्या आप इसे प्रदर्शन उद्देश्यों के लिए उपयोग करना चाहते हैं?
कुछ की तरह/"आपकी खोज से 4 परिणाम" "आपकी खोज 1 परिणाम लौटे"?

यदि हां, तो मैं ऐसा नहीं करता।
एक ऐसा फ़ंक्शन ढूंढना या लिखना जो सभी विशेष मामलों (कई भाषाओं में अकेले रहने दें) के लिए सही तरीके से करता है, और एक बार में प्रत्येक आवश्यक पाठ को एक बार में संग्रहीत करता है और एक बार बहुवचन रूप में बेहतर नहीं होता है।

काम में, मैं कई भाषाओं और इस तरह एक बहुत गतिशील रूप से उत्पन्न वाक्य के बहुत सारे के साथ काम कर रहा हूँ, और मैंने पाया है कि पूरी तरह से सब पर एकवचन/बहुवचन रूप का गौरव प्राप्त परहेज प्रबंधन का सबसे सरल उपाय है:

"इस खोज के लिए परिणाम की संख्या: 1"

2
DECLARE @PluralVersion nvarchar(128) = '' 
    DECLARE @TableName nvarchar(128) = 'MyTableName'   
    DECLARE @NounVersions TABLE(Term nvarchar(128) NOT NULL) 
    DECLARE @QueryString nvarchar(4000) SET @QueryString = N'FORMSOF(INFLECTIONAL,"' + @TableName + N'")' 
    INSERT INTO @NounVersions 
    SELECT TOP 10 display_term FROM sys.dm_fts_parser(@QueryString,1033,0,0) 
    SELECT TOP 1 @PluralVersion = Term FROM @NounVersions WHERE Term Not Like '%''%' AND RIGHT(Term,1) = 's' 
    SET @PluralVersion = UPPER(LEFT(@PluralVersion,1))+LOWER(SUBSTRING(@PluralVersion,2,LEN(@PluralVersion))) 
    SELECT @PluralVersion 

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन मैं वैसे भी पोस्ट होगा सोचा। मार्टिन ने जो शुरू किया, उसके आधार पर, मैंने इसे विस्तारित किया और अब तक यह ठीक काम कर रहा है। मैं नहीं कहूंगा कि यह सही है। इसका उपयोग टेबल नामों को बहुवचन के लिए किया जाता है, इसलिए इसे बहुत नियंत्रित किया जाता है

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