3

是否可以在 Sql Server 中对视图使用 FULLTEXT 索引而不在视图本身上创建索引?

我很惊讶地发现使用CONTAINS(,)查询视图中的列不起作用:

IF OBJECT_ID('ExampleTable') IS NULL
CREATE TABLE ExampleTable (
    SurrogateKey INT NOT NULL,
    Text VARCHAR(100)
)

TRUNCATE TABLE ExampleTable;
INSERT INTO ExampleTable VALUES (1, 'Lorem ipsum dolor sit amet')
INSERT INTO ExampleTable VALUES (2, 'consectetur adipisicing elit')

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name='PK_ExampleTable')
CREATE UNIQUE CLUSTERED INDEX PK_ExampleTable ON ExampleTable (
    SurrogateKey
)
GO

IF 'ExampleFullTextCatalog' NOT IN (SELECT name from sys.fulltext_catalogs)
CREATE FULLTEXT CATALOG ExampleFullTextCatalog;

IF OBJECT_ID('ExampleTable') NOT IN (SELECT OBJECT_ID from sys.fulltext_indexes)
CREATE FULLTEXT INDEX ON ExampleTable
(
    Text Language 1033
)
KEY INDEX PK_ExampleTable
ON ExampleFullTextCatalog
WITH CHANGE_TRACKING AUTO
GO

-- Wait for the full text index to populate for the example code
WHILE EXISTS (SELECT FULLTEXTCATALOGPROPERTY('ExampleFullTextCatalog','PopulateStatus') EXCEPT SELECT 0)
    CONTINUE


IF OBJECT_ID('ExampleView') IS NULL
EXEC ('CREATE VIEW ExampleView AS SELECT Text FROM ExampleTable')
GO

SELECT Text FROM ExampleTable WHERE CONTAINS(Text, 'ipsum')
GO

SELECT Text FROM ExampleView WHERE CONTAINS(Text, 'ipsum')
GO

DROP VIEW ExampleView
DROP FULLTEXT INDEX ON ExampleTable
DROP INDEX PK_ExampleTable ON ExampleTable
DROP TABLE ExampleTable
DROP FULLTEXT CATALOG ExampleFullTextCatalog

表中的第一个选择SELECT Text FROM ExampleTable WHERE CONTAINS(Text, 'ipsum'),返回

Text
--------------------------
Lorem ipsum doler sit amet

正如预期的那样。但是从视图中进行第二次选择SELECT Text FROM ExampleView WHERE CONTAINS(Text, 'ipsum')会导致以下错误:

Msg 7601, Level 16, State 2, Line 2
Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'ExampleView' because it is not full-text indexed.

数据库的兼容性级别为 100 (Sql Server 2008)。

4

1 回答 1

1

将 FTI 放在表上并创建与 FTI 一起使用的参数化表函数怎么样?您可以CROSS APPLY在视图内部的连接中使用将函数作为表连接,或者如果函数参数值对于使用视图是静态的,则仅在 where 子句中使用它。

于 2013-09-30T23:55:38.507 回答