Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 如何规范Access中具有逗号分隔值的数据字段_Sql_Excel_Ms Access_Vba - Fatal编程技术网

Sql 如何规范Access中具有逗号分隔值的数据字段

Sql 如何规范Access中具有逗号分隔值的数据字段,sql,excel,ms-access,vba,Sql,Excel,Ms Access,Vba,这似乎是一个常见的问题,但我似乎无法得到答案 我使用VBA从excel文件中读取的表包含一个字段,该字段有多个值,用逗号分隔符分隔。我知道正确的方法是规范化这个字段。不过,我似乎无法让我的解决方案发挥作用 我的桌子看起来像这样: ProdID | Color | Value 1 | Blue, Green | 30 2 | White, Blue, Red | 50 3 etc. 我试图通过先将值放入临时表,然后更新主表来拆分这些值,但这似乎很麻烦,我怀疑一定有更智能的解决

这似乎是一个常见的问题,但我似乎无法得到答案

我使用VBA从excel文件中读取的表包含一个字段,该字段有多个值,用逗号分隔符分隔。我知道正确的方法是规范化这个字段。不过,我似乎无法让我的解决方案发挥作用

我的桌子看起来像这样:

ProdID | Color | Value
1      | Blue, Green | 30
2      | White, Blue, Red | 50
3 etc.
我试图通过先将值放入临时表,然后更新主表来拆分这些值,但这似乎很麻烦,我怀疑一定有更智能的解决方案

    'check that data is available and copy data to new temporary sheet
rowCount = wks.UsedRange.Rows.count
If rowCount < 2 Then
    MsgBox ("The Workbook " & wkb & " contains no Data. The Process will not continue to execute!")
    GoTo EndCleanUp
Else
    'delete old data in DB table
    With tblMorningstarFS
        DoCmd.SetWarnings False
        DoCmd.RunSQL "DELETE * FROM " & .Name
        DoCmd.SetWarnings True
    End With
    'create array with prod color id set
    Dim tempArray()
    ReDim tempArray(rowCount, 1)
    With wks
        For i = 0 To rowCount
        tempArray(i, 0) = .Cells(i + 1, 1) '  prodID

        tempArray(i, 1) = .Cells(i + 1, 2) ' colorID
        Next i
    End With
    'create temporary table
    curDatabase.Execute "CREATE TABLE tempColorTable " _
        & "(ProdID CHAR, ColorID CHAR);"
    'fill prodID/colorID table with array info
    With curDatabase.OpenRecordset("tempColorTable", dbOpenTable)
        For i = 1 To UBound(tempArray, 1) + 1
            .AddNew
            rs.Fields("ProdID") = wks.Range("A" & i + 1).Value
            rs.Fields("ColorID") = wks.Range("C" & i + 1).Value
            rs.Update
        Next i
    End With
    'update the exisiting table with information
    Dim SQL As String
    SQL = "INSERT INTO tblProd_Color ( ProdID, ColorID ) " & _
    "SELECT tempColorTable.ProdID, tempColorTable.ColorID " & _
    "FROM tempColorTable"
    DoCmd.RunSQL SQL
    'fill prod table with value information
    With wks
        For i = 1 To rowCount
            rs.AddNew
            rs.Fields("PRODUCT") = .Range("A" & i + 1).Value
            rs.Fields("VALUE") = .Range("C" & i + 1).Value
            rs.Update
        Next i
    End With


    With wks
        For i = 1 To rowCount
            rs.AddNew
            rs.Fields("PRODUCT") = .Range("A" & i + 1).Value
            rs.Fields("VALUE") = .Range("C" & i + 1).Value
            rs.Update
        Next i
    End With
End If
”检查数据是否可用,并将数据复制到新的临时工作表中
rowCount=wks.UsedRange.Rows.count
如果行计数小于2,则
MsgBox(“工作簿”&wkb&“不包含任何数据。进程将不会继续执行!”)
GoTo EndCleanUp
其他的
'删除数据库表中的旧数据
用tblMorningstarFS
DoCmd.SetWarnings错误
DoCmd.RunSQL“DELETE*FROM”&.Name
DoCmd.SetWarnings True
以
'使用产品颜色id集创建阵列
Dim tempArray()
ReDim临时阵列(行数,1)
有工作
对于i=0的行计数
tempArray(i,0)=.Cells(i+1,1)'prodID
tempArray(i,1)=.Cells(i+1,2)'colorID
接下来我
以
'创建临时表
curDatabase.Execute“CREATE TABLE tempColorTable”_
&(ProdID CHAR、ColorID CHAR)
'用数组信息填充prodID/colorID表
使用curDatabase.OpenRecordset(“tempColorTable”,dbOpenTable)
对于i=1到UBound(tempArray,1)+1
.AddNew
rs.Fields(“ProdID”)=wks.Range(“A”&i+1).值
rs.Fields(“ColorID”)=wks.Range(“C”&i+1).值
rs.更新
接下来我
以
'使用信息更新现有表
将SQL设置为字符串
SQL=“插入tblProd_颜色(ProdID,ColorID)”&_
“选择tempColorTable.ProdID、tempColorTable.ColorID”&_
“来自tempColorTable”
DoCmd.RunSQL
'用值信息填充产品表
有工作
对于i=1的行计数
艾德纽卢比
rs.字段(“产品”)=范围(“A”&i+1).值
rs.字段(“值”)=范围(“C”&i+1).值
rs.更新
接下来我
以
有工作
对于i=1的行计数
艾德纽卢比
rs.字段(“产品”)=范围(“A”&i+1).值
rs.字段(“值”)=范围(“C”&i+1).值
rs.更新
接下来我
以
如果结束
这段代码还不能完全工作,但在我投入时间使其工作之前,我想知道我是否至少在正确的轨道上

谢谢你的意见

我也有同样的情况。
我使用了[HeaderTable]我最终做了一些与你的答案非常相似的事情。谢谢你的输入!
1. Created a Header table that stores all the "Header Data", in your case ProdID,Value

2. Created a table containing "Detail Data" in your case ProdID,RowNo,Color

3. Insert all Row's ProdID into Header Table
4. Split the values in  the field Color based on index of (,)Comma. For each Substring insert a row into Detail table with ProdID,RowNo,Substring as color.