sp_ExecuteSql:参数化查询需要参数@XX,它未提供

时间:2014-07-15 09:13:43

标签: sql-server tsql parameterized-query

我正在尝试构建一个动态存储过程,以允许我将我的字符串where子句作为参数的一部分传递。但是,在MSDN的this article之后,我仍然无法让它运行并出现标题所描述的错误。非常感谢任何帮助。

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

错误:

  

Msg 8178,Level 16,State 1,Line 9
  参数化查询'(@ Year int)
     SELECT
     dbo.vw_Demand_By。*
  来自'
  期望参数' @ 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 

2 个答案:

答案 0 :(得分:1)

您还必须传递参数:

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

答案 1 :(得分:0)

您需要为@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