Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入到没有字段名的字段中_Sql_Ms Access 2010_Field - Fatal编程技术网

Sql 插入到没有字段名的字段中

Sql 插入到没有字段名的字段中,sql,ms-access-2010,field,Sql,Ms Access 2010,Field,我试图使用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_Impo

我试图使用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

非常感谢

您可以使用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

如果不使用名称,唯一会发生的事情就是它会按位置进行操作(select中的第一列进入表中的第一列)。这要脆弱得多。在SQL中,您应该尽可能按名称而不是位置引用列。很棒的代码!!逻辑是我一直在寻找的…我试着去执行它。我犯了个错误。我认为需要做一些修改。错误在以下行:`rstInsert.Fields(.Name).Value=.Value`上,错误是:**Item未在此集合中找到**是的,假设是相同的表架构。如果没有,您可以添加、交换或排除字段名。当然,我更改了(.Name)=“pnr”。pnr是源表.rstInsert.Fields(.Name).Value=.Value的第一列的名称。这一行有点混乱。你能解释一下什么是(.value)吗?是源表中相应字段的值吗?属性值正好是:字段的值。它是字段的默认属性,因此在许多情况下可以忽略它。但是,在VB.NET和C#中没有默认属性,因此即使在VBA中它不是强制性的情况下,许多人(包括我)还是会指定它。它会变成一种习惯,永远不会导致任何错误。