我有一个数据库表,主列定义为:
ID bigint identity primary key
我还有一个文本列MiddlePart
。我正在尝试创建一个全文索引,如下所示:
CREATE FULLTEXT INDEX ON domaining.dbo.DomainName
(
MiddlePart
Language 0X0
)
KEY INDEX ID ON domaincatalog
WITH CHANGE_TRACKING AUTO
我收到此错误:
'ID'不是强制执行全文搜索键的有效索引。全文搜索键必须是唯一的,不可为空的单列索引,该索引不脱机,未在非确定性或不精确的非持久计算列上定义,没有过滤器,最大大小为900字节。为全文键选择另一个索引。
我做错了什么?
答案 0 :(得分:34)
在KEY INDEX之后,您需要指定索引的名称而不是列。要在列ID上查找索引的名称,请键入sp_help DomainName
,该表上将有一个索引列表。 pk将被命名为PK_xxxxx。使用该索引名称而不是“ID”。
答案 1 :(得分:5)
指定索引的名称,而不是指定列名。您可以找到主键索引的名称,如:
select name from sysindexes where object_id('DomainName') = id
然后你可以创建一个全文索引,如:
CREATE FULLTEXT INDEX ON DomainName
(
MiddlePart
Language 0X0
)
KEY INDEX PK__DomainName__40E497F3 ON domaincatalog
WITH CHANGE_TRACKING AUTO
答案 2 :(得分:1)
https://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/
CREATE TABLE ProductDocs (
DocID INT NOT NULL IDENTITY,
DocTitle NVARCHAR(50) NOT NULL,
DocFilename NVARCHAR(400) NOT NULL,
FileExtension NVARCHAR(8) NOT NULL,
DocSummary NVARCHAR(MAX) NULL,
DocContent VARBINARY(MAX) NULL,
CONSTRAINT [PK_ProductDocs_DocID] PRIMARY KEY CLUSTERED (DocID ASC)
)
CREATE FULLTEXT INDEX ON ProductDocs
(DocSummary, DocContent TYPE COLUMN FileExtension LANGUAGE 1033)
KEY INDEX PK_ProductDocs_DocID
ON ProductFTS
WITH STOPLIST = SYSTEM
该语句的第一行包含ON子句,该子句指定表名(在本例中为ProductDocs)。该语句的下一行是应该编制索引的列的列表(DocSummary和DocContent)。
前面示例中CREATE FULLTEXT INDEX语句的下一行是KEY INDEX子句。这是在ProductDocs表上定义的唯一键索引(在本例中为PK_ProductDocs_DocID)的名称。在定义全文索引时,请务必指定索引名称,而不是列名。
在全文索引定义中的KEY INDEX子句之后是ON子句,它指定索引将加入的全文目录(ProductFTS)的名称。在SQL Server 2008中,您还可以指定将存储索引的文件组。但是,此选项在SQL Server 2005中不可用,因为文件组关联位于目录级别。
示例CREATE FULLTEXT INDEX语句中的最后一个子句是WITH STOPLIST。此选项仅在SQL Server 2008中可用,允许您指定将用于此索引的停止列表的名称。在这种情况下,使用系统停止列表,但您可以改为指定用户定义的停止列表。 (本文稍后将详细介绍停止名单。)