У меня возникли проблемы с этим сценарием VBA, и он, кажется, продолжает добавлять забавные символы (т. Е. ») Каждый раз, когда читает файл .SQL. Я считаю, что это связано с кодировкой.
Option Explicit
Sub SomeExtract()
With Application
.ScreenUpdating = False: .DisplayAlerts = False: .Calculation = xlCalculationManual: .EnableEvents = False
End With
Dim strSQL As String, filePath As String, fileSQL As Integer, row As String
Dim connSQL As ADODB.Connection, serverName As String, databaseName As String, userID As String, userPassword As String, rs As ADODB.Recordset
fileSQL = FreeFile
strSQL = ""
filePath = Application.ThisWorkbook.Path & "\somesql.sql"
Open filePath For Input As fileSQL
Do Until EOF(fileSQL)
Line Input #fileSQL, row
strSQL = strSQL & row & vbNewLine
Loop
Close #fileSQL
serverName = "someserver"
databaseName = "somedb"
Set connSQL = New ADODB.Connection
Set rs = New ADODB.Recordset
connSQL.Open "Provider=SQLOLEDB;Server = " & serverName & ";Database = " & databaseName & _
";Trusted_connection=yes;"
rs.Open strSQL, connSQL, adOpenStatic
With ThisWorkbook.Sheets("test").Range("A1:Z1000000")
.ClearContents
.CopyFromRecordset rs
End With
With Application
.ScreenUpdating = True: .DisplayAlerts = True: .Calculation = xlCalculationAutomatic: .EnableEvents = True
End With
ExitPoint:
With Application
.ScreenUpdating = True: .DisplayAlerts = True: .Calculation =
xlCalculationAutomatic: .EnableEvents = True
End With
Set rs = Nothing
Exit Sub
ErrHandler:
With ThisWorkbook
.Sheets("Control").Range("B1").Value = Err.Description
.Sheets("Control").Range("C1").Value = strSQL
End With
Resume ExitPoint
End Sub
В сообщении об ошибке говорится: «Ошибка выполнения '-2147217900 (80040e14)': неправильный синтаксис рядом с '>>';». В файле SQL нет >> или каких-либо других символов, как показано в сообщении об ошибке. Фактически, я заменил .sql, чтобы он содержал только прямой оператор SELECT. Но я все еще вижу, как забавные символы добавляются, когда он читается Excel VBA (например, ï »¿выбрать 100 лучших * из теста» вместо «выбрать 100 лучших * из теста»).
Я действительно думал, что это было изначально, но затем я заменил strSQL простым оператором select = "Select * from someTable" и продолжаю видеть то же сообщение об ошибке.
Вы не открываете RecorSet, вы уже открыли соединение. rs = connSQL.Execute (strSQL) Edit: однако вы закрываете rs.Close, когда закончите.
@RicardoA, это правильно, но не имеет значения; rs.Open
совершенно законен ... слишком много способов сделать то же самое с ADODB: я бы сказал, что вы не выполняете соединение, вы выполняете параметризованную команду ;-)
Должен быть >>
где-то ... попробуйте for i = 1 to connSQL.Errors.Count - 1 : ?connSQL.Errors(i).Description : next
в непосредственной панели в режиме перерыва после получения этой ошибки. Может там больше информации.
Да, вы правы, по каким-то странным причинам, когда файл SQL читается в excel, он добавляет следующие ведущие символы, которых даже нет в файле сценария SQL «ï» ¿»
Mathiue и @Ricardo A, я редактировал этот вопрос, основная причина, похоже, заключается в том, как Excel VBA читает инструкцию SQL с этими забавными ведущими символами (т.е. ï »¿) из файла .SQL
Скорее всего, это спецификация UTF-8, т.е. у вас проблемы с кодировкой. Откройте файл .sql в Notepad ++ и измените кодировку на ANSI.
Возможно, открытие файла в простом старом Блокноте, удаление нежелательной почты и последующее сохранение могут просто исправить это.
Некоторый контекст: stackoverflow.com/questions/31435662/…
Если вы [Отлаживаете] ошибку, выделенный оператор
rs.Open
сообщает вам, что ошибка произошла при выполненииstrSQL
, и поэтому «Неправильный синтаксис рядом с '>>'» может означать только то, чтоstrSQL
недопустимое содержимое SQL ;-) Я бы выстрелил вверх непосредственная панель (Ctrl + G) и выполните?strSQL
, чтобы получить его буквальное значение, где я буду искать оскорбительные токены '>>'. Работает ли файл .sql как есть в SQL Server Management Studio?