【问题标题】:Search database with multiple options具有多个选项的搜索数据库
【发布时间】:2011-10-06 15:19:31
【问题描述】:

我使用带有高级服务的 SQL Server 2008 Express。我有一个看法:

IF EXISTS (select * from sys.views where object_id = object_id(N'[dbo].[vw_PersonDetails]'))
    DROP VIEW vw_PersonDetails
GO

CREATE VIEW vw_PersonDetails
AS
    SELECT
        p.PersonID, p.Title, 
        p.FirstName, p.LastName,
        a.AddressLine1, a.AddressLine2, a.AddressLine3, a.AddressLine4,
        a.Country, a.PostalCode, 
        a.PhoneNumber, a.Email, p.EntryDate
    FROM  
        [dbo].[Persons] p
    INNER JOIN 
        [dbo].[Address] a ON p.PersonID = a.PersonID
GO

现在我必须使用每个列作为选项来搜索此视图。

例如:

IF (@firstName != NULL OR @firstName != '') AND 
   (@lastName != NULL OR @lastName != '') AND 
   (@addressLine1 != NULL OR @addressLine1 != '') AND 
   (@postalCode != NULL OR @postalCode != '') AND 
   (@country != NULL OR @country != '') AND
   (@phoneNumber != NULL OR @phoneNumber != '') AND 
   (@email != NULL OR @email != '') AND 
   (@entryDate != NULL)
BEGIN
    SELECT * 
    FROM dbo.vw_PersonDetails 
    WHERE 
        (FirstName LIKE [dbo].[GetSearchString](@firstName) OR
        LastName LIKE [dbo].[GetSearchString](@lastName) OR
        AddressLine1 LIKE [dbo].[GetSearchString](@addressLine1) OR
        Country LIKE [dbo].[GetSearchString](@country) OR
        PostalCode LIKE [dbo].[GetSearchString](@postalCode) OR
        PhoneNumber LIKE [dbo].[GetSearchString](@phoneNumber) OR
        Email LIKE [dbo].[GetSearchString](@email) OR
        EntryDate = @entryDate
       )
END

除了在存储过程中编写永无止境的 IF-ELSE-IF 跟踪或动态构建查询之外,现在还有其他选择。请帮忙。

另一个问题是什么会更好:编写这样的存储过程或从代码中进行动态查询。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您可以在一个简单的查询中完成:

    SELECT * from dbo.vw_PersonDetails WHERE (
        (@firstName IS NULL OR @firstName = '' OR FirstName like @firstName) AND
        ... (same thing for other parameters)
    

    这将起作用,因为 SQL Server 足够智能,可以以预期的方式短路评估。但是,规范实际上并不能保证这一点。

    如果您想安全起见,可以通过执行以下操作强制执行评估顺序:

    SELECT * from dbo.vw_personDetails WHERE (
        (CASE 
            WHEN @firstname IS NULL THEN 1
            WHEN @firstname='' THEN 1
            WHEN FirstName like @firstName THEN 1
            ELSE 0
         END=1) AND
        .... (same thing for other parameters)
    

    【讨论】:

      【解决方案2】:

      您需要填充所有 SearchString 才能运行查询(因为 IF 语句中的 AND 条件)。

      无论参数是否传递,您都可以创建一个动态查询来运行:

      DECLARE @sqlCommand VARCHAR(MAX)
      SELECT @sqlCommand = 'SELECT * FROM dbo.vw_PersonDetails WHERE 1=1'
      
      IF  (@firstName != NULL OR @firstName != '') SELECT @sqlCommand = @sqlCommand + ' AND FirstName LIKE [dbo].[GetSearchString](@firstName)'
      IF  (@lastName != NULL OR @lastName != '') SELECT @sqlCommand = @sqlCommand + ' AND LastName LIKE [dbo].[GetSearchString](@lastName)'
      IF  (@addressLine1 != NULL OR @addressLine1 != '') SELECT @sqlCommand = @sqlCommand + ' AND AddressLine1 LIKE [dbo].[GetSearchString](@addressLine1)'
      
      .....
      
      EXEC (@sqlCommand)
      

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多