Хранимая процедура SQL Server для поиска с использованием различных полей и диапазона дат - PullRequest
0 голосов
/ 07 мая 2018

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

Вот моя хранимая процедура:

ALTER PROCEDURE getAssessmentDetails
    @admin VARCHAR(100),
    @SearchText VARCHAR(500) = '',
    @Status VARCHAR(500) = '',
    @Supervisor VARCHAR(500) = '',
    @Process VARCHAR(500) = '',
    @Skill VARCHAR(500) = '',
    @Designation VARCHAR(500) = '',
    @StartDate DATETIME = '',
    @EndDate DATETIME = ''
AS
BEGIN
    DECLARE @Query VARCHAR(MAX)=''
    DECLARE @Params VARCHAR(MAX)=''

    SELECT @StartDate = CONVERT(varchar, @StartDate, 120), @EndDate = CONVERT(varchar, @EndDate, 120)
    SET @Query = 'select * from ases_admin WITH(NOLOCK) where admin = '  + @admin + ' and timestamp between '+@StartDate+ ' and ' +@EndDate 

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF @SearchText<>''
    BEGIN
        SET @Params+=' AND (asesname LIKE ''%'+@SearchText+'%'' ) '
    END

    IF @Status<>''
    BEGIN
        SET @Params+=' AND asesstatus IN('+@Status+') '
    END

    IF @Supervisor<>''
    BEGIN
        SET @Params+=' AND supecode IN('+@Supervisor+') '
    END

    IF @Process<>''
    BEGIN
        SET @Params+=' AND procid IN('+@Process+') '
    END

    IF @Skill<>''
    BEGIN
        SET @Params+=' AND skid IN('+@Skill+') '
    END

    IF @Designation<>''
    BEGIN
        SET @Params+=' AND desigid IN('+@Designation+') '
    END

    EXEC (@Query+@Params)
END
GO

Когда я ввожу дату как @StartDate = '2018-02-08 'и @EndDate =' 2018-05-07 ', я получаю следующую ошибку -

Ошибка преобразования при преобразовании даты и / или времени из строки символов

FYI - я использую node.js с SQL Server и Angular.js

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вместо написания динамического запроса и проверки пустым для каждого параметра просто напишите обычный запрос и выполните. Например, просто напишите,

select * from ases_admin WITH(NOLOCK) where admin = @admin
and timestamp between @StartDate and  @EndDate
and (asesname LIKE' %'+@SearchText+'%' or @SearchText='')

последнее условие в скобках работает нормально, когда searchtext пусто '' или имеет некоторый текст. Вы можете добавить другие условия, подобные этому

0 голосов
/ 07 мая 2018

Вы пытаетесь объединить переменную DATETIME в строку.

Попробуйте это:

SET @Query = 'select * from ases_admin WITH(NOLOCK) where admin = '  + 
             @admin + ' and timestamp between '        + 
             CONVERT(VARCHAR,@StartDate, 121) + ' and ' +
             CONVERT(VARCHAR,@EndDate  , 121)           
0 голосов
/ 07 мая 2018

вам нужно заключить вашу строку даты в одинарные кавычки

+ ' and timestamp between ''' +@StartDate+ ''' and ''' +@EndDate+ '''' 
...