2012-01-30 16 views
6

Esiste una funzione in SQL Server che modifica il nome dalla forma singolare a quella plurale?Funzione Sql per rendere sostantivo plurale

+4

Ciò sarebbe difficile (in inglese, comunque) a causa dell'irregolarità dei pluralites. Gatto-> Gatti, Topo-> Topi, Oca-> Oche, Persona-> Persone ... –

+0

In che lingua? :) Certo, lo standard non esiste. –

+1

Esiste una funzione SQL che comprende la grammatica per una determinata lingua ??? No :) – MatBailie

risposta

4

Questa funzione non esiste in SQL Server.

0

No, ma sarebbe abbastanza facile creare un tavolo per questo se si dispone di un numero limitato di parole da controllare.

Esempio:

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') 

In alternativa, si potrebbe creare il tavolo solo essere eccezioni, vale a dire parole che non possono essere pluralizzata con la semplice aggiunta di un s - allora si potrebbe fare un EXISTS controllo su quel tabella, se non è lì quindi aggiungere un s e se è quindi cercare il plurale.

4

SQL non ha nulla di simile - ma si può provare a utilizzare .NET PluralizationService introdotto in .NET 4, la stessa funzionalità utilizzata da Entity Framework per pluralizzare/singolare i nomi di tabelle per i nomi di oggetto.

Si dovrebbe scrivere un assembly SQL-CLR per accedere ai servizi di pluralizzazione, ma sicuramente sembra una cosa fattibile!

+0

+1 - bello, non lo sapevo. – JNK

+0

È possibile utilizzare gli assembly di .NET 4.0 in CLR di SQL Server? –

+1

@MartinSmith - SQL CLR è attualmente (SQL 2008R2) limitato alla versione 3.5 del framework. Gli obiettivi di assemblaggio System.Data.EntityDesign 4.0 (vedere la mia risposta di seguito) – EBarr

2

La funzione non esiste in SQL Server, come menzionato @aF. L'unico posto in cui so se esiste è in Entity Framework 4+. L'oggetto di pluralizzazione può essere in realtà instantiated and used.

SQL ha la capacità di eseguire il codice CLR tramite SQL CLR. Il problema principale è che SQL CLR è limitato a .NET Framework 3.5. Quindi dovresti scrivere del codice .net 4 che funziona sui tuoi tavoli. In alternativa, è possibile utilizzare un prodotto come Reflector e eseguire il reverse engineering di una versione compatibile 3.5 e eseguirla all'interno di SQL Server.

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) 

Returns

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

Purtroppo appena si basa sull'osservazione che il termine TOP 1 espansione per il sostantivo è la forma plurale. Dubito che questo sia documentato ovunque.

0

Si desidera utilizzare questo per scopi di visualizzazione?
Qualcosa come "La ricerca ha prodotto 1 risultato"/"La ricerca ha prodotto 4 risultati "?

Se sì, non lo farei così.
Trovare o scrivere una funzione che funzioni correttamente per tutti i casi speciali (figuriamoci in più lingue) è quasi impossibile, e memorizzare ogni testo necessario una volta in singolare e una volta al plurale non è molto meglio.

Al lavoro, ho a che fare con più lingue e un sacco di frasi generate dinamicamente come questo molto, e ho scoperto che evitare del tutto la distinzione delle forme singolari/plurali a tutti è la soluzione più semplice da gestire:

"Numero di risultati per questa ricerca: 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 

so che questo è un vecchio thread, ma ho pensato di postare in ogni modo. Sulla base di ciò che Martin ha iniziato, l'ho ampliato e finora sta facendo un buon lavoro. Non direi che è perfetto. Questo è usato per pluralizzare i nomi delle tabelle quindi è molto controllato

Problemi correlati