包含对表变量或临时表的搜索

时间:2010-08-03 15:02:09

标签: sql-server

我正在尝试将持久表中的几个列连接到一个表变量的一列,这样我就可以运行一个contains(“foo”和“bar”)并得到一个结果,即使foo不在与栏相同的栏目。

但是,无法在表变量上创建唯一索引,因此没有全文索引来运行包含。

有没有办法动态地连接多个列并在它们上运行一个包含?这是一个例子:

declare @t0 table
(
    id uniqueidentifier not null,
    search_text varchar(max)
)

declare @t1 table ( id uniqueidentifier )

insert into
    @t0 (id, search_text)
select
    id,
    foo + bar
from
    description_table

insert into
    @t1
select
    id
from
    @t0
where
    contains( search_text, '"c++*" AND "programming*"' )

3 个答案:

答案 0 :(得分:2)

您不能在未配置为使用全文索引的表上使用CONTAINS,并且不能将其应用于表变量。

如果你想使用CONTAINS(而不是灵活性较低的PATINDEX),你需要将整个查询基于具有FT索引的表。

答案 1 :(得分:1)

您不能对表变量使用全文索引,但可以应用全文解析器。这样的事情能做你需要的吗?

declare @d table
(
id int identity(1,1),
testing varchar(1000)
)

INSERT INTO @D VALUES ('c++ programming')
INSERT INTO @D VALUES ('c# programming')
INSERT INTO @D VALUES ('c++ books')


SELECT id
FROM @D
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(testing,'"','""') + '"', 1033, 0,0)
where display_term in ('c++','programming')
GROUP BY id
HAVING COUNT(DISTINCT display_term)=2

注意:可能有更好的方法来使用解析器,但我无法弄明白。它的详细信息是at this link

答案 2 :(得分:0)

declare @table table
(
    id int,
    fname varchar(50)
)

insert into @table select 1, 'Adam James Will'
insert into @table select 1, 'Jain William'
insert into @table select 1, 'Bob Rob James'

select * from @table where fname like '%ja%' and fname like '%wi%'

是这样的吗。