我尝试创建一个在访问中使用变量的查询,我使用以下SQL:
PARAMETERS @arrival_date date, @departure_date date, @hotel_id int;
SELECT
*
FROM
dbo.room r
WHERE
(r.hotel_id = @hotel_id)
AND
room_id NOT IN (
SELECT
r.room_id
FROM
room r
LEFT JOIN
booking b
ON
r.hotel_id = b.hotel_id
AND
r.room_id = b.room_id
WHERE
r.hotel_id = @hotel_id
AND
((arrival_date <= @departure_date)
AND
(departure_date >= @arrival_date))
);
这个查询对于存储过程(以及在那里声明变量的正确方法)完全正常,但是当我尝试使用查询生成相同的内容时,我会得到以下错误:
ADO错误:参数&#39;附近的语法不正确。必须声明标量变量&#34;
HOTEL_ID&#34 ;.
必须声明标量变量&#34;HOTEL_ID&#34;
我尝试过使用DECLARE语法,但这似乎也不起作用。有关其他信息(不确定这可能会产生什么效果,但我认为无论如何我都提到它)我在虚拟机(在Mac上)上使用Microsoft Access 2010。我的数据库本身是在SQL Server中创建的,并已导入MS Access。我现在不再能访问SQL服务器了,所以我需要在MS Access中完成任何工作
答案 0 :(得分:1)
&#39; @&#39;是Access SQL标识符的无效字符。
修复?简单!使用[]:
引用参数名称PARAMETERS [@arrival_date] date, [@departure_date] date, [@hotel_id] int;
SELECT
*
FROM
dbo.room r
WHERE
(r.hotel_id = [@hotel_id])
AND
room_id NOT IN (
SELECT
r.room_id
FROM
room r
LEFT JOIN
booking b
ON
r.hotel_id = b.hotel_id
AND
r.room_id = b.room_id
WHERE
r.hotel_id = [@hotel_id]
AND
((arrival_date <= [@departure_date])
AND
(departure_date >= [@arrival_date]))
);
BTW,我更喜欢使用@在Access中为参数名称添加前缀,因为它符合SQL Server参数命名约定。