Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server包含谓词-使用列值作为<;包含条件>;_Sql Server_Contains - Fatal编程技术网

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)。我希望有人来证明我错了。你知道怎么解决这个问题了吗?我也有同样的问题。