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