Я создал в Excel динамический именованный диапазон с именем «продажа» на листе «Продажи»:
=OFFSET(Sales!$A2,0,0,COUNTA(Sales!$A:$A),8)
Затем я использую компоненты TFDConnection и TFDQuery для связи с ним. Драйвер ODBC.
Я знаю, как использовать в SQL статический неименованный диапазон:
select * from [Sales$]
select * from [Sales$A1:A100]
но если я пишу SQL для динамического именованного диапазона, например
select * from [Sales$sale]
Я получаю сообщение об ошибке, что таблица с таким именем не найдена.
Как правильно написать имя именованного диапазона/динамического именованного диапазона в SQL?
Краткий ответ: это невозможно.
Вы можете использовать только определенные пользователем статические именованные диапазоны в качестве таблицы в запросе ODBC. Нельзя использовать следующее:
Существует способ проверить, можно ли использовать именованный диапазон в качестве таблицы SQL: в Excel выберите:
Данные->Новый запрос->Из других источников->Из Microsoft Query
Подключитесь к тому же источнику ODBC, и вы увидите список доступных таблиц (или сообщение о том, что их нет).
Однако он не будет отображать именованные диапазоны с областью действия, установленной на «Рабочий лист», с первой попытки, и их все еще можно использовать. Эта ошибка исправляется, когда вы сначала возвращаете какие-либо результаты запроса обратно в Excel, а затем решаете отредактировать запрос.
Чтобы получить аналогичные результаты без запроса динамического именованного диапазона, вы можете использовать один из следующих подходов:
Если вы не беспокоитесь о расположении именованного диапазона в будущем, вы можете использовать:
select * from [Sales$A2:H] where A is not null
Условие is not null
необходимо только в том случае, если под таблицей в столбцах B:H есть другие данные. Даже без него будет возвращено только пересечение диапазона, который вы запрашиваете, и UsedRange.
Если расположение данных может измениться в будущем, вы можете определить статический именованный диапазон «продажи», достаточно большой, чтобы убедиться, что он содержит все данные (даже до последней строки рабочего листа), но тогда вам абсолютно необходимо условие is not null
:
select * from sale where A is not null
Если для именованного диапазона задана область действия «Рабочий лист», вам необходимо добавить имя рабочего листа:
select * from Sales$sale where A is not null