SQL复制表值到新表

时间:2013-08-28 07:24:29

标签: sql-server excel-vba vba excel

您好我正在尝试使用Select * INTO query将excel表中的值复制到同一数据库中的新表中。

提取到excel的数据来自其他表,在编辑excel中的一些列之后,我需要将excel表发送回SQL数据库并创建新表。

我的代码出现了问题:

Run- time error '-2147217900 ' Automation Error

我正在使用 VBA宏将表值导入并导出到Excel中的 SQL

这是我的代码

Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

'Assumes that you have Field1, Field2 and Field3 in columns A, B and C
'For this example we can assume that the data exists on Sheet1, with a header on row
'1 and data in rows 2-11
'Also assume that the fields are defined as character (e.g. varchar or char)
'Text values must be enclosed in apostrophes whereas numeric values should not.

'adoCN.Open

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

sSQL = "SELECT * INTO TestTable FROM Sheets(1)$"

***adoCN.Execute sSQL***

Next lRow

adoCN.Close

Set adoCN = Nothing


'On Error GoTo 0

行错误: adoCN.Execute sSQL

请帮帮我。

3 个答案:

答案 0 :(得分:1)

我很确定错误是SQL无法识别"表格(1)$"。短语i" sSQL"被发送到adodb.connection,因此它不在Excel中处理(尽管从Excel-VBA调用)。因此,Excel中的任何引用都必须作为字符串传递,否则会导致错误。

我不会尝试将整个表一次放入SQL,但是这行是为了行,因为如果你有任何数据问题(字符串为Long,错误的数据格式),整个表将被抛回。

我会使它与http://www.vb-magazin.de/forums/forums/post/9581.aspx

类似

(如果您需要任何帮助翻译,请告诉我)

...有一个重要的区别:每个" add.new"是成功的,我会在Excel的适当行中发表评论,所以肯定不会再次传输。在dbRecord.Update行

之后你会这样做
xls_Appl.ActiveCell.Offset(I,6).Value = "send_to_sql"

当然,在处理它的每一行的开头,你想要检查这个文本是否已经存在,如果是这种情况,请转到下一个项目。

我希望这可以帮到你, 最大

答案 1 :(得分:1)

简单地说,你不能这样做。

首先:SELECT * INTO TestTable

您只能运行此语句一次。您正尝试为电子表格中的每一行创建相同的表格。

第二名:.. FROM Sheets(1)$

我对VBA没有信心,但我想你期望从ADO.NET中获得一些神奇的东西。

你需要:

  1. 在FOR
  2. 之外创建表
  3. 在FOR
  4. 内插入

答案 2 :(得分:0)

我可以看到该代码存在一些问题。

首先,您不能通过SQL语句仅传递工作表的名称。 SQL Server甚至不知道您的工作表的存在(或者根本不知道Excel)。它们是完全独立的实例。

其次,正如某人已经指出的那样,每次运行"SELECT * INTO ..."语句时,实际上都是在创建一个只有一行的新表。

你应该做这样的事情。我假设(正如您在评论中所说)数据库中已存在TestTable,并且您的工作表确实是Sheets(1)。此外,您还没有告诉哪个列具有哪种格式,因此我假设它们都是字符串,并在语句中的值周围加上引号。

Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

With Sheets(1)

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

  sSQL = "INSERT INTO TestTable VALUES ('" & .Cells(lRow, 1) & "', '" & .Cells(lRow, 2) & "', '" & .Cells(lRow, 3) & "')"

  adoCN.Execute sSQL

Next lRow

End With

adoCN.Close

Set adoCN = Nothing