Мне нужна помощь в разрешении сложного SQL-запроса. Я пытаюсь создать запрос один vlock за раз. Одна проблема:: Если параметр для @PubNum равен NULL, запрос показывает «..... где PubNum =», что является проблемой. Что мне нужно, если параметр NULL, тогда PubNum не должен быть . в пункте гдеСложный динамический SQL-запрос
Второй вопрос:
- Если @StartDate НЕ NULL и @EndDate IS NOT NULL THEN RecAddDate МЕЖДУ @StartDate и @EndDate
- Если @StartDate НЕ NULL и @EndDate IS NULL THEN RecAddDate BETWEEN @StartDate И сегодня
- Если @StartDate IS NULL и @EndDate IS NOT NULL THEN RecAddDate МЕЖДУ '01/01/2000' И @EndDate
- Если @StartDate IS NULL и @EndDate IS NULL THEN RecAddDate МЕЖДУ '01/01/2000' AND Сегодня
Любые идеи?
Полный запрос:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
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
DECLARE @SQL as varchar(4000)
SET @SQL = 'SELECT RecID, PubNum, VendorName, InvoiceNum, BookSKU, RecAddDate FROM tb_BookInventoryLog]'
IF @BookSKU IS NOT NULL
BEGIN
IF @SearchType = 2
BEGIN
SET @SQLClause = ' WHERE BookSKU LIKE ''%' + @BookSKU + '''' --Ends with
END
IF @SearchType = 1
BEGIN
SET @SQLClause = ' WHERE BookSKU LIKE ''%' + @BookSKU + '%''' --Contains
END
IF @SearchType = 0
BEGIN
SET @SQLClause = ' WHERE BookSKU LIKE ''' + @BookSKU + '%''' --Starts with
END
END
IF @PubNum IS NOT NULL
BEGIN
IF @SQLClause IS NOT NULL
BEGIN
SET @SQLClause = @SQLClause + ' AND PubNum = ''' + @PubNum + ''''
END
ELSE
BEGIN
SET @SQLClause = @SQLClause + ' WHERE PubNum = ''' + @PubNum + ''''
END
END
IF @UserID IS NOT NULL
BEGIN
IF @SQLClause IS NOT NULL
BEGIN
SET @SQLClause = @SQLClause + ' AND (UserID = ' + CAST(@UserID AS VarChar) + ')'
END
ELSE
BEGIN
SET @SQLClause = @SQLClause + ' WHERE (UserID = ' + CAST(@UserID AS VarChar) + ')'
END
END
If (@StartDate Is Not Null) AND (@EndDate Is Not Null)
BEGIN
Set @SQLClause = @SQLClause + ' And (JoiningDate BETWEEN @StartDate AND @EndDate)'
END
IF (@EndDate IS NOT NULL)
BEGIN
IF (@StartDate IS NOT NULL)
BEGIN
SET @SQL = @SQL + ' WHERE RecAddDate between' + CAST(@StartDate As smalldatetime) + ' AND ' + CAST(@EndDate as smalldatetime) + ''
END
ELSE
BEGIN
SET @SQL = @SQL + ' RecAddDate BETWEEN 01/01/2000 AND @EndDate + '
END
END
SET @SQL = @SQL + @SQLClause + ' ORDER BY BookSKU, PubNum'
PRINT @SQL
--EXECUTE (@SQL)
Хммм, это в основном то, что вы уже делаете. Вы уверены, что не получаете '' (пустую строку) для @PubNum, а не NULL?Другим намеком на это является тот факт, что базовая конкатенация строк, например «select» a + NULL, полностью возвращает NULL (я думаю, по умолчанию, вы можете изменить это поведение), поэтому в вашем случае я действительно думаю, что вы получаете ' для @PubNum, где вы ожидаете NULL. – Rob
Правильно, я получаю пустую строку. Я хочу, чтобы PubNum НЕ SHOW в предложении where, если переданное значение равно null. – user279521
Разве это не две разные вещи, которые вы описываете? Ваш тест рассчитан на значения NULL, которые должны работать нормально. Но вы получаете пустую строку, которая не является NULL, поэтому она проходит этот тест и дает вам нежелательный результат. Добавьте тест, например, IF @PubNum IS NOT NULL AND @PubNum <> '', возможно, это ваше решение. – Rob