Sql函数使名词复数

时间:2012-01-30 15:01:46

标签: sql sql-server function

SQL Server中是否有任何函数将名词从单数形式更改为复数形式?

7 个答案:

答案 0 :(得分:4)

SQL Server中不存在该功能。

答案 1 :(得分:4)

SQL本身没有这样的东西 - 但您可以尝试使用.NET 4中引入的.NET PluralizationService - 与实体框架用于将表名复数/单一化为对象名的相同功能

你必须编写一个SQL-CLR程序集来进入多元化服务,但它绝对是一件可行的事情!

答案 2 :(得分:2)

该函数在SQL Server中不存在,如@aF所述。我所知道的一个地方是否存在于Entity Framework 4+中。复数对象实际上可以是instantiated and used

SQL具有运行CLR代码的能力 - 通过SQL CLR。主要问题是SQL CLR仅限于.NET Framework 3.5。因此,您需要编写一些在您的表上运行的.net 4代码。或者,您可以使用像Reflector这样的产品并对3.5兼容版本进行反向工程,并在SQL Server中运行它。

答案 3 :(得分: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扩展术语是复数形式。我怀疑这在任何地方都有记录。

答案 4 :(得分: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 

我知道这是一个老线程,但我想我会发帖。基于马丁的起点,我对它进行了扩展,到目前为止,它的工作做得很好。我不会说这是完美的。这用于多个表名,因此它是非常受控制的

答案 5 :(得分:1)

您是否想将其用于显示目的?
类似" 您的搜索返回1 结果 " /" 您的搜索返回4 结果 " ?

如果是,我不会那样做。
找到或编写一个能够针对所有特殊情况正确执行此操作的函数(更不用说多种语言)几乎是不可能的,并且将每个所需文本以单数形式存储一次,而以复数形式存储一次并不是更好。

在工作中,我处理多种语言和许多动态生成的句子很多,我发现完全避免区分单数/复数形式是最容易管理的解决方案:

" 此次搜索的结果数量:1 "

答案 6 :(得分: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,如果是,则查找复数。