2

我有一个复杂的查询,其中包含多个必须替换相同主键值的位置。它看起来像这样:

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)

4

1 回答 1

2

FindParam 只找到一个参数,而您有两个同名的参数。Delphi 数据集将每个参数作为一个单独的参数添加到其参数集合中。

如果您遍历所有参数,检查名称是否匹配,并设置每个匹配的值,它应该可以工作,尽管我通常选择给每个相同的参数一个后续编号以区分它们。

于 2011-09-30T17:43:37.563 回答