【问题标题】:what is syntax of fully qualified name in firebird?firebird 中完全限定名称的语法是什么?
【发布时间】:2014-04-07 13:45:44
【问题描述】:

我正在尝试将数据库 A 中的 table1 中的一行插入数据库 B 中的 table2 全部在火鸟中,看起来不像标准方式正在工作。

insert * from A.table1 into B.table2 where <condition>

谢谢

【问题讨论】:

  • insert into B.table2 select * from A.table1 where &lt;condition&gt;
  • 我不确定您使用什么语法,但这肯定不是 SQL 标准中定义的标准方式。
  • 马克是对的。这完全是非标准的(我不知道有任何支持insert * from .. 的 DBMS)
  • 对不起,我可能不够清楚,问题在于 FB 中的完全限定名称而不是语法。
  • 数据库上下文中的完全限定名称似乎是 SQL Server 特定的术语。

标签: sql firebird


【解决方案1】:

完全限定名称

“完全限定名称”一词似乎是 SQL Server 特定于跨数据库(或目录)引用的术语。在 Firebird 中,数据库是独立且孤立的:它们不知道其他数据库的存在。因此无法直接引用其他数据库中的表。

使用EXECUTE STATEMENT 扩展ON EXTERNAL 可以从PSQL 块(存储过程或EXECUTE BLOCK)中访问另一个数据库,但它不像INSERT INTO ... SELECT 那样直接。

例如(注意:我没有测试它,所以它可能有一些语法错误):

EXECUTE BLOCK
   DECLARE varColumn1 VARCHAR(10);
   DECLARE varColumn2 VARCHAR(10);
BEGIN
   FOR EXECUTE 'SELECT column1, column2 FROM tableA'
       ON EXTERNAL 'localhost:/path/to/dbA' 
       AS USER 'userDBa' PASSWORD 'pwdUserDBa'
       INTO :varColumn1, :varColumn2
   BEGIN
       INSERT INTO tableB(column1, column2) VALUES (:varColumn1, :varColumn2);
   END
END

原答案

您在问题中引用的语法不是“标准”。 SQL:2011 标准将INSERT 定义为:

<insert statement> ::=
INSERT INTO <insertion target> <insert columns and source>

<insertion target> ::=
<table name>

<insert columns and source> ::=
<from subquery>
| <from constructor>
| <from default>

<from subquery> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<query expression>

<from constructor> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<contextually typed table value constructor>

<override clause> ::=
OVERRIDING USER VALUE
| OVERRIDING SYSTEM VALUE

<from default> ::=
DEFAULT VALUES

<insert column list> ::=
<column name list>

换句话说,来自另一个表的INSERT 将是:

INSERT INTO tableB (column1, column2, ...) SELECT column1, column2, ... FROM tableA

从技术上讲,您可以关闭显式列定义,但通常最好是显式的。

这也是 Firebird 支持的语法(尽管 Firebird 不支持 SQL:2011 标准中列出的所有选项),请参阅 Interbase 6.0 语言参考(+ Firebird 2.5 语言参考更新),两者均可从http://www.firebirdsql.org/en/reference-manuals/ 获得:

INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]
{VALUES (<val> [, <val> …]) | <select_expr>};

【讨论】:

  • 这不是重点——按照标准,我的意思是完全限定的名称,它不能像在 SQL Server 中那样在 firebird 中工作——而不是插入语句。我对插入没有问题,但是如何区分表和另一个数据库。
  • 好的,所以你说它不可能像在 SQL Server 中那样。很公平,谢谢。
  • @ZuluZ 不幸的是,没有。
猜你喜欢
  • 2019-10-09
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2023-03-09
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多