SQL数据库搜索 - >调用多个存储过程/函数

时间:2012-10-29 19:43:49

标签: c# sql-server search stored-procedures

背景

我目前正在重新编写一个搜索引擎......几年前我原本写的很匆忙:)

今天,搜索包含~5个不同的内部业务对象/表:用户,组织,新闻标题等。因此,当用户在搜索框中输入"The Quick Brown Fox"时,他/她将获得每个业务对象的类型。

每个业务对象都有一个关联的存储过程:spSearchUsersspSearchOrganizations等。

问题

现在,对于每次搜索,我为每个业务对象类型多次调用每个存储过程(通过BL - >数据访问层)。例如,当用户搜索"The Quick Brown Fox"时,我会不加改变地发送整个字符串,但也会在每个单独的空格中拆分字符串,并单独搜索每个单词。

在这种情况下,每个存储过程被调用5次...总共25个单独的数据库调用进行单次搜索。我不觉得这是典型的...但它仍然运行得很快。每次搜索大约需要4-5秒。

我想创建什么

单个“主”存储过程,它接受整个搜索字符串"The Quick Brown Fox",后者又调用每个业务对象存储过程(spSearchUsersspSearchOrganizations等),执行一点一点逻辑,并返回1个结果集。

所以1搜索... 1结果。

可以使用存储过程,函数和/或用户定义的表类型来实现吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是Ms-Sql,则可以创建Full Text Index,以便您可以使用所有条款进行搜索,而无需更改文本。此外,存储过程可以返回多个结果集,因此您可以创建一个新的存储过程来运行每个查询并返回所有记录,或者单独调用所有以前的存储过程(如下所示)。

CREATE PROCEDURE [dbo].[DoMassiveSearch]
@searchText varchar(200) = null
AS
BEGIN
  EXEC spSearchUsers @searchText

  EXEC spSearchOrganizations @searchText
END

答案 1 :(得分:0)

假设您可以创建这样的视图

CREATE VIEW vSearchFields
as

    SELECT "U" as tableName, IDUser as ID, UserName as searchField 
    FROM USERS

UNION

    SELECT "O" as tableName, IDOrganizations as ID, OrgName as searchField
    FROM Organizations

UNION

    SELECT 'N' as tableName, IDNews as ID, newsText as searchField
    FROM News 

UNION

    SELECT 'H' as tableName, IDHeadline as ID, headlineText as searchField
    FROM Headlines

现在您可以编写一个简单的存储过程来搜索seachField中的文本

CREATE PROCEDURE [dbo].[searchText]
@textToSearch nvarchar(2000)
AS
BEGIN
    SELECT * FROM vSearchFields WHERE searchField = @textToSearch
END

下一步将引入一个函数来拆分输入文本并使用文本部分进行重复搜索,或者,如果您的db版本允许(2008及之后),则使用表值参数传递分割string作为从C#代码到存储过程的表。

Split Function in T-SQL
Table Valued Parameters

相关问题