Pat*_*ers 8 sql-server contains
我在重写使用CONTAINS谓词的现有流程时遇到问题.现有的进程正在使用a CURSOR,但它确实很慢,并且随着插入更多数据而变慢.
我编写了一个包含两个表的简单示例(下面的代码) - 一个是全文索引,另一个是列,用于标识CONTAINS从第一个中选择行的条件.
当前存储过程使用a CURSOR循环遍历第二个表,设置@filter变量,然后用于CONTAINS定位匹配的第一个表中的行.问题是它运行了几个小时,而且情况越来越糟.
为了加快这个过程,我尝试CONTAINS直接在列值上使用谓词,而不是经历光标的痛苦......但是我得到了一个语法错误.我的例子如下.
我试图实现一个CROSS APPLY,我也尝试写一个用户定义的函数(fnCONTAINS)没有运气.
IF ( object_id('Players') IS NOT NULL )
DROP TABLE Players
go
IF ( object_id('TeamNeeds') IS NOT NULL )
DROP TABLE TeamNeeds
go
-- create fulltext catalog ft as default
go
CREATE TABLE Players
(
PlayerID INT IDENTITY(1, 1),
PlayerName VARCHAR(20),
PlayerPositions VARCHAR(60)
)
go
CREATE UNIQUE INDEX IXPlayerID
ON Players( PlayerID )
go
CREATE fulltext INDEX ON Players(PlayerPositions) KEY INDEX IXPlayerID
go
INSERT Players
(PlayerName,
PlayerPositions)
VALUES( 'Patrick Travers',
'Pitcher,Left Field,Center Field,Right Field,Shortstop' )
go
CREATE TABLE TeamNeeds
(
TeamID INT,
Keywords VARCHAR(50)
)
go
INSERT TeamNeeds
(TeamID,
Keywords)
VALUES( 1,
'"Center Field" and "Shortstop" and "Pitcher"' )
go
WAITFOR delay '00:00:05'
go -- Give the Full Text Index process time to populate the catalog
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Player,
TeamNeeds
WHERE CONTAINS(PlayerPositions, Keywords)
go -- Syntax error on Keywords...
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Players,
TeamNeeds
WHERE CONTAINS(PlayerPositions, '"Center Field" and "Shortstop" and "Pitcher"')
go -- Works just fine, but requires setting an explicit search expression for every search, which is terribly slow
Run Code Online (Sandbox Code Playgroud)
据我所知,这只能通过多语句 TVF 实现。
创建以下函数
CREATE FUNCTION [dbo].[ft_test] (@Keywords VARCHAR(50))
RETURNS @ReturnTable TABLE (
PlayerID INT,
PlayerName VARCHAR(20),
PlayerPositions VARCHAR(60))
AS
BEGIN
INSERT INTO @ReturnTable
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Players
WHERE CONTAINS(PlayerPositions, @Keywords)
RETURN
END
Run Code Online (Sandbox Code Playgroud)
然后以下工作正常
SELECT *
FROM TeamNeeds
CROSS APPLY [dbo].[ft_test] (Keywords) CA
Run Code Online (Sandbox Code Playgroud)
尽管内联版本失败,并显示“内联函数“x”无法采用相关参数或子查询,因为它使用全文运算符”。