创建 SQL table 作为现有 table 的副本(ODBC 和 C#)
Create SQL table as copy of an existing table (ODBC and C#)
使用 ODBC 在 C# 中操作 Access 数据库。
以下所有内容都不会创建 table。每个都会生成异常 Syntax error in CREATE TABLE statement.
:
sqlQuery = "CREATE TABLE SpecialScans AS (SELECT * FROM Scans);"
sqlQuery = "CREATE TABLE [SpecialScans] AS (SELECT * FROM [Scans]);"
sqlQuery = "CREATE TABLE [SpecialScans] AS SELECT * FROM [Scans];"
// And all of the above with " WHERE 1=2;" to create just the schema
这遵循 on the w3schools website 和其他地方指定的语法。
但是接受的答案中给出的语法 on this question 工作正常:
sqlQuery = "SELECT * INTO [SpecialScans] FROM [Scans];"
// And with " WHERE 1=2;" to create just the schema
为什么前者失败而后者有效?
正如所指出的,是 Oracle、MySQL、SQL 服务器、FoxPro 等等等等?
这些命令往往相差很大。
虽然对于一个简单的 SELECT 语句,甚至是大多数 SQL 连接,大多数支持 SQL 的数据库对于 SELECT 之类的东西都非常相似.
然而,当涉及到创建 tables 时 - 然后数据库真正开始显示它们的差异。有些具有特定类型的列,许多具有不同类型的索引 - 列表很长。
虽然 JET/ACE(MS-Access 数据库确实声称与 ANSI-92 兼容,但标准并未定义说何时要复制 table 例如 - 这是一个大兔子洞- 每个供应商都有不同的手段。
但是,JET/ACE 访问语法我们称之为 make table 查询?
此代码有效:
public void Test()
{
// make table query
string strSQL = "SELECT tblHotels.* INTO tblHotelsCopy FROM tblHotels";
using (OdbcCommand cmdSQL = new OdbcCommand(strSQL, new OdbcConnection(My.Settings.TestAccessDB)))
{
cmdSQL.Connection.Open();
cmdSQL.ExecuteNonQuery();
}
}
所以在上面,我们使用 SELECT -> INTO。 (并且该语法实际上也适用于 SQL 服务器)。
因此 sql 如上所述,适用于 SQL 服务器,也适用于 MS-Access。
在上面我们将 table 发送到新的 TABLE。因此这就是我们所说的 make table.
还可以将数据从一个 table“附加”到另一个 table。因此,这将允许您 send/transfer 从一个 table 到另一个(现有)table.
的数据
这适用于 Access SQL 但不适用于 sql 服务器!!!
INSERT INTO tblHotelsCopy SELECT * FROM tblHotels
在 sql 服务器中,您通常必须指定所有列 - 但在 Access SQL 中您不需要! - 所以这是 Access SQL 如何更灵活的示例。
所以上面现在不是 MAKE-table,因为目标 table 必须存在。因此,在上面我们将行从 tblHotels 插入到 tblhotelsCopy - 它们将被附加。
所以,你要非常小心牢记
MAKE table query - that creates the new target table
APPEND table query - that sends a select of rows from one table into EXISTING table.
使用 ODBC 在 C# 中操作 Access 数据库。
以下所有内容都不会创建 table。每个都会生成异常 Syntax error in CREATE TABLE statement.
:
sqlQuery = "CREATE TABLE SpecialScans AS (SELECT * FROM Scans);"
sqlQuery = "CREATE TABLE [SpecialScans] AS (SELECT * FROM [Scans]);"
sqlQuery = "CREATE TABLE [SpecialScans] AS SELECT * FROM [Scans];"
// And all of the above with " WHERE 1=2;" to create just the schema
这遵循 on the w3schools website 和其他地方指定的语法。
但是接受的答案中给出的语法 on this question 工作正常:
sqlQuery = "SELECT * INTO [SpecialScans] FROM [Scans];"
// And with " WHERE 1=2;" to create just the schema
为什么前者失败而后者有效?
正如所指出的,是 Oracle、MySQL、SQL 服务器、FoxPro 等等等等?
这些命令往往相差很大。
虽然对于一个简单的 SELECT 语句,甚至是大多数 SQL 连接,大多数支持 SQL 的数据库对于 SELECT 之类的东西都非常相似.
然而,当涉及到创建 tables 时 - 然后数据库真正开始显示它们的差异。有些具有特定类型的列,许多具有不同类型的索引 - 列表很长。
虽然 JET/ACE(MS-Access 数据库确实声称与 ANSI-92 兼容,但标准并未定义说何时要复制 table 例如 - 这是一个大兔子洞- 每个供应商都有不同的手段。
但是,JET/ACE 访问语法我们称之为 make table 查询?
此代码有效:
public void Test()
{
// make table query
string strSQL = "SELECT tblHotels.* INTO tblHotelsCopy FROM tblHotels";
using (OdbcCommand cmdSQL = new OdbcCommand(strSQL, new OdbcConnection(My.Settings.TestAccessDB)))
{
cmdSQL.Connection.Open();
cmdSQL.ExecuteNonQuery();
}
}
所以在上面,我们使用 SELECT -> INTO。 (并且该语法实际上也适用于 SQL 服务器)。
因此 sql 如上所述,适用于 SQL 服务器,也适用于 MS-Access。
在上面我们将 table 发送到新的 TABLE。因此这就是我们所说的 make table.
还可以将数据从一个 table“附加”到另一个 table。因此,这将允许您 send/transfer 从一个 table 到另一个(现有)table.
的数据这适用于 Access SQL 但不适用于 sql 服务器!!!
INSERT INTO tblHotelsCopy SELECT * FROM tblHotels
在 sql 服务器中,您通常必须指定所有列 - 但在 Access SQL 中您不需要! - 所以这是 Access SQL 如何更灵活的示例。
所以上面现在不是 MAKE-table,因为目标 table 必须存在。因此,在上面我们将行从 tblHotels 插入到 tblhotelsCopy - 它们将被附加。
所以,你要非常小心牢记
MAKE table query - that creates the new target table
APPEND table query - that sends a select of rows from one table into EXISTING table.