Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使名词复数的Sql函数_Sql_Sql Server_Function - Fatal编程技术网

使名词复数的Sql函数

使名词复数的Sql函数,sql,sql-server,function,Sql,Sql Server,Function,SQL Server中是否有任何函数可以将名词从单数形式更改为复数形式?该函数在SQL Server中不存在。没有,但如果要检查的单词数量有限,则很容易为此创建一个表。 CREATE FUNCTION dbo.Pluralize ( @noun nvarchar(50) ) RETURNS nvarchar(50) AS BEGIN DECLARE @QueryString nvarchar(4000) SET @QueryString = N'FORMSOF(INFLECTIONA

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

该函数在SQL Server中不存在。

没有,但如果要检查的单词数量有限,则很容易为此创建一个表。

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)  
例如:

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
,如果是,则查找复数。

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


您必须编写一个SQL-CLR程序集才能使用多元化服务,但这显然是可行的

如@aF所述,SQL Server中不存在该函数。我知道它是否存在于EntityFramework4+中。多元化的目标实际上可以是

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

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
扩展词是复数形式。我怀疑在任何地方都有记录。

您想将其用于显示目的吗?
类似于“您的搜索返回1结果”/“您的搜索返回4结果

如果是,我不会那样做。
几乎不可能找到或编写一个能在所有特殊情况下(更不用说在几种语言中)正确实现这一点的函数,并且将每个需要的文本以单数形式和复数形式存储一次也没有多大好处

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

“此搜索的结果数:1”


我知道这是一个旧的线程,但我想我会张贴任何方式。基于Martin开始的内容,我扩展了它,到目前为止,它做得还不错。我不会说它是完美的。这用于表名的复数化,因此它是非常受控制的

,因为复数的不规则性,这将很难(无论如何,在英语中)。猫->猫,老鼠->老鼠,鹅->鹅,人->人…用什么语言?:)当然,标准并不存在。是否有一个SQL函数可以理解给定语言的语法???一般来说,我会认为这是一个“显示”问题,并且会避免把逻辑放在SQL Server中。出于好奇,你打算如何识别一个词是一个名词?是否可以在SQL Server CLR中使用.NET 4程序集?@马丁斯密斯-SQLCLR目前(SQL 2008 8R2)限于框架的版本3.5。System.Data.EntityDesign程序集的目标是4.0(请参见下面的答案)@EBarr:我想我们必须等待SQL Server 2012……当我尝试同样的
dbo时,它将内置SQL CLR v4。将函数定义复数化,而不是
cats
函数返回
cat的
。人的
和人的也一样。无论输入参数的大小写如何,它都会降低每个结果的大小写。
Butterfly
被“多元化”为
butterflied
@CalvinDale-它依赖于一个关于6年前我测试的版本上
TOP 1
行为的未记录观察。从那以后情况似乎发生了变化,或者添加了额外的扩展,或者sys.dm_fts_解析器的
SELECT*结果的顺序('FORMSOF(屈折变化的,“蝴蝶”)',1033,0,0)
的顺序发生了变化。不幸的是,似乎没有一种方法可以可靠地使用此函数实现多元化。