"Where 매개 변수를 하드 코딩하면 TADOQuery가 생성되지만 TADO 매개 변수를 사용하면 다음 쿼리에 대해 알 수 없습니다. 임시 테이블.TADOQuery 임시 테이블 쿼리에 매개 변수가있는 경우 손실된다
내가 잘못 뭐하는 거지?
내가이 예를 단순화 할 수 싶지만 여기있다. (SQL 서버)
CREATE TABLE brFTNode_Children (
pID integer NOT NULL,
cID integer NOT NULL,
primary key (pID, cID)
);
insert into brFTNode_Children values(1,2);
insert into brFTNode_Children values(1,3);
insert into brFTNode_Children values(3,4);
insert into brFTNode_Children values(3,5);
insert into brFTNode_Children values(6,4);
insert into brFTNode_Children values(6,7);
코드 (작동하지 않습니다)
procedure Foo(fDBCon : TADOConnection);
const
CreateTempTable =
'WITH FT_CTE AS(' +
'SELECT pID, cID FROM brFTNode_Children ' +
'WHERE pID = :TOPID ' +
'UNION ALL ' +
' SELECT e.pID, e.cID FROM brFTNode_Children e ' +
' INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)) ' +
'SELECT * INTO #ParentChild FROM FT_CTE; ';
GetSQL =
'SELECT pID, cID FROM #ParentChild ORDER BY pID; ';
var
q1 : TADOQuery;
q2 : TADOQuery;
begin
q1 := TADOQuery.Create(nil);
q1.Connection := fDBCon;
q1.SQL.Text := CreateTempTable;
q1.ParamCheck := True;
q1.Parameters.ParamByName('TOPID').DataType := ftInteger;
q1.Parameters.ParamByName('TOPID').Value := 1;
q1.ExecSQL;
q2 := TADOQuery.Create(nil);
q2.Connection := fDBCon;
q2.SQL.Text := GetSQL;
q2.Active := true; //Fails here does not know table #ParentChild
end;
코드 - 그것의 자신의 세션을 가진 매개 변수가있는 쿼리가 exec sp_executesql
를 사용하는 SQL 쿼리
function TGenerateSolveFile.GetBinaryStream( topID : Cardinal;
var bFile: TMemoryStream): Boolean;
const
CreateTempTable =
'WITH FT_CTE AS(' +
'SELECT pID, cID FROM brFTNode_Children ' +
'WHERE pID = 1 ' + //Changed To a constant
'UNION ALL ' +
' SELECT e.pID, e.cID FROM brFTNode_Children e ' +
' INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)) ' +
'SELECT * INTO #ParentChild FROM FT_CTE; ';
GetSQL =
'SELECT pID, cID FROM #ParentChild ORDER BY pID; ';
var
q1 : TADOQuery;
q2 : TADOQuery;
begin
q1 := TADOQuery.Create(nil);
q1.Connection := fDBCon;
q1.SQL.Text := CreateTempTable;
// q1.ParamCheck := True;
// q1.Parameters.ParamByName('TOPID').DataType := ftInteger;
// q1.Parameters.ParamByName('TOPID').Value := 1;
q1.ExecSQL;
q2 := TADOQuery.Create(nil);
q2.Connection := fDBCon;
q2.SQL.Text := GetSQL;
q2.Active := true;
end;
왜 2 개의 쿼리를 실행해야합니까? 당신은 단순히'q2.SQL.Text : = CreateTempTable + GetSQL; '을 시도해 보았습니다. 어떤 경우이든 하나의 SP를 만들 것입니다. 매개 변수를 전달하고 레코드 세트를 다시 가져옵니다. – kobik