Ich habe eine Ahnung, dass Ihr Problem entsteht nicht so sehr von der SQL, die Sie versuchen zu verwenden, aber die Art, wie Sie versuchen, es zu konstruieren, mit der völlig unnötigen und fehleranfällige SQL.Add().
Der folgende Code wird korrekt und ohne Beanstandung oder Fehler in D7 gegen 2 Tabellen in einer Sql Server 2014-Datenbank ausgeführt.
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;
Beachten Sie die Verwendung von einfachen Anführungszeichen, keine Anführungszeichen.
WICHTIG Constructing Sql direkt von den Inhalten TEdit Kontrollen macht die App haftet Sql Injection
(https://en.wikipedia.org/wiki/SQL_injection). Sie sollten stattdessen parametrisierte Sql verwenden. Allerdings scheint , dass die Routine in AdoDB.Pas, die die SQL analysiert, um die Parameter zu erstellen, TAdoCommand.ParseSql scheint in D7-Delphi Seattle gebrochen werden, weil es unfähig scheint, einen Parameter in einem "LIKE" eingebettet zu erkennen Konstrukt, das einen String-Ausdruck beinhaltet. Eine Möglichkeit wäre es, einen Stored Proc auf dem Server zu definieren, der das SQL mit Parametern ausführt, die zur Laufzeit von der Anwendung geliefert werden.
Also, meine Vermutung ist, dass, weil Sie SQL.Add() verwenden, tatsächlich Sie nicht die Sql konstruieren, die Sie denken, dass Sie sind. Ich vermute, dass der Fehler, den Sie erhalten, tatsächlich versucht, Ihnen zu sagen ist, dass Edit1.Text
mehrdeutig ist - abhängig von Ihrer genauen tatsächlichen SQL, möglicherweise der Sql-Parser denkt Edit1.Text ist der Name einer Spalte.
Die SQL-DDL für TableA und 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]
Änderung es sich um eine SELECT *, b * –
@RichBenner nicht funktioniert m8 – Troz
ich als Antwort nur geschrieben haben, werfen Sie einen Blick und sehen, wenn es es löst. –