【问题标题】:Temp tables in delphi querydelphi查询中的临时表
【发布时间】:2019-09-20 08:58:05
【问题描述】:

我正在尝试将其合并到临时表中。您在这里看到一些错误的语法吗? 当我执行时,它没有显示任何问题,但是当我尝试引用此查询时,它显示“无效的表名 #Temp_trans_13”(我使用的是 MSSQL)。

select * into #temp_trans_13 from (
select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 12
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 13
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste

where
      Jahr = :jahr 
and   periode = 14
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999')t 

【问题讨论】:

  • 查询在 SSMS 中有效吗?
  • 我认为我无法在我的工作中访问它:/。我只能在 Fire Dac Explorer 上检查它,它显示参数未定义
  • @nolaspeaker:对我来说,SSMS 2014 似乎不喜欢... (select * from anything) - 它抱怨右括号)
  • @MartynA 这是第一个问题!
  • 我对所有这些东西都很陌生,所以我对所有这些东西都不熟悉(还没有!)。 :P

标签: sql-server tsql delphi temp-tables


【解决方案1】:

看起来整个查询可以简化为:


select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr
into #temp_trans_13 
from sap_SuSa_liste
where
      Jahr = :jahr
     and   periode in (12,13,14)
     and   buchungskreis = :bkr
     and   konto_nr between '200000' and '999999'

UNION 返回不同的值,这意味着即使 SQL Server 的查询优化器足够聪明,可以避免执行 N 个查询,它仍然必须对数据进行排序和分组以消除重复。

如果需要消除重复,可以在 SELECT 子句中添加DISTINCT

临时表

临时表是临时的。它们仅在单个连接期间存在。那些具有单个 # 前缀的那些仅对创建它们的连接可见。

invalid table name #Temp_trans_13 错误只能在 另一个 查询尝试使用该表但找不到它时引发,要么是因为它尚未创建,要么是因为它是在不同的环境中创建的连接。

要使用来自另一个连接的临时表,需要使用## 作为前缀来创建global temporary table

【讨论】:

  • 我很确定所有这些答案都会起作用,但不知何故它在我的德尔福中不起作用。我的工作是将整个系统从虚拟 windows xp 机器 delphi 5 重新输入到 delphi 10,所以也许其他一些代码可能是过时的。
  • 这与Delphi无关。您是否尝试对数据库直接运行查询?您得到的错误意味着某些 other 查询试图使用该表但没有找到它。你是如何调用另一个查询的?你是在同一个连接中调用它还是在不同的连接中调用它? #temp_trans_13 仅在单个连接期间存在,并且仅在该连接内可见
  • 所以。是的,它连接到同一个 fdconnection。我叫查询'select * from #temp_trans_13'
  • 在 fd explorer 中也看不到它
【解决方案2】:

在这种情况下,我发现尝试将问题归结为本质的查询很有帮助。

使用 SSMS 2014,我有一个 Table1,它由一个名为 IDInt 列组成。

如果我尝试

select * into #mytemp from (select * from table1)

我得到了错误

消息 102,级别 15,状态 1,行 1 ')' 附近的语法不正确。

如果我尝试,我会收到相同的错误消息

select ID from (select * from table1)

但是,遵循 R 部分中的示例。使用派生表 TransactSql docs 这个查询

select ID from (select * from table1) as derivedtable

查询正确执行并生成预期的单列结果集。

进一步,执行

select * into #mytemp from (select * from table1) as derivedtable

正确执行并产生预期结果。

所以,显然是 as xxxx 造成了两者之间的差异 (select ... from ...) 构造不工作和工作。

【讨论】:

    【解决方案3】:

    这将解决您的问题:

    declare 
       @bkr varchar(10),
       @jahr int
    
    set @bkr = :bkr
    set @jahr = :jahr
    
    select T.* 
    into #temp_trans_13 
    from     
    (
    select 
          periode,
          konto_nr as ktonr,
          konto_kurztext as ktobez,
          soll_periode - haben_periode as SaldoMonat,
          soll_saldo - haben_saldo as SaldoJahr
    
    from
          sap_SuSa_liste
    where
          Jahr = @jahr
    and   periode = 12
    and   buchungskreis = @bkr
    and   konto_nr between '200000' and '999999'
    union
    select
          periode,
          konto_nr as ktonr,
          konto_kurztext as ktobez,
          soll_periode - haben_periode as SaldoMonat,
          soll_saldo - haben_saldo as SaldoJahr
    
    from
          sap_SuSa_liste
    where
          Jahr = @jahr
    and   periode = 13
    and   buchungskreis = @bkr
    and   konto_nr between '200000' and '999999'
    union
    select
          periode,
          konto_nr as ktonr,
          konto_kurztext as ktobez,
          soll_periode - haben_periode as SaldoMonat,
          soll_saldo - haben_saldo as SaldoJahr
    
    from
          sap_SuSa_liste
    
    where
          Jahr = @jahr 
    and   periode = 14
    and   buchungskreis = @bkr
    and   konto_nr between '200000' and '999999'
    ) T
    

    【讨论】:

    • 好吧,感谢您的努力,但问题仍然存在。 ;(
    • 究竟是哪个问题?
    • @JichałMurek 遇到了什么问题,您究竟尝试了什么?您不会收到您从 this 查询中发布的错误消息,或任何缺少的)。您很可能从 next 查询中得到一个找不到临时表的错误
    • @JichałMurek 如果您需要进一步的帮助,您必须报告您遇到的确切问题,确切的词语。
    • 所以。有一系列对自己进行引用的查询。除了我的最后一个查询之外,它们工作正常,因为它显示错误“无效的表名 blablabla”;/
    猜你喜欢
    • 2018-08-03
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2012-12-15
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多