2015-08-24 2 views
1

Предположим, у меня есть таблица в Excel с двумя столбцами (Name, Rate) (скажем, это имя этой таблицы tExcel). Таблица начинается в клетке (2,1), и дата статично (в ячейке (1,1))Вставка значений в таблицу SQL Server через VBA

Я хочу, чтобы вставить эти значения в SQL Server 2008 tRate таблица со следующей логикой

insert tRate(ID, Rate, Date) 
    select 
     s.ObjectID, e.Rate, Date -- date comes from cell(1,1). DateType is smalldatetime 
    from 
     tExcel e, tSecurity s 
    where 
     e.Name = s.Number 

I 've создал соединение

Sub disp_cust() 
Dim adoCN As ADODB.Connection 
Dim sConnString As String 
Dim sSQL As String 
Dim lRow As Long, lCol As Long 
Set cn = New ADODB.Connection 
sConnString = "Provider=sqloledb;Server=xxx;Database=xxx;User Id=xxx;Password=xxx" 
Set adoCN = CreateObject("ADODB.Connection") 
adoCN.Open sConnString 
adoCN.Close 
Set adoCN = Nothing 
End Sub 

Спасибо за помощь.

EDIT для @jaimetotal ответа

sql= "insert tRate(ID, Rate, Date) SELECT s.ObjectId ," & Replace(Row.Cells(2).Value, ",", ".") & ",'" & defaultDate & "' FROM tSecurity s where s.number = '" & row.Cells(1).Value & "'; " 
+0

[Вредные привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет ** назад), и его использование обескуражено –

+0

Спасибо @marc_s, но проблема определенно не связана с вашим комментарием – Sher

ответ

2

Для этого образца, я полагаю, что tExcel.Number является первыми колонками и tExcel.Rate является вторым. Идея здесь состоит в том, чтобы сделать a для каждой строки в таблице (или диапазоне) и создать инструкцию insert/select.

Dim rng as Range 
Dim defaultDate As string 
Dim sql as string, bulkSql as string 

Set rng = Range("A1:XX") -- Range of the table. 
defaultDate = Format(Range("A2").Value, "yyyy/mm/dd") 
bulkSql = "" 

'generated sample: insert tRate(ID, Rate, Date) SELECT s.ObjectId, '0.15', '2015/08/24' FROM tSecurity s where s.Number = '007' 

For Each row In rng.Rows 

    sql= "insert tRate(ID, Rate, Date) SELECT s.ObjectId " & "','" & row.Cells(2).Value & "','" & defaultDate & "' FROM tSecurity s where s.number = '" & row.Cells(1).Value & "'; " 

    bulkSql = bulkSql & sql 

Next row 

adoCn.Execute bulkSql, , adCmdText 

Edit: Если вы на самом деле означает таблицу, чем вы можете использовать этот пример на основе из here.

Dim lo As Excel.ListObject 
Dim ws As Excel.Worksheet 
Dim lr As Excel.ListRow 

Set ws = ThisWorkbook.Worksheets(1) 
Set lo = ws.ListObjects("tExcel") 

'The other code from the previous sample. Use the following ForEach instead 

For Each lr In lo.ListRows 
    Dim Rate as String 
    Dim Number as String 

    Rate = Intersect(lr.Range, lo.ListColumns("Rate").Range).Value 
    Number = Intersect(lr.Range, lo.ListColumns("Number").Range).Value 

    'Generate the query from these values instead 

Next lr 
+0

Спасибо, @jaimetotal. Первый ответ, похоже, совместим с моими потребностями. Я сделал все эти сотрудники, но я получаю сообщение об ошибке: Ошибка выполнения «1004»: определение приложения или объектная ошибка. Не могли бы вы помочь. он встречается в строке, где задан запрос – Sher

+0

Я пробовал запрос, добавляя значения smaple, он работает. Может быть, есть какая-то синтаксическая ошибка? – Sher

+0

Привет, Шер, мой плохой. Проблема заключалась в том, что Rows.Cell (0) по умолчанию, VBA не запускает массив в позиции 0, но 1. – jaimetotal

Смежные вопросы