完全限定名称
“完全限定名称”一词似乎是 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>};