2014-08-31 7 views
0

У меня есть запрос на связанную таблицу в MS Access, которая использует функцию SQL Server getdate(). Тем не менее, я получаю эту ошибку при попытке выполнить запрос:В MS Access SQL Server Связанная таблица проходит через запрос

Неопределенная функция GetDate в функции

Как создать связанную таблицу, которая позволяет использовать синтаксис SQL Server T-SQL? Я вижу, что это называется pass through query, но я не знаю, как настроить его, чтобы использовать соединение в связанной таблице в качестве прохода через запрос.

В настоящее время с помощью Access 2010. запроса:

select getdate() 

Если это поможет, я использовал следующий код VBA, который генерирует ссылку таблицы в SQL Server:

Function LinkTable(LinkedTableAlias As String, Server As String, Database As String, SourceTableName As String, OverwriteIfExists As Boolean, Username As String, Password As String) 
    'This method will also update the link if the underlying table definition has been modified. 
    If (InStr(1, LinkedTableAlias, "MSys") > 0) Then 
     Log "Skipping " & LinkedTableAlias 
     Exit Function 
    End If 
    'The overwrite parameter will cause it to re-map/refresh the link for LinktedTable Alias, but only if it was already a linked table. 
    ' it will not overwrite an existing query or local table with the name specified in LinkedTableAlias. 

    'Links to a SQL Server table without the need to set up a DSN in the ODBC Console. 
    Dim tdfLinked As DAO.TableDef 

    ' Open a database to which a linked table can be appended. 
    Dim dbsCurrent As Database 
    Set dbsCurrent = CurrentDb() 

    'Check for and deal with the scenario ofthe table alias already existing 
    If TableNameInUse(LinkedTableAlias) Then 
     'If InStr(dbsCurrent.TableDefs(LinkedTableAlias).Connect, "AccessBackup") Then 
     ' Exit Function 
     'End If 

     If (Not OverwriteIfExists) Then 
      Log "Can't use name '" + LinkedTableAlias + "' because it would overwrite existing table." 
      Exit Function 
     End If 
     'delete existing table, but only if it is a linked table 
     'If IsLinkedTable(LinkedTableAlias) Then 
      dbsCurrent.TableDefs.Delete LinkedTableAlias 
      dbsCurrent.TableDefs.Refresh 
     'Else 
     ' Log "Can't use name '" + LinkedTableAlias + "' because it would overwrite an existing query or local table." 
     ' Exit Function 
     'End If 
    End If 

    'Create a linked table 
    Set tdfLinked = dbsCurrent.CreateTableDef(LinkedTableAlias) 
    tdfLinked.SourceTableName = SourceTableName 

    tdfLinked.Connect = "ODBC;DRIVER={SQL Server};SERVER=" & Server & ";DATABASE=" & Database & ";UID=" & Username & ";PWD=" & Password & ";" 

    On Error Resume Next 
    dbsCurrent.TableDefs.Append tdfLinked 
    If (err.Number = 3626) Then 'too many indexes on source table for Access 
      err.Clear 
      On Error GoTo 0 

      If LinkTable(LinkedTableAlias, Server, Database, "vw" & SourceTableName, OverwriteIfExists, Username, Password) Then 
       Log "Can't link directly to table '" + SourceTableName + "' because it contains too many indexes for Access to handle. Linked to view '" & "vw" & SourceTableName & "' instead." 
       LinkTable = True 
      Else 
       Log "Can't link table '" + SourceTableName + "' because it contains too many indexes for Access to handle. Create a view named '" & "vw" & SourceTableName & "' that selects all rows/columns from '" & SourceTableName & "' and try again to circumvent this." 
       LinkTable = False 
      End If 
      Exit Function 
    End If 
    On Error GoTo 0 

    '** Turn on error handling 
    On Error GoTo ErrorHandler: 
    tdfLinked.RefreshLink 


    LinkTable = True 

    Exit Function 
ErrorHandler: 
    Log "refreshlink failed for " & tdfLinked.Name 
    LinkTable = True 

ответ

1

Я не совсем понимаю, это заявление:

Как я создать связанную таблицу, которая позволяет использовать Синтаксис SQL Server T-SQL ?

Но это, как вы преобразовать существующий MS Access querydef для прохода через запрос:

Перейти в режим разработки в запросе, нажмите команду Query меню, затем SQL Specific затем Pass Through

Посмотреть это для скриншотов.

http://www.mssqltips.com/sqlservertip/1482/microsoft-access-pass-through-queries-to-sql-server/

1

причина, почему вы получают ошибку в том, что GETDATE() is не функция внутри MSAccess. Вы, вероятно, нужно Now(), чтобы получить дату и время, или вы можете использовать Date(), который обеспечивает дату

+0

'getdate()' является функцией в источнике данных, который является сервером ms-sql. Доступ ли автоматически конвертируется в t-sql, когда у вас есть связанная таблица? – SumGuy

+0

@SumGuy: - getdate() - это функция в MSSQL, а не MSAccess, и именно поэтому вы получаете ошибку. –

+0

Я понимаю это, но это не мой вопрос, как мне заставить его использовать связанный источник данных и выполнить проход через запрос в исходной базе данных? Я обновил оригинальный вопрос, спасибо за помощь до сих пор – SumGuy

0

Вот быстрый и грязный способ VBA для создания сквозного запроса:

Set qdf = CurrentDb.CreateQueryDef("testqry") 
' this is just your connection string 
qdf.Connect = "ODBC;Driver={SQL Server};Server=MSSQL1; Database=MyDB;Trusted_Connection=Yes" 
'anything here gets passed directly to and executed on the SQL Server 
qdf.SQL = "select getdate()" 
Set qdf = Nothing 

Теперь вы можете использовать «testqry», как будто это любой другой запрос доступа (насколько Выбор от него идет, во всяком случае)

0

Простой сохранить T-SQL запрос как пропуск, хотя

Select GetDate() 

Затем в VBA коде, вы можете пойти:

TheSqlDate = currentdb.QueryDefs("qPass").OpenRecordset()(0) 

Использование ADO и жестко прописывать строки подключения, и ОГРОМНЫЕ девелоперский другого кода, публикуемый здесь это просто способ наберут человеко-часы и создание мира poveity. Мое опубликованное решение ТОЛЬКО ОДНА ЛИНИЯ КОДА!

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