SQL Server 2012全文搜索Sproc

时间:2013-11-02 16:29:28

标签: sql sql-server tsql sql-server-2012

我的数据库中有许多具有全文目录的表。我刚刚创建了一个新的,但由于某种原因,这个没有用。

目录的创建方式如下:

GO
CREATE FULLTEXT CATALOG LicenseeName_catalog AS DEFAULT;
GO

CREATE FULLTEXT INDEX ON Licensees
 ( 
  CompanyName Language 1033
 ) 
  KEY INDEX [PK_dbo.Licensees] ON LicenseeName_catalog WITH CHANGE_TRACKING AUTO
GO

我的存储过程如下所示:

CREATE PROCEDURE [dbo].[LicenseeSearch] @inputterm NVARCHAR(256), 
                                       @includeNonSearchable BIT, 
                                       @skip INT, 
                                       @take INT
AS
BEGIN
    SET NOCOUNT ON;

DECLARE @searchterm NVARCHAR(256)

SET @searchterm = '"' + @inputterm + '*"'
    SELECT * FROM 
        [dbo].[Licensees] lic
    WHERE CONTAINS(lic.*, @searchterm)
END

显然,正如我的其他目录按预期工作一样,正确安装了全文。我已经完成了索引的完全重建。奇怪的是目录创建和sprocs在结构方面或多或少相同,所以为什么一个不起作用?

除非我犯了错误,否则我错过了。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

CREATE PROCEDURE [dbo].[LicenseeSearch] @inputterm NVARCHAR(256), 
                                       @includeNonSearchable BIT, 
                                       @skip INT, 
                                       @take INT
AS
BEGIN
    SET NOCOUNT ON;


DECLARE @searchterm NVARCHAR(256);
DECLARE @Sql NVARCHAR(MAX);

SET @searchterm = '"' + @inputterm + '*"'


SET @Sql=   'SELECT * FROM 
        [dbo].[Licensees] lic
    WHERE CONTAINS(lic.*,'''+ @searchterm +''')'

    EXECUTE sp_executesql @Sql
END

尝试这样做是因为当您将@searchterm传递给查询时,它会将参数传递为“SomeValue *”,其中查询期望类似于“SomeValue *”的内容,这就是恶魔动态sql的用武之地。