Подтвердить что ты не робот

Динамический SQL не возвращает результаты запроса доступа Access

Рассмотрим следующий код.

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * FROM caseinformation'
EXEC(@sql)

Когда я запускаю это в SSMS, он отображает те же результаты, что и при запуске SELECT * FROM caseinformation. Но когда я запускаю это как сквозной запрос доступа, я получаю следующее сообщение об ошибке:

Проходной запрос с атрибутом ReturnsRecords, установленным в True, не возвращал никаких записей.

Что дает?

4b9b3361

Ответ 1

Добавьте в начале вашего динамического сквозного запроса следующее:

SET NoCount ON

и вы сможете использовать запрос из MS Access.

Почему это работает, мне придется уйти, чтобы другие объясняли, но я знаю, что это работает.

Ответ 2

Это объяснение неверно:

Заявление о том, что Access жаловалось, было на самом деле SELECT @sql =, который выглядит как оператор select, но не вернуть набор записей. Когда вы говорите "SET NOCOUNT ON", это отключает Свойство ReturnsRecords, которое вызывает доступ к отказу запроса.

... поскольку это не то, что происходит.

Более подробное объяснение заключается в том, что SQL Server может возвращать несколько результатов из запроса или вызова хранимой процедуры. Эти результирующие наборы - это не все наборы записей и могут быть комбинацией скалярных значений и наборов строк. Когда Set NoCount выключен, SQL Server возвращает последовательно, набор строк, а затем количество записей BOTH на вызывающий код. Поскольку VBA не ищет это сложное сочетание значений вершин скалярного и набора записей, исходная ошибка возникает (потому что скалярное значение фактически возвращается в TOP из наборов результатов, то есть FIRST).

Когда в SQL Server выполняется Set NoCount ON, это говорит SQL Server просто не возвращать счет как часть набора результатов. Это приводит к тому, что Access/VBA/DAO может распознавать набор результатов как набор записей (даже если это фактически набор записей), а затем все работает так, как ожидалось.

Ответ 3

попробуйте указать ваши столбцы вместо *