Вместо того, чтобы делать динамический SQL (который создает целый ряд проблем, и часто фактически не требуется), вы можете просто использовать параметры и некоторые проверки NULL как часть вашего предложения WHERE, используя несколько различных методов, в зависимости отна то, что вы пытаетесь сделать.Я проверил это с помощью SQL 2000/2005, и он работает правильно (я также предположил бы, что это хорошо в 2008 / R2).
ALTER PROCEDURE [dbo].[usp_BookItemSearch]
@BookSKU varchar(30) = NULL
,@SearchType int = NULL
,@PubNum varchar(10) = NULL
,@UserID int = NULL
,@StartDate smalldatetime = NULL
,@EndDate smalldatetime = NULL
AS
SELECT RecID, PubNum, VendorName, InvoiceNum, BookSKU, RecAddDate
FROM [tb_BookInventoryLog]
WHERE (
(@BookSKU IS NULL) OR
(BookSKU LIKE CASE @SearchType
WHEN 0 THEN @BookSKU + '%'
WHEN 1 THEN '%' + @BookSKU + '%'
WHEN 2 THEN '%' + @BookSKU
END
)
)
AND ISNULL(@PubNum, PubNum) = PubNum
AND ISNULL(CAST(@UserID AS VARCHAR), UserID) = UserID
AND (
(@StartDate IS NULL OR @EndDate IS NULL) OR
(JoiningDate BETWEEN @StartDate AND @EndDate)
)
AND RecAddDate BETWEEN CASE
WHEN @EndDate IS NULL THEN RecAddDate
ELSE ISNULL(@StartDate, '01/01/2000')
END
AND ISNULL(@EndDate, GETDATE())
ORDER BY BookSKU, PubNum