我想在delphi里用表变量,但是不知道怎么用,请各位大侠帮忙,下面是我的代码
  with qryDataStat do
  begin
    Close;
    SQL.Clear;
    sSQL := Format( +' declare @TmpTxnDataStat table '
                    +' ( ' \\这里就过不去了
                    +' [id] int IDENTITY(1,1), '
                    +' [CurrencyID] char(3), '
                    +' [SysAccountNo] varchar(13), '
                    +' [SysBankName] nvarchar(64), '
                    +' [IoFlag] char(1), '
                    +' [FeeAmount] numeric(9), '
                    +' [InSumCount] int, '
                    +' [Ingetcnt] int, '
                    +' [OutSumCount] int, '
                    +' [Outgetcnt] int, '
                    +' [AllCount] int '
                    +' ) '
                    +' INSERT INTO @TmpTxnDataStat '
                    +' ( '
                    +' CurrencyID,SysAccountNo,SysBankName,IoFlag,FeeAmount,InSumCount,Ingetcnt,OutSumCount,Outgetcnt,AllCount '
                    +' ) '
                    +' select a.CurrencyID,c.SysAccountNo,c.SysBankName,a.Ioflag, '
                    +' (select FeeAmount from ProcFee where  IOFlag=a.ioflag and TradeCodeID=a.TradeCodeID) as feeamount, '
                    +' sum(case  when ioflag=''I'' then sumcount else 0 end ) as InSumCount, '
                    +' sum(case  when ioflag=''I'' and TradeCodeID in (''%s'') then sumcount else 0 end ) as Ingetcnt, '
                    +' sum(case  when ioflag=''O'' then sumcount else 0 end ) as OutSumCount, '
                    +' sum(case  when ioflag=''O'' and TradeCodeID in (''%s'') then sumcount else 0 end ) as Outgetcnt, '
                    +' sum(case  when ioflag=''I'' then sumcount else 0 end ) + sum(case  when ioflag=''O'' then sumcount else 0 end ) as AllCount '
                    +' from TxnDataStat a, Bank b, SysAccount c '
                    +' where a.CurrencyID = b.CurrencyID '
                    +' and a.BankID = b.BankID '
                    +' and b.CurrencyID *= c.CurrencyID '
                    +' and b.SysAccountNo *= c.SysAccountNo '
                    +' and a.sysdate between ''%s'' and ''%s'' '
                    +' and a.CurrencyID = ''%s'' '
                    +' and b.SysAccountNo like ''%s'' '
                    +' and b.AreaNo like ''%s'' '
                    +' group by c.SysAccountNo,c.SysBankName,a.CurrencyID,a.Ioflag,a.TradeCodeID '
                    +' order by c.SysAccountNo,c.SysBankName '
                    +' SELECT CurrencyID,SysAccountNo,SysBankName, '
                    +' sum(InSumCount) as InSumCount,sum(Ingetcnt) as Ingetcnt, '
                    +' sum(case when IOFlag=''I'' then FeeAmount*Ingetcnt else 0 end ) as Inamount, '
                    +' sum(OutSumCount) as OutSumCount,sum(Outgetcnt) as Outgetcnt, '
                    +' sum(case when IOFlag=''O'' then FeeAmount*Outgetcnt else 0 end ) as Outamount, '
                    +' sum(AllCount) as AllCount '
                    +' FROM @TmpTxnDataStat '
                    +' group by SysAccountNo,SysBankName,CurrencyID '
                    +' order by SysAccountNo ',
                [sSQL1,sSQL2,sSQL1,sSQL2,sStartDate,sEndDate,sCurrencyID,sSysAccountNo,sAreaNo]);
    SQL.Add(sSQL);
    Open;

