Сообщение 102, Уровень 15, Состояние 1, Процедура myProcedure, Строка 30 [Стартовая Строка 2] - PullRequest
0 голосов
/ 18 марта 2020

У меня есть хранимая процедура, когда я ее запускаю, я получаю эту ошибку:

Сообщение 102, Уровень 15, Состояние 1, Процедура myProcedure, Строка 30 [Строка пакетного запуска 2]
Неверный синтаксис рядом с ')'

Это мой код:

CREATE PROCEDURE myProcedure
    @StartDate Date,
    @EndDate Date,
    @LicenseRequestID int,
    @CRNumber nvarchar(40),
    @StatusID int
AS
BEGIN
    DECLARE @query nvarchar(4000)
    SET @query = 'SELECT LRM.StatusID,cast(CRI.CRNumber as nvarchar(40)) CRNumber ,CRI.NAMEAR     CompanyName,CRI.CityAR CityName,CRI.PhoneNumber,CRI.CreatedDate CRIDate,LRM.CreationDate    LicenseRequestDate,LRM.ID LicenseRequestID,O.UserName OwerName,O.Email,C.Message,SD.NAME STATUS from CR_Informations CRI
LEFT JOIN LicenseRequestMaster LRM ON LRM.CRNumber = CRI.CRNumber
LEFT JOIN [User] O ON O.ID = LRM.CRNUMBER
LEFT JOIN Comment C ON C.LicenseRequestID = LRM.ID AND O.ID = C.SenderID
INNER JOIN StatusDetail SD ON SD.StatusID = LRM.StatusID '+
(case when ((@LicenseRequestID  is null) and (@CRNumber is null) and (@StatusID  is null) )
then ''
else
   'where '+
   (case when @LicenseRequestID is not null
   then ' LRM.ID like '''+@LicenseRequestID +'%'''+
       (case when @CRNumber is not null then ' AND ' else '' end)
   else '' end)+
   (case when @CRNumber is not null
   then ' CRI.CRNumber like '''+@CRNumber+'%'''+
       (case when @StatusID is not null then ' AND ' else '' end)
   else '' end)+
   (case when @StatusID is not null
   then ' LRM.StatusID like '''+@StatusID +'%'''
   else '' end )
 end)

 EXEC sp_sqlexec @query

1 Ответ

1 голос
/ 19 марта 2020

Вы не END блокируете процедуру. Попробуйте:

CREATE PROCEDURE myProcedure
                 @StartDate Date,
                 ...
                 @StatusID int
AS
BEGIN
  DECLARE @query nvarchar(4000);
  SET @query = ...
  EXEC sp_sqlexec @query;
END;

Обратите внимание на END в конце.

Хотя есть и другие проблемы:

  • Вложенность CASE выражение может быть упрощено. Вы не уверены, что входы правильно экранированы.

  • Вы должны использовать sp_executesql с параметрами вместо конкатенации.

Но, скорее всего, динамика c SQL здесь действительно не нужна. Проверьте:

SELECT lrm.statusid,
       FROM cr_informations cri
            LEFT JOIN ...
       WHERE (@LicenseRequestID IS NULL
               OR lrm.id LIKE @LicenseRequestID + '%')
             AND (@CRNumber IS NULL
                   OR cri.crnumber LIKE @CRNumber + '%')
             AND (@StatusID IS NULL
                   OR lrm.statusid LIKE @StatusID + '%');

Это должно делать то, что вы хотите без динамического c SQL.

Операции LIKE с целыми числами сомнительны. Вы действительно хотите включить, например, 12345, когда целочисленный параметр равен 1? Вы, вероятно, просто хотите = для них.

...