2012-01-30 24 views
6

Có chức năng nào trong SQL Server thay đổi danh từ từ số ít sang số nhiều không?Chức năng Sql để làm cho danh từ số nhiều

+4

Điều đó sẽ khó (bằng tiếng Anh, dù sao) do sự bất thường của số nhiều. Mèo-> Mèo, Chuột-> Chuột, Ngỗng-> Ngỗng, Người-> Người ... –

+0

Trong ngôn ngữ nào? :) Chắc chắn, tiêu chuẩn không tồn tại. –

+1

Có một hàm SQL hiểu ngữ pháp cho một ngôn ngữ nhất định không ??? No :) – MatBailie

Trả lời

4

Chức năng đó không tồn tại trong SQL Server.

0

Không, nhưng sẽ rất dễ dàng để tạo bảng cho điều này nếu bạn có một nhóm từ hạn chế để kiểm tra.

Ví dụ:

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

Ngoài ra, bạn có thể làm bàn chỉ là trường hợp ngoại lệ, lời nói tức là không thể thành số nhiều với việc bổ sung đơn giản của một s - sau đó bạn có thể làm một kiểm tra EXISTS vào đó bảng, nếu nó không có thì thêm một s và nếu nó là sau đó tra cứu số nhiều.

4

Bản thân SQL không có bất kỳ thứ gì như thế này - nhưng bạn có thể thử sử dụng .NET PluralizationService được giới thiệu trong .NET 4 - cùng một chức năng mà Khung thực thể sử dụng để đa dạng hóa/đánh số tên bảng thành tên đối tượng.

Bạn sẽ phải viết một hội đồng SQL-CLR để khai thác các dịch vụ số nhiều, nhưng nó chắc chắn có vẻ giống như một điều có thể làm được!

+0

+1 - đẹp, không biết về điều đó. – JNK

+0

Có thể sử dụng các hội đồng .NET 4.0 trong SQL Server CLR không? –

+1

@MartinSmith - SQL CLR hiện tại (SQL 2008R2) giới hạn ở phiên bản 3.5 của khung công tác. Các System.Data.EntityDesign lắp ráp mục tiêu 4.0 (xem câu trả lời của tôi dưới đây) – EBarr

2

Hàm không tồn tại trong SQL Server, như @aF đã đề cập. Một nơi tôi biết nếu nó tồn tại trong Entity Framework 4+. Đối tượng số nhiều có thể thực sự là instantiated and used.

SQL có khả năng chạy mã CLR - thông qua SQL CLR. Vấn đề chính là SQL CLR được giới hạn trong .NET Framework 3.5. Vì vậy, bạn sẽ cần viết một số mã .net 4 hoạt động trên các bảng của bạn. Cách khác, bạn có thể sử dụng một sản phẩm như Reflector và reverse engineer một phiên bản tương thích 3.5 và chạy nó bên trong 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 

Đáng tiếc là nó chỉ dựa trên quan sát rằng thuật ngữ TOP 1 mở rộng cho danh từ là hình thức số nhiều. Tôi nghi ngờ rằng đây là tài liệu bất cứ nơi nào.

0

Bạn có muốn sử dụng mục đích này cho mục đích hiển thị không?
Giống như "Tìm kiếm của bạn trở lại 1 kết quả"/"Tìm kiếm của bạn trở lại 4 kết quả"?

Nếu có, tôi sẽ không làm như vậy.
Tìm kiếm hoặc viết một hàm thực hiện điều này một cách chính xác cho tất cả các trường hợp đặc biệt là không thể, và lưu trữ từng văn bản cần thiết một lần ở dạng số ít và một lần ở dạng số nhiều không tốt hơn nhiều.

Tại nơi làm việc, tôi đang đối phó với nhiều ngôn ngữ và rất nhiều câu tạo động như thế này rất nhiều, và tôi thấy rằng hoàn toàn tránh sự phân biệt của dạng số ít/số nhiều ở tất cả các sự là giải pháp đơn giản nhất để quản lý:

"số kết quả cho tìm kiếm này: 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 

tôi biết đây là một chủ đề cũ, nhưng nghĩ tôi sẽ gửi anyways. Dựa trên những gì Martin bắt đầu, tôi mở rộng nó và cho đến nay nó đang làm một công việc OK. Tôi sẽ không nói nó là hoàn hảo. Điều này được sử dụng để đa dạng tên bảng vì vậy nó được kiểm soát rất nhiều

Các vấn đề liên quan