创建 SQL 表作为现有表的副本(ODBC 和 C#)[关闭]

Posted

技术标签:

【中文标题】创建 SQL 表作为现有表的副本(ODBC 和 C#)[关闭]【英文标题】:Create SQL table as copy of an existing table (ODBC and C#) [closed] 【发布时间】:2021-05-26 19:39:12 【问题描述】:

在 C# 中使用 ODBC 操作 Access 数据库。

以下所有内容都不会创建表。每个都会产生异常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

为什么前者失败而后者有效?

【问题讨论】:

访问不是真正的数据库是我能给出的最佳答案 好像和MS-Access SQL方言有关。 @Ctznkane525 这不是重点,因为它在 SQL Server 中也不起作用。关键是:每个 RDBMS 都不同,请使用正确的方言。 w3schools 网站(和其他几个网站)显示前一种语法是正确的。我发现没有显示有效语法的站点,因此“遵循它”有点挑战! :o) 您试图创建一个与另一个表具有相同结构的表这一事实表明存在数据库设计缺陷。最好将“特殊”扫描添加到常规扫描表中,并将 id 仅添加到特殊扫描表中。或者,在扫描表中添加一个“特殊”标志。 【参考方案1】:

正如所指出的,是 Oracle、mysql、SQL server、FoxPro 等等等等?

这些命令往往相差相当大。

虽然对于一个简单的 SELECT 语句,甚至大部分 SQL 连接,但大多数支持 SQL 的数据库对于 SELECT 之类的东西都非常相似。

但是,当涉及到创建表时 - 数据库真的开始显示它们的差异。有些具有特定类型的列,许多具有不同类型的索引 - 列表非常长。

虽然 JET/ACE(MS-Access 数据库确实声称与 ansi-92 兼容,但标准并未定义例如何时要复制表 - 一个大兔子洞 - 每个供应商都有不同的方法。

但是,JET/ACE Access 语法用于我们所说的生成表查询?

此代码将起作用:

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 一起使用。

在上面我们将表发送到一个新表。因此,这就是我们所说的 make table。

还可以将数据从一个表“附加”到另一个表。因此,这将允许您将数据从一个表发送/传输到另一个(现有)表。

这适用于 Access SQL 但不适用于 sql server!!!

INSERT INTO tblHotelsCopy SELECT * FROM tblHotels

在 sql server 中,您通常必须指定所有列 - 但在 Access SQL 中,您不需要! - 所以这是 Access SQL 如何更加灵活的一个示例。

所以上面现在不是一个 MAKE 表,因为目标表必须存在。因此,在上面我们将行从 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.

【讨论】:

好吧,如果你包含一个 PK 值或自动编号,或者每个表都不相同,那么你会得到错误。尝试在访问中构建查询 - 使用查询生成器,并从功能区更改为追加查询。如前所述,这将是一个附加查询。开始一个新问题 - 显示您正在使用的代码和 sql。我在这个问题中概述的两种语法都经过测试,并且可以正常工作。该代码示例使用 ODBC 提供程序,并且 oleDB 或 odbc 提供程序都应该可以工作。所以,开始一个新的问题。发布您正在使用的实际代码,您正在使用的 sql。以及两张表的结构。 使用访问查询生成器后 - 翻转到 sql 视图,并仔细查看语法。无论如何,开始一个新的问题。贴出你的代码,贴出sql,贴出两个表结构。您的问题是创建一个表的副本,但您现在尝试插入 - 这是一个追加查询,因此假定目标表存在。我的意思是,这个问题被关闭也就不足为奇了。您想要哪个,追加查询(将数据移动到现有表,或生成表查询 - 将数据移动到新的不存在的表。正如我所说,没有代码示例?这在这里成为浪费时间。跨度> 是的,您实际上必须阅读我在这里给出的答案。如果不阅读我发布的内容,您将无法正常工作。正如我所说,开始一个新问题。发布您正在使用的代码。并发布表结构。

以上是关于创建 SQL 表作为现有表的副本(ODBC 和 C#)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

创建将数据插入两个现有表的 SQL FUNCTION

Oracle SQL 主键卡住

将SQL表作为数据导入访问Db

如何通过 Rails 迁移克隆数据库表?

使用 Query 为现有表生成 SQL 创建脚本

如何使用 Access VBA 更新所有 ODBC 链接的 SQL Server 表的服务器名称