【问题标题】:INSERT INTO without field names不带字段名的 INSERT INTO
【发布时间】:2016-02-10 09:37:03
【问题描述】:

我正在尝试使用 INSERT INTO 语句而不定义我的列字段名称。我知道这是可能的,但我无法做到。我目前拥有的 SQL 字符串是,

  strSQL = " INSERT INTO MLE_Table (pnr, [Overall Assesment], risk, reason, justification)" & _
           " SELECT tbl_Import.pnr, tbl_Import.[Overall Assesment], tbl_Import.risk, tbl_Import.reason, tbl_Import.justification " & _
           " FROM tbl_Import;"

现在,在这段代码中,我使用了我的字段名称。但我不想那样做。 我希望 SQL 仅在两个表的字段名称匹配时才将字段插入新表。

我认为可以通过 For Each 循环来完成,但我不确定。

以前有没有人这样做过。我使用的是 MS Access 2010。

非常感谢!!

【问题讨论】:

  • 如果您不使用名称,唯一会发生的事情就是它会按位置执行操作(选择中的第一列进入表中的第一列)。这是远更多脆弱。在 SQL 中,您应该尽可能按 name 而不是 position 引用列。

标签: sql ms-access-2010 field


【解决方案1】:

你可以使用 DAO:

Public Sub CopyRecords()

  Dim rstSource   As DAO.Recordset
  Dim rstInsert   As DAO.Recordset
  Dim fld         As DAO.Field
  Dim strSQL      As String
  Dim lngLoop     As Long
  Dim lngCount    As Long

  strSQL = "SELECT Top 1 * FROM tblInsert"    
  Set rstInsert = CurrentDb.OpenRecordset(strSQL)
  strSQL = "SELECT * FROM tblSource"    
  Set rstSource = CurrentDb.OpenRecordset(strSQL)

  With rstSource
    lngCount = .RecordCount
    For lngLoop = 1 To lngCount
      With rstInsert
        .AddNew
          For Each fld In rstSource.Fields
            With fld
              If .Attributes And dbAutoIncrField Then
                ' Skip Autonumber or GUID field.
              ElseIf .Name = "Something" Then
                ' Insert default value.
                rstInsert.Fields(.Name).Value = 0
              ElseIf .Name = "SomethingElse Then
                ' Ignore this field.
              Else
                ' Copy field content.
                rstInsert.Fields(.Name).Value = .Value
              End If
            End With
          Next
        .Update
      End With
      .MoveNext
    Next
    rstInsert.Close
    .Close
  End With

  Set rstInsert = Nothing
  Set rstSource = Nothing

End Sub

【讨论】:

  • 很棒的代码!!逻辑是我一直在寻找的东西..我试图执行它。我有一个错误。我认为需要进行一些修改。错误在线:`rstInsert.Fields(.Name).Value = .Value` 错误是:**在此集合中找不到项目**
  • 是的,假设是相同的表模式。如果没有,您可以添加、交换或排除字段名称。
  • 当然我改变了 (.Name) = " pnr "。 pnr 是我的源表的第一列的名称。
  • rstInsert.Fields(.Name).Value = .Value 这一行有点混乱。你能解释一下什么是(.value)吗?是源表中对应字段的值吗??
  • Property Value 就是:字段的值。它是字段的默认属性,因此在许多情况下可以省略。但是,在 VB.NETC# 中没有默认属性,因此即使在 VBA 中它不是强制性的情况下,许多 (包括我)无论如何都要指定它。它变成一种习惯,永远不会导致任何错误。
猜你喜欢
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2011-11-09
相关资源
最近更新 更多