我有以下代码:
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”已被声明。变量名称在查询批处理或存储过程中必须唯一。
这是为什么,我该如何解决?
答案 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