sp_ExecuteSql: параметризованный запрос ожидает параметр @XX, который не был предоставлен.

Я пытаюсь создать динамическую хранимую процедуру, позволяющую передать мою строку where как часть параметра. Однако после этой статьи из MSDN я так и не смог запустить ее. и с ошибкой, как описано в заголовке. Любая помощь горячо приветствуется.

EXEC    [dbo].[Get_Demand_By_Click_Test]        
        @Year = 2014

Ошибка:

Сообщение 8178, уровень 16, состояние 1, строка 9
Параметризованный запрос '(@Year int)
SELECT
dbo.vw_Demand_By.*
FROM '
ожидает параметр '@Year' , который не был поставлен.

Хранимая процедура:

  ALTER PROCEDURE [dbo].[Get_demand_by_click_test]
     @Year INT
  AS
  BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET nocount ON;

      -- Insert statements for procedure here
      DECLARE @SQL             NVARCHAR(max),
              @ParamDefinition NVARCHAR(max)

      SET @SQL = N'
SELECT       
dbo.vw_Demand_By.*

FROM            
dbo.vw_Demand_By 

WHERE  
Year(EventStartDate) = @Year'

   SET @ParamDefinition = N'@Year int';

      EXECUTE Sp_executesql
        @SQL,
        @ParamDefinition;
  END 

person user3840039    schedule 15.07.2014    source источник


Ответы (2)


Вам нужно указать значение параметра @Year. Для выполнения кода используйте:

  EXECUTE Sp_executesql
    @SQL,
    @ParamDefinition,
    @Year = 2014

ОБНОВЛЕНИЕ В ответ на ваши комментарии вы можете назначить любую переменную вместо фиксированного значения 2014 года. В вашем коде это будет выглядеть так:

  ALTER PROCEDURE [dbo].[Get_demand_by_click_test]
     @Year INT
  AS
  BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET nocount ON;

      -- Insert statements for procedure here
      DECLARE @SQL             NVARCHAR(max),
              @ParamDefinition NVARCHAR(max)

      SET @SQL = N'

SELECT       
dbo.vw_Demand_By.*

FROM            
dbo.vw_Demand_By 

WHERE  
Year(EventStartDate) = @Year'

   SET @ParamDefinition = N'@Year int';

      EXECUTE Sp_executesql
        @SQL,
        @ParamDefinition,
        @Year = @Year
  END 
person Dimt    schedule 15.07.2014
comment
TYVM, я думаю, что это решение. В завершение вопроса: если я также добавлю строку запроса параметра, например, '@Wheres = 'Status = ''Cancelled''' в конец моего '@SQL, включу ли я также это '@Wheres в мой '@ParamDefinition? Я обновляю свой вопрос для этой дальнейшей части. - person user3840039; 15.07.2014
comment
@Wheres = 'Status = 'Cancelled' неверно. Вы можете либо жестко запрограммировать предикат на Status = 'Cancelled', либо использовать такой параметр, как Status = @Wheres. Чтобы выполнить строку SQL, вы должны передать точное количество параметров. Поэтому, если вы добавите в свой @SQL @Wheres, вам также необходимо включить это в @ParamDefinition. - person Dimt; 15.07.2014
comment
Это правильный синтаксис, который объявляет параметр и SQL. - person user3840039; 21.07.2014

Вы также должны передать параметр:

EXECUTE Sp_executesql @SQL, @ParamDefinition, @Year = @Year;
person Andomar    schedule 15.07.2014
comment
Спасибо за ответ. Что, если я собираюсь создать динамическую SP, чтобы @Year была переменной. Как я могу это сделать? - person user3840039; 15.07.2014
comment
Вы уже сделали это. Но когда вы запускаете свой динамический SQL, вы должны указать значение для своей переменной. - person Andomar; 15.07.2014
comment
Привет, Андомар, я могу вас неправильно понять, но я передал свою переменную '@Year = 2014 при внешнем выполнении SP, но внутри SP я хотел бы передать параметр '@Year как переменную, а не исправление значение 2014. Спасибо, если вы можете указать мне правильное направление. - person user3840039; 15.07.2014
comment
Чтобы передать значение параметра хранимой процедуры в динамический SQL, используйте @Year = @Year. - person Andomar; 15.07.2014
comment
Ваш ответ появился в очереди низкого качества. Было бы полезно, если бы вы ответили более чем на одну-две строки. - person Engineer2021; 15.07.2014