我正在尝试将持久表中的几个列连接到一个表变量的一列,这样我就可以运行一个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*"' )
答案 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%'
是这样的吗。