Я выполняю запрос, чтобы найти строки, содержащие символ «&». и используя dbgrid, чтобы показать результат.
Я пытался написать запрос, как он работает в SQL Server или MYSQL.
FDQuery1.SQL.Text := 'SELECT * FROM DATA WHERE NAME LIKE ''%&%''';
FDQuery1.Open();
Вместо получения результата, содержащего символ «&» в столбце NAME, он выбирает все строки, в которых столбец NAME не пуст.
Другие запросы работают, когда я нахожу «$» вместо «&» — вот так:
FDQuery1.SQL.Text := 'SELECT * FROM DATA WHERE NAME LIKE ''%$%''';
Этот запрос выбирает строки, содержащие символ $.
Когда я использую это условие, выбираются только все ненулевые строки: %&%.
@KenWhite FireDAC по умолчанию не передает запрос беспрепятственно, если он содержит какие-либо специальные символы, которые он использует для поддержки возможности предварительной обработки запроса/макросов. Ссылка: Специальная обработка символов
@Brian: Это не меняет того факта, что Delphi не выполняет запрос. Это делает СУБД, а не язык разработки, и знание того, какая СУБД используется, все равно необходимо.


FireDAC имеет возможность предварительной обработки запросов/макросов, позволяющую дополнительный уровень модификации запросов. В некоторых функциях используется символ &, который означает, что необходимо соблюдать особую осторожность при написании запросов или отключении макросов. Его можно отключить на уровне соединения или запроса.
FDConnection1.ResourceOptions.MacroExpand := false;
FDQuery1.ResourceOptions.MacroExpand := false;
Переменные замены
Символ «&», за которым следует имя макропеременной. Например:
SELECT * FROM &TabNameСимволы имеют следующее значение:
‘!’--режим подстановки «строка». Значение макроса будет подставлено «как есть», непосредственно в текст команды без каких-либо преобразований.
‘&’-– режим подстановки «SQL». Значение макроса будет подставлено в зависимости от типа данных макроса, используя правила синтаксиса целевой СУБД. К используйте макросы, используйте следующий фрагмент кода:
FDQuery1.SQL.Text := 'SELECT * FROM &TabName'; FDQuery1.MacroByName('TabName').AsRaw := 'Orders'; FDQuery1.Open;Макросы обрабатываются, когда ResourceOptions.MacroCreate и MacroExpand установлены в True.
Delphi не является ядром базы данных и не выполняет ваши запросы. FireDAC передает ваш запрос в используемую вами СУБД, и этот механизм базы данных выполняет запрос. Вам необходимо добавить тег для ядра базы данных, которое вы используете (Access, MySQL, SQL Server и т. д.), поскольку именно на нем выполняется SQL.