2012-01-30 19 views
6

¿Hay alguna función en SQL Server que cambie el nombre del singular al plural?Función Sql para hacer sustantivo plural

+4

Eso sería difícil (en inglés, de todos modos) debido a la irregularidad de las pluralidades. Cat-> Cats, Mouse-> Mice, Goose-> Geese, Person-> People ... –

+0

¿En qué idioma? :) Claro, el estándar no existe. –

+1

¿Hay una función SQL que entienda la gramática para un idioma determinado? No :) – MatBailie

Respuesta

4

Esa función no existe en SQL Server.

0

No, pero sería bastante fácil hacer una tabla para esto si tienes un conjunto limitado de palabras para verificar.

Ejemplo:

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

Como alternativa, puede tomar la mesa sólo haber excepciones, es decir, palabras que no pueden ser plural, con la simple adición de un s - entonces usted podría hacer una comprobación EXISTS en ese tabla, si no está allí, agregue un s y si es entonces busque el plural.

4

El SQL en sí mismo no tiene nada como esto, pero podría intentar usar .NET PluralizationService introducido en .NET 4 - la misma funcionalidad que Entity Framework usa para pluralizar/singularizar nombres de tabla a nombres de objeto.

Tendría que escribir un ensamblado SQL-CLR para aprovechar los servicios de pluralización, ¡pero definitivamente parece algo factible!

+0

+1 - bien, no sabía de eso. – JNK

+0

¿Es posible utilizar ensamblados .NET 4.0 en SQL Server CLR? –

+1

@MartinSmith - SQL CLR es actualmente (SQL 2008R2) limitado a la versión 3.5 del framework. El ensamblado System.Data.EntityDesign apunta a 4.0 (vea mi respuesta a continuación) – EBarr

2

La función no existe en SQL Server, como se menciona @aF. El único lugar que sé si existe es en Entity Framework 4+. El objeto de pluralización en realidad puede ser instantiated and used.

SQL tiene la capacidad de ejecutar código CLR - a través de SQL CLR. El principal problema es que SQL CLR está limitado a .NET Framework 3.5. Entonces, necesitaría escribir algún código .net 4 que opere en sus tablas. Alternativamente, puede usar un producto como Reflector e invertir la versión 3.5 de una versión compatible y ejecutarlo dentro de 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) 

devoluciones

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

Por desgracia sólo se basa en la observación de que el término TOP 1 expansión para el sustantivo es la forma plural. Dudo que esto esté documentado en ningún lado.

0

¿Desea utilizar esto para fines de visualización?
Algo así como "Su búsqueda 1 resultado"/"Su búsqueda 4 resultados"?

En caso afirmativo, no lo haría así.
Encontrar o escribir una función que hace esto correctamente para todos los casos especiales (y mucho menos en varios idiomas) es casi imposible, y almacenar cada texto necesario una vez en singular y una vez en plural no es mucho mejor.

En el trabajo, estoy tratando con múltiples idiomas y un montón de frases generadas dinámicamente como esto mucho, y me pareció que evitar por completo la distinción de las formas singular/plural en absoluto es la solución más fácil de manejar:

"Número de resultados para esta búsqueda: 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 

sé que esto es un hilo viejo, pero pensé que iba a publicar de todos modos. Basado en lo que Martin comenzó, lo expandí y hasta ahora está haciendo un buen trabajo. No diría que es perfecto. Esto se utiliza para la pluralización de los nombres de las tablas por lo que es muy controlado

Cuestiones relacionadas