Вызов функции user-def SQL Server в запросе MS Access с получением «Неопределенная функция dbo.Funcname в выражении» - PullRequest
0 голосов
/ 04 ноября 2019

В MS Access (я думаю, что это версия 365, поскольку это то, на что ссылается субъект справки, но нет опции «справка / информация»), я модифицирую запрос из-за изменения в бизнес-логике. Запрос ссылается на таблицы на сервере SQL Server (2016) через соединение ODBC.

В «SQL View» запроса я добавил в раздел «WHERE» предложение:

AND(dbo_GetPrevNameCatAsOfDate (dbo_Name.ID, Date () = 'FM'))

Сохраняет все нормально (что Access не делает при синтаксической ошибке.)

Выполнение запроса,появляется диалоговое окно с сообщением: неопределенная функция 'dbo_GetPrevNameCatAsOfDate' в выражении.

Я также пробовал это в представлении SQL с помощью "dbo". и без префикса перед «Get» вместо «dbo _»

Функция отлично работает при запуске в SQL Server. Запрос Access отлично работает, когда я удаляю это предложение AND из представления SQL.

У вас есть идеи?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Если вы хотите запустить функцию, определенную в SQL-сервере из Access, вам нужно настроить свой запрос как сквозной запрос. Это делается в режиме конструктора с помощью кнопки Passthrough query . Имя функции использует точку, dbo.GetPrevNameCatAsOfDate

Также, если вы хотите использовать функции сервера SQL, вы не можете смешивать их с функциями доступа. Это означает, что Date() должно стать GETDATE().

Иначе, вам придется реализовать свою бизнес-логику в VBA для ее локального запуска. Но обычно его реализация в T-SQL и запуск на SQL Server выполняется быстрее.

0 голосов
/ 05 ноября 2019

Вы не упоминаете, что / где находится функция dbo_GetPrevNameCatAsOfDate ().

Все, что работает на стороне сервера 100% sql (например, представление), потребует от вас преобразования функции VBA в то, что мы вызываемфункция «масштабирования» в T-SQL. Таким образом, вы можете переписать вышеуказанную функцию VBA в функцию T-SQL. После того, как вы создадите эту функцию, а затем ТОЛЬКО В Access SQL, как вы можете использовать пользовательскую функцию VBA в любом sql, вы можете сделать то же самое в T-SQL.

В большинстве случаев эту пользовательскую функцию VBA вы использовалив Access SQL, скорее всего, довольно короткая функция, поэтому преобразование таких функций в функции T-sql (они называются функциями масштабирования) приведет к тому же процессу разработки.

Единственным недостатком является то, что, хотя вы можете использовать точно такое же имя функции в t-sql, к сожалению, все функции масштабирования требуют префикса схемы (я ДЕЙСТВИТЕЛЬНО желаю, чтобы это было не так). Так что, если вы вырезаете и вставляете клиентскую часть Access SQL в SSMS и создаете представление? Ну, вы должны добавить DBO. перед именем функции. Но в целом воссоздание функции VBA как T-SQL - отличная идея для таких проектов миграции. У меня была пользовательская функция GST () в VBA. А чтобы переместить sql и части в SQL, я заново создал функцию GST () в T-SQL и, таким образом, смог продолжать использовать функцию GST () в моих запросах и представлениях t-sql.

Последнее, но не менее важное?

Что ж, на стороне клиента доступа вы, несомненно, будете связаны с представлением. Итак, создайте запрос на стороне клиента в связанном представлении, и затем вы можете включить свою пользовательскую функцию VBA.

Если вам действительно нужно и вы хотите использовать связанное представление, а не запрос клиента на основе связанного представления. затем вы можете просто заново создать пользовательскую функцию VBA в качестве функции масштабирования t-sql, а затем продолжать использовать эту функцию в любом запросе t-sql, включая представления.

Таким образом, клиентский запрос для связанногопросмотр может включать + использовать вашу функцию. Однако для простоты использования и лучшей производительности рассмотрите возможность создания этой подпрограммы функции VBA в качестве подпрограммы t-sql. Хотя t-sql несколько ограничен по сравнению с VBA, он имеет циклы, строковые выражения, возможность запроса и практически тот же набор функций, которые вы найдете в типичной подпрограмме VBA, особенно те, которые используются как часть запроса sql. как выражение.

Редактировать

У вас есть это:

AND (dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, Date() = 'FM') )

Это не выглядит правильно. Предполагается, что эта функция возвращает некоторую строку, и у вас есть:

dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, Date()

Это должно быть:

dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, Date() )

Не важно, где, когда или что вы делаете с этимфункция, но вам нужна закрывающая скобка для функции. Как я уже говорил, вам также нужно добавить к схеме ЛЮБУЮ функцию масштабирования. Таким образом, мы получаем:

dbo.dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, Date() )

ОДНАКО, в SQL-сервере нет функции date (). Вы должны использовать GETDATE ()

ОДНАКО ОДНАКО !! GETDATE () вернется сегодня и ТАКЖЕ часть времени.

Итак, если вы хотите только сегодня, и только дату, а не дату?

Тогда вы должны использовать это:

 CAST (GETDATE() AS DATE) 

Итак, теперь у нас есть это допустимое выражение:

dbo.dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, CAST (GETDATE() AS DATE) )

А затем с помощью вышеупомянутой функции предполагается, что она возвращает varChar, так что теперь мы можем поменять вышеприведенное на ваше гдепредложение, и мы получаем:

AND 
(
dbo.dbo_GetPrevNameCatAsOfDate( dbo_Name.ID, CAST (GETDATE() AS DATE) ) = 'FM'
)

Таким образом, нет DATE () t-sql. И вы должны использовать префикс dbo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...