Похоже, что хранимый процесс работает нормально, если вы можете вызвать функцию SP_Barcode в непосредственном окне VBA, и для возврата значений требуется 2 секунды.
При вызове сохраненного процесса возникают некоторые издержкииз Access, как перевод (доступ к ODBC для SQL Server и обратно) и создание подключения к базе данных.Но, похоже, это не так уж плохо, если он работает с той же скоростью из непосредственного окна в VBA, что и с SQL-сервера.
Несколько очевидных вещей, которые нужно проверить, во-первых, форма не связана или не связанак источнику данных, т. е. делает ли он больше подключений к локальным и / или таблицам / запросам / хранимым процессам сервера SQL, которые могут быть узким местом?Если у вас есть подчиненные формы, проверьте также их привязки.Когда вы открываете форму, открывается ли ваше окно VBA при запуске тестов?Закрой его.Это ускорит процесс.
Это форма с одной записью или форма с несколькими записями?Это может вызывать это более 1 раза, чтобы заполнить форму с несколькими записями.Это увеличит количество подключений к базе данных SQL.
Вы выполняете вызов функции из поля или события загрузки?Если он вызывается в полях, он может вызываться несколько раз, что может привести к созданию нескольких соединений.
Если это простая форма без другого источника данных, вы можете создать существующий промежуточный запрос и затем изменить параметр SQLиз родительской формы (я предполагаю, что это база данных внешнего доступа на ПК каждого отдельного пользователя, а не общий ADP, MDB, доступ к которому получают несколько пользователей).Если он все еще медленный, то это не ваша функция.
Создайте Passthrough Query, например «WasteMainfestInfo_Passthru», с предварительно заполненным параметром и определенной строкой подключения через окно свойств, и сохраните его:
EXEC [dbo].[SPWise_WasteManifestInfoByBarcode ] @MyParmName = N'TestStringValue';
Установите привязки формы к WasteMainfestInfo_Passthru
В событии родительской формы, которое открывает эту форму, сделайте следующее:
Set mydb = CurrentDb()
Set qdf = mydb.QueryDefs("WasteMainfestInfo_Passthru")
sqlx = "exec [dbo].[SPWise_WasteManifestInfoByBarcode] @MyParmName = N'" & MyParam & "';"
qdf.SQL = sqlx
DoCmd.OpenForm "WasteMainfestInfo_Passthru", acNormal
....
Set qdf = Nothing
Set mydb = Nothing
Ваш код выглядит хорошо, поэтому я действительно не думаю, что этопроблема.Я бы добавил With и EndWith для объекта qdf, но это не сильно повысит производительность.