Sql server SQL Server包含谓词-使用列值作为<;包含条件>;
重写使用Sql server SQL Server包含谓词-使用列值作为<;包含条件>;,sql-server,contains,Sql Server,Contains,重写使用包含谓词的现有进程时遇到问题。现有的进程正在使用光标,但速度非常慢,并且随着插入更多数据而变得越来越慢 我制作了一个简单的示例(下面的代码),其中包含两个表-一个是全文索引,另一个有一个列,用于标识从第一个表中选择行的包含条件 当前存储过程使用光标在第二个表中循环,设置@过滤器变量,然后使用包含从第一个表中查找匹配的行。问题是它运行了几个小时,而且越来越糟 为了加快进程,我尝试直接在列值上使用CONTAINS谓词,而不是经历光标的痛苦。。。但是我有一个语法错误。我的例子如下 我尝试实现了
包含谓词的现有进程时遇到问题。现有的进程正在使用光标
,但速度非常慢,并且随着插入更多数据而变得越来越慢
我制作了一个简单的示例(下面的代码),其中包含两个表-一个是全文索引,另一个有一个列,用于标识从第一个表中选择行的包含
条件
当前存储过程使用光标
在第二个表中循环,设置@过滤器
变量,然后使用包含
从第一个表中查找匹配的行。问题是它运行了几个小时,而且越来越糟
为了加快进程,我尝试直接在列值上使用CONTAINS
谓词,而不是经历光标的痛苦。。。但是我有一个语法错误。我的例子如下
我尝试实现了一个交叉应用
,还尝试编写了一个用户定义函数(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
就我所见,这只有在使用多语句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
那么下面的方法就行了
SELECT *
FROM TeamNeeds
CROSS APPLY [dbo].[ft_test] (Keywords) CA
尽管内联版本因“内联函数”而失败,但“x”不能接受相关参数或子查询,因为它使用全文运算符。”我删除了注释分隔符,以便使代码更具可读性。我也一直在寻找答案。我查看了stackoverflow和ms的文档,但看起来您不能包含(table1.col,table2.col)。您只能执行CONTAINS(table1.col,'text')或CONTAINS(table1.col,@some_text)。我希望有人来证明我错了。你知道怎么解决这个问题了吗?我也有同样的问题。