在SQL查询中传递DECLARE参数

时间:2018-12-01 13:18:40

标签: c# sql-server datetime

我有以下代码:

SqlCommand command = new SqlCommand(
    @"DECLARE @month int, @year int, @dateToCheck datetime;
      SET @month = @month;
      SET @year = @year;
      SET @dateToCheck = dateadd(month, 1, datefromparts(@year, @month, 1))

      SELECT p.name, dtc.cost_price, p.date_created
      FROM [dbo].[Company_Local_Invoice_] claidig
      JOIN Type_Company dtc on claidig.ID = dtc.id 
      WHERE p.date_created < @dateToCheck
      AND (p.date_left is null or p.date_left >= @dateToCheck)", conn);

command.Parameters.Add("@month", SqlDbType.Int).Value = month;
command.Parameters.Add("@year", SqlDbType.Int).Value = year;

问题是我似乎无法使用SET传递我的command.Parameter.Add()参数。

我得到的错误是:

  

变量名“ @month”已被声明。变量名称在查询批处理或存储过程中必须唯一。

这是为什么,我该如何解决?

3 个答案:

答案 0 :(得分:3)

Gordon提出的观点是,当您将参数传递给sql字符串时,它将在参数定义中添加'declare'语句。因此,您无需为作为参数传入的任何内容进行声明。不过,您仍然需要声明从参数中计算出的所有变量。

var commandText = @"

  declare @dateToCheck datetime

  set @dateToCheck = dateadd(month, 1, datefromparts(@year, @month, 1))

  select 
    p.name, dtc.cost_price, p.date_created
  from 
    dbo.[Company_Local_Invoice_] claidig
    inner join 
    Type_Company dtc 
    on c
      laidig.ID = dtc.id 
  where
    p.date_created < @dateToCheck
    and 
    (
      p.date_left is null 
      or 
      p.date_left >= @dateToCheck
    )";

var command = new SqlCommand(commandText, conn);
command.Parameters.Add("@month", SqlDbType.Int).Value = month;
command.Parameters.Add("@year", SqlDbType.Int).Value = year;

答案 1 :(得分:0)

只需传入参数并在查询中进行计算即可:

SELECT p.name, dtc.cost_price, p.date_created
FROM [dbo].[Company_Local_Invoice_] claidig
JOIN Type_Company dtc ON claidig.ID = dtc.id
CROSS APPLY (VALUES 
    (dateadd(month, 1, datefromparts(@year, @month, 1)))
) v(dateToCheck)
WHERE p.date_created < v.dateToCheck AND
      (p.date_left is null or p.date_left >= v.dateToCheck);

答案 2 :(得分:0)

您不必声明data@month参数,框架将为您@year声明它们:

DECLARE