Я выполняю простой запрос к SQL таблице серверов:
SELECT * FROM MyTable
Таблица содержит три столбца с типами int
, bit
и datetime2(0)
. Я использую код в соответствии с:
Dim cnn As ADODB.Connection
Dim rst As ADODB RecordSet
Dim rngDest As Range
:
: ' etc
:
rst.Open "SELECT * FROM MyTable", cnn
rngDest.CopyFromRecordset rst
Это хорошо работает, , за исключением , что, кажется, неправильно понимает типы полей : в нем указано, что типами полей являются 3, 11, 202, которые, согласно документации, Integer (правильно), Boolean (правильно, я думаю) и NVarChar2 - неверно. Третье поле должно быть date , конечно (тип «Дата» равен 135).
В качестве фона: я перенес данные с Access на SQL Server используя SSMA. Эта таблица теперь имеет три типа столбцов, которые я упомянул. Кроме того, я понимаю, что это хорошо известная проблема, что CopyFromRecordset может неправильно указывать типы полей, и я сначала подумал, что именно поэтому третий столбец (дата) отображался в Excel в виде строки, но при ближайшем рассмотрении я вижу, что, когда VBA прочитал набор записей, он уже считает, что поле является текстом, перед строкой CopyFromRecordset. Я чувствую, что если бы я мог заставить VBA как-то распознать, что третье поле должно быть датой, тогда я мог бы преобразовать его внутри. Я бы предпочел не создавать решение для этой таблицы специально, потому что у меня много, много таблиц и представлений, которые необходимо обработать, поэтому я бы предпочел найти подход, который работает для всех них.
Если это важно Я использую строку подключения:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=[REDACTED];Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=[REDACTED];
Может кто-нибудь помочь, пожалуйста?