【问题标题】:Combine two stored procedures to perform separate SQL Server database searches组合两个存储过程以执行单独的 SQL Server 数据库搜索
【发布时间】:2015-10-06 02:30:01
【问题描述】:

我正在使用存储过程搜索 SQL Server 数据库。我让它在搜索房屋名称的文本框的转发器中完美显示。在代码中,您可以看到它会查找一个存储过程来进行搜索。任何人都可以帮助如何将两个存储过程合二为一吗?它们都单独工作,但我需要让一个存储过程能够进行两种搜索。标记为townland 的下拉列表是单独的。

代码:

public void DisplaySearchResults(string strSearch)
{
    // Display search results in repeater
    SqlCommand cmd = new SqlCommand("spiSearchByString", new SqlConnection("Data Source=MAYDDD;Initial Catalog=HOB;Persist Security Info=True;User ID=ID; Password=password"));
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@SearchString", strSearch);

    cmd.Connection.Open();

    rptDataSearch.DataSource = cmd.ExecuteReader();
    rptDataSearch.DataBind();
}

搜索名字的存储过程:

CREATE PROCEDURE dbo.spiSearchByString
    @SearchString varchar(50)
AS 
    SELECT 
        Houses.Name, Houses.Id, Houses.Townland, 
        Houses.Near, Houses.Status, Houses.Built, Houses.Image  
    FROM 
        Houses
    WHERE 
        (Houses.Name LIKE '%' + @SearchString + '%' OR 
         Houses.Id LIKE '%' + @SearchString + '%')
    ORDER BY 
        Houses.Name 

    RETURN

搜索附近的存储过程:

CREATE PROCEDURE dbo.NearSearch
    @SearchString varchar(50)
AS 
    SELECT 
        Houses.Name, Houses.Id, Houses.Townland, Houses.Near, 
        Houses.Status, Houses.Built, Houses.Image  
    FROM 
        Houses
    WHERE 
        (Houses.Near LIKE '%' + @SearchString + '%' 
         OR Houses.Id LIKE '%' + @SearchString + '%')
    ORDER BY 
        Houses.Name 

    RETURN

【问题讨论】:

  • 您使用的是什么 SQL 服务器和版本? .NET 框架版本和 ASP.NET 版本是什么?
  • 使用 SQL server 2008 和 .Net 4.5 @cxw
  • 您的意思是应该始终执行这两个搜索吗?或者你的意思是你想要一个可以处理两个搜索的单一过程。即用户只会执行“Near”或“Name”搜索,但 proc 会处理两者。
  • 或者您是否想要一个存储过程返回同时符合 Name 和 Near 条件(如果有)的房屋?
  • 是的,你有它。我正在寻找如何编写一个存储过程来返回同时符合 Name 和 Near 条件(如果有的话)的房屋。这两个存储过程我已经单独完美地工作了,所以如果有办法将它们结合起来。 @cxw

标签: sql asp.net sql-server search stored-procedures


【解决方案1】:

您可以使用一个 proc 来执行以下过程。它接受两个参数,并基于哪个参数为 NULL。返回相关数据。它还允许同时指定两者,并允许通过Name 和Near 过滤数据。

CREATE PROCEDURE dbo.CombinedSearch
(
    @HouseNearSearch VARCHAR(50) = NULL,
    @HouseNameSearch VARCHAR(50) = NULL
)
AS
    SELECT
        Houses.Name
        ,Houses.Id
        ,Houses.Townland
        ,Houses.Near
        ,Houses.Status
        ,Houses.Built
        ,Houses.IMAGE
    FROM Houses
    WHERE (@HouseNear IS NULL OR (Houses.Near LIKE '%' + @HouseNearSearch + '%' OR Houses.Id LIKE '%' + @HouseNearSearch + '%'))
 OR   (@HouseName IS NULL OR  (Houses.Name LIKE '%' + @HouseNameSearch + '%' OR Houses.Id LIKE '%' + @HouseNameSearch + '%'))
    ORDER BY Houses.Name
    RETURN

您的代码将需要更新以确定将搜索字符串分配给哪个参数。

【讨论】:

  • 这是有效的,但只显示一个结果,最多有十个。 @Xtrnts
  • 只需将WHERE (something) AND (something) 更改为OR
  • 但是在你的评论中你说你想要匹配BOTH。我认为应该是 OR,否则您应该在 sqlFiddle 中提供一些数据样本
  • 刚刚编辑了我的帖子。正如@JuanCarlosOropeza 所说,应该是 OR 而不是 AND。
  • @Xtrnts - 先生们,谢谢。完美运行。
【解决方案2】:

过去,我曾研究过使用单个数据读取器返回多个记录集的解决方案。您可能必须创建并调用一个包含存储过程,该过程接受所有参数并依次调用这两个过程。然后,您可以按照此代码示例在一次调用中读取每个结果集; How To Handle Multiple Results by Using the DataReader in Visual C# .NET

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多