循环将多个值插入到SQL Server中

我想在一个SQL插入语句中插入大量的值到SQL Server中。 所以例如..

Insert Into someDataBase Values(value1, value2, value3,..., value120, value121) 

所有这些值将在Excel表格中按正确顺序排列。 我已经创build了一个循环来遍历所有的121值,但我不能想到一个循环插入值,而不是单独写入每个值。

谁能帮我吗?

我的代码如下所示:

 Sub AddRows() ' In VBE you need to go Tools References and check Microsoft Active X Data Objects 2.x library Dim Cn As ADODB.Connection Dim Server_Name As String Dim Database_Name As String Dim User_ID As String Dim Password As String Dim SQLStr As String Dim comm As ADODB.Command Set comm = New ADODB.Command Dim param As ADODB.Parameter Dim getType As String SQLStr = "Insert Into [DB] Values(" For i = 1 To 121 'Get type getType = CellType(i, Cells(2, i)) SQLStr = SQLStr & "?," Set param = New ADODB.Parameter param.Name = "Param" & i Set param = comm.CreateParameter("param" & i, getType, adParamInput, 1000) param.Attributes = adParamNullable Debug.Print (param.Type) comm.Parameters.Append param Next i SQLStr = Left(SQLStr, Len(SQLStr) - 1) & ");" Set Cn = New ADODB.Connection Cn.CommandTimeout = 0 Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _ ";Uid=" & User_ID & ";Pwd=" & Password & ";" comm.ActiveConnection = Cn comm.CommandText = SQLStr comm.CommandType = adCmdText Dim test As String lastrow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row 'For x = 2 To lastrow For i = 1 To 121 Debug.Print (Cells(2, i).Value) comm.Parameters.Item("Param" & i).Value = Cells(2, i).Value Next comm.Execute 'Next x Cn.Close Set Cn = Nothing 

结束小组

这是我的CellType函数的一部分:

 Private Function CellType(Num) As MultipleValues Application.Volatile CellType.CellNum = 50 Select Case True Case Num = 1 CellType.CellType = adInteger Case Num = 2 CellType.CellType = adInteger Case Num = 3 CellType.CellType = adVarWChar CellType.CellNum = 255 Case Num = 4 CellType.CellType = adCurrency Case Num = 5 CellType.CellType = adVarWChar CellType.CellNum = 255 

前5个值的值是:0,null,6071/1,44.5,Biltmore Fleur De Lis Collection正宗的锻铁

它打破了第二个值是一个空值,但应该是一个整数。

我通常会同意使用SSIS包是解决这个问题的最好方法,但是如果你想通过代码来实现,那么ADODB中的参数化查询并不困难:

使用? 在创buildINSERT语句时将参数占位符,并将参数添加到ADODB.Command对象:

 Dim comm As ADODB.Command Set comm = New ADODB.Command Dim param As ADODB.Parameter SQLStr = "Insert Into [db] Values(" For i = 1 To 121 SQLStr = SQLStr & "?," Set param = New ADODB.Parameter param.Name = "Param" & i comm.Parameters.Append param Next i SQLStr = Left(SQLStr, Len(SQLStr) - 1) & ");" 

完成后,您将拥有一组匹配的参数和占位符。 然后打开你的连接(或者在这之前做,它确实没有太大的区别),并设置命令:

 comm.ActiveConnection = Cn comm.CommandText = SQLStr comm.CommandType = adCmdText 

最后,循环遍历每条logging的行,遍历值并将它们分配给参数,并对每行执行:

 lastrow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row For x = 2 To lastrow For i = 1 To 121 comm.Parameters.Item("Param" & i).Value = Cells(x, i).Value Next comm.Execute Next x 

请注意,ADODB命令经过了优化,可以循环使用 – 后端对象更像是一个批处理插入,所以试图build立一个巨大的插入将立即将所有logging都写入,这并没有太多意义。

不知道如果Excel电子表格有特殊的格式,但如果它是一个CSV格式,您可以使用SQL Server导入和导出向导来执行此操作。 就是这样:

  1. 在SQL Server Management Studio中,login到您的数据库服务器。
  2. 右键单击要导入数据的数据库,然后select任务 – >导入数据 导入数据映像
  3. select数据源屏幕上,从数据源下拉列表中selectMicrosoft Excel。 在Excel文件path中inputExcel电子表格的文件path 。 在Excel版本中select适当的Excel版本 。 如果电子表格中的第一行包含数据库列名称,请选中第一行有列名称 。 如果只是数据,取消选中。 select数据源图像
  4. 单击“ 下一步”,然后在“ 目标”下拉列表中select“ Microsoft OLE DB Provider for SQL Server ”。 在服务器名称下拉列表中select您的SQL Server名称 。 selectauthentication选项。 单击刷新 ,然后select要插入Excel数据的数据库。
  5. 在“ 指定表复制或查询”窗口上,select从一个或多个表或视图中复制数据 。 点击下一步
  6. select“ 源”列中Sheet 1 $旁边的checkbox。 单击“ 目标”列,然后select要将Excel数据导入到的表格。 点击预览button将显示查询以及数据在新表格中的显示方式。 点击下一步
  7. 审查数据types映射页面上的映射应该是好的。 这个窗口允许你设置SQL转换的选项。 默认值应该没问题。 点击下一步
  8. 点击下一步 。 导入应该立即运行。
  9. 查看摘要页面,然后单击完成
  10. 导入将执行几个操作。 绿色复选标记表示操作成功。 用X表示读取圆圈表示失败。 如果发生故障,请在这里将您的数据和“ 消息”列中的超链接消息发送到此处。

如果你愿意,你也可以在MSDN上查看批量插入命令。 我没有足够的代表张贴更多的图像。 当我有足够的时间后我会完成。