2014-02-12 2 views
0

Я увеличиваю базу данных Access 2010 до SQL-сервера. Существует обновляемый запрос «Сделать таблицу», который запускается для создания таблицы и ее заполнения. В настоящее время он заполняет бэкэнд-таблицу в другом файле ACCDB. Я переместил все базовые таблицы в SQL Server и попытался изменить запрос, чтобы сделать таблицу на SQL Server.Использование Access для создания запроса таблицы для создания таблицы SQL Server с использованием соединения ODBC

Я удалил путь к ACCDB-файлу из свойства Destination DB и поместил строку подключения ODBC в свойство Dest Connect Str.

При запуске запроса, я получаю ошибку

ODBC Сбой вызова Существует уже имя объекта «MyTableName» в базе данных (# 2714)

я удалить таблицу на сервере SQL первой а затем запустить запрос, в котором он работает. Если вы используете локальную таблицу, она правильно удалит таблицу, заново ее создаст и затем заполнит. Используя соединение ODBC, кажется, что он не может удалить его первым, что делает таблицу Make бесполезной.

У меня есть удаленная таблица, сконфигурированная как связанная таблица в Access, надеялась, что существует возможность использовать ее напрямую, без повторного указания строки подключения еще раз. Это тоже казалось невозможным.

Ищет решение или любые возможные альтернативы этой проблеме. У меня почти 20 запросов такого типа.

+0

Когда вы говорите «Сделать запрос таблицы», это серия SQL-запросов (может быть, в процедуре?), Или мы говорим о VBA или что-то еще? Если столбцы остаются постоянными, вы можете захотеть переключиться на ['TRUNCATE'] (http://msdn.microsoft.com/en-us/library/ms177570.aspx) вместо того, чтобы отбрасывать таблицу. – jpmc26

+0

Это параметр запроса доступа, называемый «Сделать таблицу», где он будет запускать запрос и создавать таблицу и заполнять таблицу. Это всего лишь один SQL-запрос, созданный Access, путем заполнения других свойств в его построителе запросов, мастере и т. Д. – Ron

+0

@Ron Если вы можете конвертировать из таблицы «make table» в «append query», выпустите таблицу назначения как jpmc26 предложил, а затем выполнить append. – HansUp

ответ

1

косметической таблицы запрос ориентация внешней базы данных ODBC будет иметь .SQL свойства, подобное этому

SELECT localTable.ID, localTable.textCol 
INTO (ODBC;DSN=myDb;Trusted_Connection=Yes;DATABASE=myDb;AutoTranslate=No;) externalTable 
FROM localTable; 

Поэтому мы можем использовать немного VBA коду, чтобы определить, что тип макияжа таблицы запроса, падение таблицу на SQL Server, а затем выполнить запрос make-таблицы. Таким образом, вместо того, чтобы делать

DoCmd.OpenQuery "YourMakeTableQueryName" 

(как я подозреваю, что код делает сейчас), вы можете использовать

RunMakeTableQuery "YourMakeTableQueryName" 

где RunMakeTableQuery определен в стандартном модуле VBA, как

Option Compare Database 
Option Explicit 

Public Sub RunMakeTableQuery(MakeTableQueryName As String) 
    Dim cdb As DAO.Database, qdf As DAO.QueryDef, qdf2 As DAO.QueryDef 
    Dim i As Long, j As Long, ConnectionString As String, TableName As String 
    Const ExternalIntoTag = "INTO (ODBC;" 

    Set cdb = CurrentDb 
    Set qdf = cdb.QueryDefs(MakeTableQueryName) 
    i = InStr(1, qdf.SQL, ExternalIntoTag, vbBinaryCompare) 
    If i > 0 Then 
     ' target table is external (SQL Server) 
     i = i + Len(ExternalIntoTag) 
     j = InStr(i, qdf.SQL, ")", vbBinaryCompare) 
     ConnectionString = Trim(Mid(qdf.SQL, i, j - i)) 

     i = InStr(j + 1, qdf.SQL, "FROM", vbBinaryCompare) 
     TableName = Trim(Mid(qdf.SQL, j + 1, i - j - 3)) 

     Set qdf2 = cdb.CreateQueryDef("") 
     qdf2.Connect = "ODBC;" + ConnectionString 
     qdf2.ReturnsRecords = False 
     qdf2.SQL = "IF OBJECT_ID('" & TableName & "','U') IS NOT NULL DROP TABLE [" & TableName & "]" 
     qdf2.Execute dbFailOnError 
     Set qdf2 = Nothing 
     qdf.Execute dbFailOnError 
     Set qdf = Nothing 
    Else 
     ' target table is an Access table 
     Set qdf = Nothing 
     ' this will overwrite an existing target table with no prompts 
     DoCmd.SetWarnings False 
     DoCmd.OpenQuery MakeTableQueryName 
     DoCmd.SetWarnings True 
    End If 
    Set cdb = Nothing 
End Sub 
+0

спасибо, я думаю, это может быть так, как мне придется идти. Я обнаружил, что все запросы были вызваны из макросов, поэтому, возможно, я смогу использовать это вместе с добавлением некоторых предварительных шагов к макросу для удаления таблиц. – Ron

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