У меня есть догадка, что ваша проблема возникает не столько из Sql, которую вы пытаетесь использовать, а в том, как вы пытаетесь ее построить, используя совершенно ненужный и подверженный ошибкам SQL.Add().
Приведенный ниже код выполняется правильно и без каких-либо претензий или ошибок в D7 против 2 таблиц в базе данных Sql Server 2014.
procedure TForm1.FormCreate(Sender: TObject);
var
S : String;
begin
// WARNING: Do not use this Sql in a live application
// There is a risk of Sql-Injection because the Sql includes the
// contents of Edit1.Text. Use a parameterised query instead!
S := 'select a.*, b.*'#13#10;
S := S + 'from TableA a join TableB b'#13#10; // the #13#10 can be replaced by a single space,
// if you prefer
S := S + 'on a.fileref = b.fileref'#13#10;
S := S + 'where (a.accno like ''%' + Edit1.Text + '%'')'#13#10;
S := S + 'or (b.accno like ''%' + Edit1.Text + '%'')'#13#10;
AdoQuery1.SQL.Text := S;
AdoQuery1.Open;
end;
Обратите внимание на использование одиночных кавычек по всему миру, без двойных кавычек.
ВАЖНО Построив Sql непосредственно из содержания управления TEdit делает ваше приложение отвечает на Sql Injection
(https://en.wikipedia.org/wiki/SQL_injection). Вместо этого вы должны использовать параметризованный Sql. Тем не менее, сказал, что подпрограмма в AdoDB.Pas, которая анализирует Sql для создания параметров, TAdoCommand.ParseSql кажется, который должен быть разбит в D7-Delphi Seattle, потому что он не может распознать параметр, встроенный в `LIKE ' который включает строковое выражение. Путь к этому может заключаться в том, чтобы определить Хранимый Proc на сервере, который выполняет SQL с параметрами, предоставленными во время выполнения из приложения.
Итак, я предполагаю, что, поскольку вы используете SQL.Add(), на самом деле вы не строите Sql, о котором вы думаете. Я подозреваю, что ошибка, которую вы получаете, на самом деле пытается сказать вам, заключается в том, что Edit1.Text
неоднозначен - в зависимости от вашего точного экземпляра Sql, возможно, Sql-парсер считает, что Edit1.Text - это имя столбца.
СКП DDL для TableA и TableB:..
CREATE TABLE [dbo].[TableA](
[ID] [int] NOT NULL,
[FileRef] [int] NULL,
[AccNo] [varchar](32) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TableB](
[ID] [int] NOT NULL,
[FileRef] [int] NULL,
[AccNo] [varchar](32) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
изменить его для выбора *, б * –
@RichBenner не работает m8 – Troz
Я только что отправил в ответ, посмотреть и увидеть если он решает его. –