【问题标题】:SQL Server 2014 using variables in CONTAINS error Msg 7645 Null or empty full-text predicateSQL Server 2014 在 CONTAINS 错误消息 7645 Null 或空全文谓词中使用变量
【发布时间】:2016-01-22 03:11:55
【问题描述】:

我正在使用带有 FileTable 的 SQL Server 2014 Express。我正在尝试根据文件是否包含基于飞机注册标记的特定关键字,从文件表(非结构化,pdf)中选择文件:

--SET VARIABLE FOR A REGISTRATION MARK
DECLARE @Reg nvarchar(10)
SET @Reg = 'PH-BGA'

--SET VARIABLE FOR MANUFACTURER OF REGISTRATION MARK
DECLARE @Manufacturer nvarchar(10) = NULL
SELECT FleetInfoKLM.Manufacturer FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg;
SET @Manufacturer = '""'

--SET VARIABLE FOR FAMILY OF REGISTRATION MARK
DECLARE @Family nvarchar(10) = NULL
SELECT FleetInfoKLM.Family FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg;
SET @Family = '""'

--SET VARIABLE FOR SERIES OF REGISTRATION MARK
DECLARE @Series nvarchar(10) = NULL
SELECT FleetInfoKLM.Series FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg;
SET @Series = '""'

--SELECT MAINTENANCE DOCUMENTS BASED ON VARIABLES FOR MANUFACTURER, FAMILY AND SERIES
SELECT MaintenanceDocumentation.name FROM MaintenanceDocumentation
WHERE ((@Manufacturer = '""') AND CONTAINS(file_stream, @Manufacturer)) 
    AND ((@Family = '""') AND CONTAINS(file_stream, @Family))
    AND ((@Series = '""') AND CONTAINS(file_stream, @Series))

如果没有 SET @VARIABLE = '""' 我收到错误消息 7645 Null 或空全文谓词。因此,我添加了 SET @VARIABLE = '""',因为在这个问题 7645 Null or empty full-text predicate 中找到了它作为解决方案。但是,现在结果集是空的(没有找到文档),而我知道应该有结果。变量设置正确,在本例中分别为波音、737 和 800。如果我将变量替换为字符串(例如“波音”)作为 CONTAINS 中的参数,我确实得到了预期的结果。

有人知道问题出在哪里吗?除了使用 SET @VARIABLE = '""' 避免错误之外,已经搜索了几个小时而没有结果。

【问题讨论】:

  • 你为什么不在你的语句末尾使用分号;?
  • 老实说,我什至没有考虑过,因为代码有效。显然不需要msdn.microsoft.com/en-us/library/ms177563.aspx,但我会添加它们。
  • 您在此处发布代码并添加随机 SET 语句。 代码不起作用
  • 您发布的链接也显示了大多数语句。它还说将在未来是必需的。
  • 同意,这就是我现在添加它们的原因。我添加了 SET 语句,因为有类似问题的其他人使用它并且它有效。对我来说,我从一个错误转到一个空的结果集。这是进步,但显然不是我想要的。如果我将 CONTAINS 语句中的变量替换为字符串,它确实有效。我对此很陌生,而且我在网上找到的东西到目前为止还不能让它工作。

标签: sql-server


【解决方案1】:

好的,我终于通过将 SET 语句更改为 SET @variable = (SELECT ..) 来修复它:

--SET VARIABLE FOR A REGISTRATION MARK
DECLARE @Reg nvarchar(10);
SET @Reg = 'PH-BGO';

--SET VARIABLE FOR MANUFACTURER OF REGISTRATION MARK
DECLARE @Manufacturer nvarchar(100);
SET @Manufacturer = (SELECT FleetInfoKLM.Manufacturer FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg);

--SET VARIABLE FOR FAMILY OF REGISTRATION MARK
DECLARE @Family nvarchar(100);
SET @Family = (SELECT FleetInfoKLM.Family FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg);

--SET VARIABLE FOR SERIES OF REGISTRATION MARK
DECLARE @Series nvarchar(100);
SET @Series = (SELECT FleetInfoKLM.Series FROM FleetInfoKLM WHERE FleetInfoKLM.Reg = @Reg);

--SHOW LOCAL VARIABLES VALUES
SELECT @Manufacturer;
SELECT @Family;
SELECT @Series;

--SELECT MAINTENANCE DOCUMENTS BASED ON VARIABLES FOR MANUFACTURER, FAMILY AND SERIES
SELECT MaintenanceDocumentation.name FROM MaintenanceDocumentation
WHERE MaintenanceDocumentation.path_locator IS NOT NULL
    AND CONTAINS(file_stream, @Manufacturer)
    AND CONTAINS(file_stream, @Family)
    AND CONTAINS(file_stream, @Series);

不需要 SET @variable = '""' 语句。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2012-09-06
    • 2016-01-03
    • 2015-02-05
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多