【问题标题】:SQL database search -> calling multiple stored procedures / functionsSQL数据库搜索->调用多个存储过程/函数
【发布时间】:2012-10-19 04:08:42
【问题描述】:

背景

我目前正在重写一个搜索引擎...我最初是在几年前匆忙写的:)

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

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

问题

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

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

我想创造什么

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

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

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

【问题讨论】:

  • 您使用的是什么特定的数据库技术? MS、Oracle、MySql 等。
  • 在您的 spSearchUsers、spSearchOrganizations 等调用中返回什么?
  • 如果您的数据库和表结构允许这样做,那么您可以创建一个视图,将要搜索的字段、表的主键和其他所需信息放在一起。然后创建一个在视图上搜索的存储过程。
  • @seeker 基本上每个 sp 返回每个表的“SELECT *”。显然,每个表的列定义都非常不同:)
  • @Steve 我真的很喜欢这个主意...我没想到这一点(可能 b/c 我已经很长时间没有使用它们了。)谢谢

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


【解决方案1】:

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

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

  EXEC spSearchOrganizations @searchText
END

【讨论】:

    【解决方案2】:

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

    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
    

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

    Split Function in T-SQL
    Table Valued Parameters

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      相关资源
      最近更新 更多