Краткий ответ
Это не сработает. По замыслу вы не можете получить псевдонимы таблиц из схемы результатов. И вы не можете рассчитывать на то, что сможете получить их из плана выполнения запроса.
Длинный ответ
Когда вы получаете результат запроса SQL, запрос уже был проанализирован, проверен, оптимизирован, скомпилирован в некоторое внутреннее представление и выполнен. Псевдонимы являются частью «исходного кода» запроса и обычно теряются где-то на шаге 1 и 2.
После выполнения запроса единственными вещами, которые можно увидеть в виде таблиц, являются: а) реальные физические таблицы и б) возвращаемые данные, рассматриваемые как одна анонимная таблица. Все между может быть преобразовано или полностью оптимизировано.
Если бы СУБД требовалось сохранять псевдонимы, было бы практически невозможно оптимизировать сложные запросы.
Возможные решения
Предлагаю решить проблему:
Являетесь ли вы (или ваше приложение) источником рассматриваемого запроса? В этом случае вы должны знать псевдонимы.
Если вы получаете запросы, предоставленные кем-то другим ... Ну ... Это зависит от того, почему вы добавляете, где причины.
Простое и безобразное решение
Если я правильно понимаю ваши требования:
Пользователь A вводит запрос в вашу программу.
Пользователь B может запустить его (но не может его редактировать) и видит возвращенные данные.
Кроме того, она может добавлять фильтры на основе возвращаемых столбцов, используя предоставленный вами виджет.
Вы не хотите применять фильтр внутри приложения, но вместо этого добавляете их в запрос, чтобы избежать выборки ненужных данных из базы данных.
В этом случае:
Когда A редактирует запрос, попробуйте запустить его и собрать метаданные для возвращаемых столбцов.
Если ColumnName
не уникальны, пожаловаться автору.
Сохранять метаданные с запросом.
Когда B добавляет фильтр (на основе метаданных запроса), сохраняйте имена обоих столбцов
и условия.
При исполнении:
Проверьте, все ли столбцы фильтра все еще действительны (возможно, запрос А изменился).
Если нет, удалите недействительные фильтры и / или сообщите B.
Выполнить запрос как что-то вроде:
select *
from ({query entered by A}) x
where x.Column1 op1 Value1
and x.Column2 op2 Value2
Если вы хотите корректно обрабатывать изменения схемы базы данных, вам нужно добавить некоторые дополнительные проверки, чтобы убедиться, что метаданные соответствуют тому, что запрос действительно возвращает.
Примечание безопасности
Ваша программа отправит запрос, написанный пользователем A, прямо в базу данных.
Крайне важно, чтобы вы делали это, используя подключение к базе данных с разрешениями, которые не превышают разрешения базы данных A.
В противном случае вы запрашиваете эксплойты на основе SQL-инъекций.
Следствие
Если пользователь A не имеет прямого доступа к базе данных из соображений безопасности, вы не можете использовать вышеуказанное решение.
В этом случае единственный способ сделать его безопасным - убедиться, что ваше приложение понимает 100% запроса, что означает его синтаксический анализ в вашей программе и разрешает только те операции, которые вы считаете безопасными.