#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