Поведение процедуры SQL при наличии нескольких операторов if - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть такая хранимая процедура,

Create Procedure [dbo].[Get_Data](
@Id as Varchar(20),
@Type as Varchar(10)
)
As
Begin
  IF(@Type = 'skill')
  Begin 
   .....
   select * ....
  END

  IF(@Type = 'agent')
  Begin 
   .....
   select * ....
  END

  IF(@Type = 'skillProfile') 
  Begin 
    Print 'abc'
    select * ....
   .....
  END
END

Примечание : в любом из циклов if нет синтаксиса или любой другой ошибки, так как каждый select запрос внутри каждого циклауспешно протестированы.

Итак, теперь, когда я пытаюсь выполнить процедуру, используя команду, как показано ниже,

EXEC  [Get_Data] '1391520','skillProfile'

оператор print не печатается и не получает никаких строк в ответ, вместо этого я получаю сообщение Commands completed successfully.

Я попытался изменить последний (т.е. здесь третий) оператор if цикла, то есть с IF(@Type = 'skillProfile') на IF(@Type = 'profile'), и попытался выполнить как EXEC [Get_Data] '1391520','profile', который работал отлично!

Смутился с этим и попытался изменить первый цикл if и последний (третий) цикл if следующим образом: IF(@Type = 'skill') на IF(@Type = 'xyz') и IF(@Type = 'skillProfile') на IF(@Type = 'xyzProfile') и попытался выполнить как EXEC [Get_Data] '1391520','xyzProfile', что такжевсе работало нормально.

Теперь я совершенно сбит с толку, почему он не работает, когда я использую skill и skillProfile.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Использование Попробуйте блок catch, вы будете знать, где ошибка

Create Procedure [dbo].[Get_Data](
@Id as Varchar(20),
@Type as Varchar(10)
)
As
BEGIN TRY
    SET NOCOUNT ON
  IF(@Type = 'skill')
  Begin 
   .....
   select * ....
  END

  IF(@Type = 'agent')
  Begin 
   .....
   select * ....
  END

  IF(@Type = 'skillProfile') 
  Begin 
    Print 'abc'
    select * ....
   .....
 END TRY

BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber
     ,ERROR_SEVERITY() AS ErrorSeverity
     ,ERROR_STATE() AS ErrorState
     ,ERROR_PROCEDURE() AS ErrorProcedure
     ,ERROR_LINE() AS ErrorLine
     ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
0 голосов
/ 19 декабря 2018

Вы определили свой параметр как Varchar (10), что означает, что он не может содержать более 10 символов.Если вы попытаетесь присвоить ему более длинное значение, оно будет обрезано без предупреждения.Итак, вы пытаетесь выполнить вашу процедуру с @Type='skillProfi'.Решение состоит в том, чтобы увеличить размер вашего параметра, скажем varchar(100).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...