解决方案 »

  1.   

    另外说一下,我在分析器里试过sql语句是没问题的
      

  2.   

    vSQL: string;
    ...
    vSQL:= ' declare @TmpTxnDataStat table '
                        +' ( ' \\这里就过不去了
                        +' [id] int IDENTITY(1,1), '
                        +' [CurrencyID] char(3), '
                        +' [SysAccountNo] varchar(13), '
                        +' [SysBankName] nvarchar(64), '
                        +' [IoFlag] char(1), '
                        +' [FeeAmount] numeric(9), '
                        +' [InSumCount] int, '
                        +' [Ingetcnt] int, '
                        +' [OutSumCount] int, '
                        +' [Outgetcnt] int, '
                        +' [AllCount] int '
                        +' ) '
                        +' INSERT INTO @TmpTxnDataStat '
                        +' ( '
                        +' CurrencyID,SysAccountNo,SysBankName,IoFlag,FeeAmount,InSumCount,Ingetcnt,OutSumCount,Outgetcnt,AllCount '
                        +' ) '
                        +' select a.CurrencyID,c.SysAccountNo,c.SysBankName,a.Ioflag, '
                        +' (select FeeAmount from ProcFee where  IOFlag=a.ioflag and TradeCodeID=a.TradeCodeID) as feeamount, '
                        +' sum(case  when ioflag=''I'' then sumcount else 0 end ) as InSumCount, '
                        +' sum(case  when ioflag=''I'' and TradeCodeID in (%s) then sumcount else 0 end ) as Ingetcnt, '
                        +' sum(case  when ioflag=''O'' then sumcount else 0 end ) as OutSumCount, '
                        +' sum(case  when ioflag=''O'' and TradeCodeID in (%s) then sumcount else 0 end ) as Outgetcnt, '
                        +' sum(case  when ioflag=''I'' then sumcount else 0 end ) + sum(case  when ioflag=''O'' then sumcount else 0 end ) as AllCount '
                        +' from TxnDataStat a, Bank b, SysAccount c '
                        +' where a.CurrencyID = b.CurrencyID '
                        +' and a.BankID = b.BankID '
                        +' and b.CurrencyID *= c.CurrencyID '
                        +' and b.SysAccountNo *= c.SysAccountNo '
                        +' and a.sysdate between %s and %s '
                        +' and a.CurrencyID = %s '
                        +' and b.SysAccountNo like %s '
                        +' and b.AreaNo like %s '
                        +' group by c.SysAccountNo,c.SysBankName,a.CurrencyID,a.Ioflag,a.TradeCodeID '
                        +' order by c.SysAccountNo,c.SysBankName '
                        +' SELECT CurrencyID,SysAccountNo,SysBankName, '
                        +' sum(InSumCount) as InSumCount,sum(Ingetcnt) as Ingetcnt, '
                        +' sum(case when IOFlag=''I'' then FeeAmount*Ingetcnt else 0 end ) as Inamount, '
                        +' sum(OutSumCount) as OutSumCount,sum(Outgetcnt) as Outgetcnt, '
                        +' sum(case when IOFlag=''O'' then FeeAmount*Outgetcnt else 0 end ) as Outamount, '
                        +' sum(AllCount) as AllCount '
                        +' FROM @TmpTxnDataStat '
                        +' group by SysAccountNo,SysBankName,CurrencyID '
                        +' order by SysAccountNo ');
    sSQL := format(sSQL, [sSQL1,sSQL2,sSQL1,sSQL2,sStartDate,sEndDate,sCurrencyID,sSysAccountNo,sAreaNo]);
    with qryDataStat do
    begin
      Close;
      SQL.Clear;   
      SQL.Text := sSQL;
      Open; 
    end;
    ...
      

  3.   

    var
      ssql,sSQL1,sSQL2,sStartDate,sEndDate,sCurrencyID,sSysAccountNo,sAreaNo: String;
    begin
    with qryDataStat do
      begin
        Close;
        SQL.Clear;
        sSQL := Format( ' declare @TmpTxnDataStat table '
                        +' ( '//这里就过不去了
                        +' [id] int IDENTITY(1,1), '
                        +' [CurrencyID] char(3), '
                        +' [SysAccountNo] varchar(13), '
                        +' [SysBankName] nvarchar(64), '
                        +' [IoFlag] char(1), '
                        +' [FeeAmount] numeric(9), '
                        +' [InSumCount] int, '
                        +' [Ingetcnt] int, '
                        +' [OutSumCount] int, '
                        +' [Outgetcnt] int, '
                        +' [AllCount] int '
                        +' ) '
                        +' INSERT INTO @TmpTxnDataStat '
                        +' ( '
                        +' CurrencyID,SysAccountNo,SysBankName,IoFlag,FeeAmount,InSumCount,Ingetcnt,OutSumCount,Outgetcnt,AllCount '
                        +' ) '
                        +' select a.CurrencyID,c.SysAccountNo,c.SysBankName,a.Ioflag, '
                        +' (select FeeAmount from ProcFee where  IOFlag=a.ioflag and TradeCodeID=a.TradeCodeID) as feeamount, '
                        +' sum(case  when ioflag=''I'' then sumcount else 0 end ) as InSumCount, '
                        +' sum(case  when ioflag=''I'' and TradeCodeID in (''%s'') then sumcount else 0 end ) as Ingetcnt, '
                        +' sum(case  when ioflag=''O'' then sumcount else 0 end ) as OutSumCount, '
                        +' sum(case  when ioflag=''O'' and TradeCodeID in (''%s'') then sumcount else 0 end ) as Outgetcnt, '
                        +' sum(case  when ioflag=''I'' then sumcount else 0 end ) + sum(case  when ioflag=''O'' then sumcount else 0 end ) as AllCount '
                        +' from TxnDataStat a, Bank b, SysAccount c '
                        +' where a.CurrencyID = b.CurrencyID '
                        +' and a.BankID = b.BankID '
                        +' and b.CurrencyID *= c.CurrencyID '
                        +' and b.SysAccountNo *= c.SysAccountNo '
                        +' and a.sysdate between ''%s'' and ''%s'' '
                        +' and a.CurrencyID = ''%s'' '
                        +' and b.SysAccountNo like ''%s'' '
                        +' and b.AreaNo like ''%s'' '
                        +' group by c.SysAccountNo,c.SysBankName,a.CurrencyID,a.Ioflag,a.TradeCodeID '
                        +' order by c.SysAccountNo,c.SysBankName '
                        +' SELECT CurrencyID,SysAccountNo,SysBankName, '
                        +' sum(InSumCount) as InSumCount,sum(Ingetcnt) as Ingetcnt, '
                        +' sum(case when IOFlag=''I'' then FeeAmount*Ingetcnt else 0 end ) as Inamount, '
                        +' sum(OutSumCount) as OutSumCount,sum(Outgetcnt) as Outgetcnt, '
                        +' sum(case when IOFlag=''O'' then FeeAmount*Outgetcnt else 0 end ) as Outamount, '
                        +' sum(AllCount) as AllCount '
                        +' FROM @TmpTxnDataStat '
                        +' group by SysAccountNo,SysBankName,CurrencyID '
                        +' order by SysAccountNo ',
                    [sSQL1,sSQL2,sSQL1,sSQL2,sStartDate,sEndDate,sCurrencyID,sSysAccountNo,sAreaNo]);
        SQL.Add(sSQL);
        Open;
      end;
      

  4.   

    建表是无法返回数据集的,你用OPEN 当然出错了
      

  5.   

    1.你编译过了吗?
    2.如果不行,把sql语句分开执行
      

  6.   

    我在分析器里面是可以正常执行的,
    编译的时候
    declare @TmpTxnDataStat table 
    这个好像不允许执行 
                       
      

  7.   

    创建的部分使用ExecSQL;
    查询的部分使用Open;
    或者你干脆就使用存储过程好了(使用TADOStoredProc组件)
      

  8.   

    建表使用execsql
    查询使用Open
      

  9.   

    你试过了?至少我试过了。
    错误:AdoQuery1 CommandText does not return a result set.
      

  10.   

    其实不用这么麻烦,SELECT A,B,C FROM TABLE1 INTO #TEMPTABLE 这样在#TEMPTABLE 临时表里就有了这些数据了,只要不把#TEMPTABLE DROP掉,最后就可以直接SELECT出来,最后再DROP掉就OK了
      

  11.   

    declare  @MyTable table
    (
    id  int,
    txt varchar(20)
    );insert into @MyTable (id, txt) values(1, 'ok');select * from @MyTable;每句后面有 ; 分号就行了.
      

  12.   

    還是寫成存儲過程的方便.Delphi中可讀性也強.