Подобное не работает с определенным типом хранимой процедуры

#asp.net #sql-server

#asp.net #sql-сервер

Вопрос:

Я создал хранимую процедуру, которая использует формы из ASP.NET чтобы создать поиск по ключевым словам среди тысяч книг, которые у нас есть в нашей базе данных.

Проблема в том, что я унаследовал код от другого разработчика и должен использовать ее код. Я не могу переписать хранимую процедуру.

В результате я должен найти способ добавить оператор LIKE в следующую часть хранимой процедуры:

  Books      = @Books    OR @Books    IS NULL
  

Это потому, что @Books является частью формы, которую пользователь вводит при поиске по ключевым словам. Я посмотрел, как использовать оператор LIKE в хранимой процедуре, но ничего не применимо к этому типу кода.

Полная хранимая процедура приведена ниже:

  Create Procedure spSearchAuthors
 @FirstName nvarchar(100) = NULL,
 @LastName nvarchar(100) = NULL,
 @Books nvarchar(50) = NULL
 As
 Begin

 Select FirstName, LastName, Books from Authors where
 (FirstName = @FirstName OR @FirstName IS NULL) AND
 (LastName  = @LastName  OR @LastName  IS NULL) AND
 (Books      = @Books    OR @Books    IS NULL) 
 End
 Go
  

Комментарии:

1. Эрланд предоставил пространное обсуждение условий динамического поиска , которые должны помочь вам улучшить то, что у вас есть, а также добавить желаемую логику.

Ответ №1:

A LIKE имеет простой синтаксис: % , _ , [...]

В этом случае вы могли бы упростить его.
Путем объединения a % с обоими концами строковых переменных.

 CREATE Procedure spSearchAuthors
 @FirstName NVARCHAR(100) = NULL,
 @LastName NVARCHAR(100) = NULL,
 @Books NVARCHAR(50) = NULL
AS
BEGIN

    SELECT FirstName, LastName, Books 
    FROM Authors 
    WHERE (@FirstName IS NULL OR FirstName LIKE '%' @FirstName '%') 
      AND (@LastName IS NULL OR LastName  LIKE '%' @LastName '%') 
      AND (@Books IS NULL OR Books LIKE '%' @Books '%');

END;
GO
  

Использование динамического SQL сложнее.

 CREATE Procedure spSearchAuthors
 @FirstName NVARCHAR(100) = NULL,
 @LastName NVARCHAR(100) = NULL,
 @Books NVARCHAR(50) = NULL
AS
BEGIN

    DECLARE @DynSql NVARCHAR(800);
    DECLARE @ParmDefinition NVARCHAR(100);

    SET @DynSql = N'SELECT FirstName, LastName, Books FROM Authors';

    IF @FirstName IS NOT NULL
    BEGIN 
      SET @DynSql  = CHAR(10) 'WHERE FirstName LIKE @FirstName';
      SET @FirstName = N'%' @FirstName N'%';
    END;

    IF @LastName IS NOT NULL
    BEGIN
      IF @FirstName IS NULL 
        SET @DynSql  = CHAR(10) 'WHERE ';
      ELSE 
        SET @DynSql  = CHAR(10) 'AND ';

      SET @DynSql  = 'LastName LIKE @LastName';
      SET @LastName = N'%' @LastName N'%';
    END;

    IF @Books IS NOT NULL 
    BEGIN
      IF @FirstName IS NULL AND @LastName IS NULL
        SET @DynSql  = CHAR(10) 'WHERE ';
      ELSE
         SET @DynSql  = CHAR(10) 'AND ';

      SET @DynSql  = 'Books LIKE @Books';
      SET @Books = N'%' @Books N'%';
    END;   

    SET @ParmDefinition = N'@FirstName NVARCHAR(102), @LastName NVARCHAR(102), @Books NVARCHAR(52)';  

    EXECUTE sp_executesql @DynSql, @ParmDefinition, 
      @FirstName = @FirstName, 
      @LastName = @LastName, 
      @Books = @Books;
END;
GO