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

予想通り。しかし、ビューからの 2 番目の選択で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