我有一个复杂的查询,其中包含多个必须替换相同主键值的位置。它看起来像这样:
select Foo.Id,
Foo.BearBaitId,
Foo.LinkType,
Foo.BugId,
Foo.GooNum,
Foo.WorkOrderId,
(case when Goo.ZenID is null or Goo.ZenID=0 then
IsNull(dbo.EmptyToNull(Bar.FanName),dbo.EmptyToNull(Bar.BazName))+' '+Bar.Strength else
'@'+BarZen.Description end) as Description,
Foo.Init,
Foo.DateCreated,
Foo.DateChanged,
Bug.LastName,
Bug.FirstName,
Goo.BarID,
(case when Goo.ZenID is null or Goo.ZenID=0 then
IsNull(dbo.EmptyToNull(Bar.BazName),dbo.EmptyToNull(Bar.FanName))+' '+Bar.Strength else
'@'+BarZen.Description end) as BazName,
GooTracking.Status as GooTrackingStatus
from
Foo
inner join Bug on (Foo.BugId=Bug.Id)
inner join Goo on (Foo.GooNum=Goo.GooNum)
left join Bar on (Bar.Id=Goo.BarID)
left join BarZen on (Goo.ZenID=BarZen.ID)
inner join GooTracking on(Goo.GooNum=GooTracking.GooNum )
where (BearBaitId = :aBaitid)
UNION
select Foo.Id,
Foo.BearBaitId,
Foo.LinkType,
Foo.BugId,
Foo.GooNum,
Foo.WorkOrderId,
Foo.Description,
Foo.Init,
Foo.DateCreated,
Foo.DateChanged,
Bug.LastName,
Bug.FirstName,
0,
NULL,
0
from Foo
inner join Bug on (Foo.BugId=Bug.Id)
where (LinkType=0) and (BearBaitId= :aBaitid )
order by BearBaitId,LinkType desc, GooNum
当我尝试在这个重要的查询上使用整数参数时,对我来说似乎是不可能的。我收到此错误:
Error
Incorrect syntax near ':'.
如果我取出:aBaitid
并替换文字,查询工作正常1
。
我还能对上面的这个查询做些什么吗?当我用这样的简单测试进行测试时:
select * from foo where id = :anid
这些简单的案例工作正常。该组件是TADOQuery
,它可以正常工作,直到您将任何内容添加:parameters
到 SQL 字符串。
更新:当我在运行时使用以下代码时,参数替换实际上已经完成(解决了 ADO 组件中的一些故障)和不同的错误表面:
adoFooContentQuery.Parameters.FindParam('aBaitId').Value := 1;
adoFooContentQuery.Active := true;
现在错误变为:
Incorrect syntax near the keyword 'inner''.
再次注意,如果我只是停止使用参数替换功能,这个错误就会消失。
Update2:接受的答案表明我必须找到具有相同名称的参数的两个不同副本,这让我很困扰,所以我重新编写了这样的查询:
DECLARE @aVar int;
SET @aVar = :aBaitid;
SELECT ....(long query here)
然后我在需要时在整个脚本中使用了@aVar,以避免重复使用:aBaitId
. (如果参数值的使用次数发生变化,我不想找到所有匹配名称的参数,并替换它们)。
我想像这样的辅助函数也可以: SetAllParamsNamed(aQuery:TAdoQuery; aName:String;aValue:Variant)