請教SQL語法中該如何動態指定資料表名稱 |
答題得分者是:william
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
I don't think so.... however using StringReplace may work for you < class="code">{....}
Query1.SQL.Text := 'select * from [TableName];'
{...}
var
OldSQL: string;
{...}
OldSQL := Query1.SQL.Text;
try
Query1.SQL.Text := StringReplace(Query1.SQL.Text,'[TableName]','Table1',[rfReplaceAll, rfIgnoreCase]);
{....}
finally
Query1.SQL.Text := OldSQL;
end;
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
感謝Willim版主大大的回應﹒ 版主可能誤會小弟的意思了﹒
比如說如下範例﹕
Var IDRemark : String; begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From TableName Where '); ADOQuery1.SQL.Add('ID=''' IDRemark ''''); //以上紅色處也可寫成如下藍色處寫法代替 ADOQuery1.SQL.Add('ID=:ID'); ADOQuery1.Parameters.ParamByName('ID').Value := IDRemark; ADOQuery1.Open; end;如上範例﹐可以在SQL中使用組字串的方法﹐或者是ParamByName的方法﹐來指定值給SQL做為Select的判斷﹐那現在小弟是需要針對TableName欄位﹐是否也有類同的方法可以使用組字串或ParamByName的方法來指定資料表名稱給SQL嗎﹖ 謝謝﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
感謝William版主大大﹒ 小弟目前需要使用SQL并不是簡單的Select語法﹐而是要取出某個資料表中的幾個欄位﹐然后再寫進(Append)另外一個資料表中(使用ExecSQL方法)﹐如果用StringReplace方法﹐是否可做到個需要﹒小弟的部分程式碼如下﹕
procedure TForm6.ComboBoxSelectMonthChange(Sender: TObject); begin if ComboBoxSelectMonth.ItemIndex <> -1 then begin BitBtn1.Enabled := True; Case ComboBoxSelectMonth.ItemIndex of 0 : begin TableName := 'Salary_Jan'; TableNameFirst := 'Salary_Jan_First'; TableNameSecond := 'Salary_Jan_Second'; end; 1 : begin TableName := 'Salary_Feb'; TableNameFirst := 'Salary_Feb_First'; TableNameSecond := 'Salary_Feb_Second'; end; 2 : begin TableName := 'Salary_Mar'; TableNameFirst := 'Salary_Mar_First'; TableNameSecond := 'Salary_Mar_Second'; end; 3 : begin TableName := 'Salary_Apr'; TableNameFirst := 'Salary_Apr_First'; TableNameSecond := 'Salary_Apr_Second'; end; 4 : begin TableName := 'Salary_May'; TableNameFirst := 'Salary_May_First'; TableNameSecond := 'Salary_May_Second'; end; 5 : begin TableName := 'Salary_Jun'; TableNameFirst := 'Salary_Jun_First'; TableNameSecond := 'Salary_Jun_Second'; end; 6 : begin TableName := 'Salary_Jul'; TableNameFirst := 'Salary_Jul_First'; TableNameSecond := 'Salary_Jul_Second'; end; 7 : begin TableName := 'Salary_Aug'; TableNameFirst := 'Salary_Aug_First'; TableNameSecond := 'Salary_Aug_Second'; end; 8 : begin TableName := 'Salary_Sep'; TableNameFirst := 'Salary_Sep_First'; TableNameSecond := 'Salary_Sep_Second'; end; 9 : begin TableName := 'Salary_Oct'; TableNameFirst := 'Salary_Oct_First'; TableNameSecond := 'Salary_Oct_Second'; end; 10: begin TableName := 'Salary_Nov'; TableNameFirst := 'Salary_Nov_First'; TableNameSecond := 'Salary_Nov_Second'; end; 11: begin TableName := 'Salary_Dec'; TableNameFirst := 'Salary_Dec_First'; TableNameSecond := 'Salary_Dec_Second'; end; end; ADOTable1.Close; ADOTable1.TableName := TableName; ADOTable1.Open; if not ADOTable1.IsEmpty then begin BitBtn1.Caption := 'Enter'; end else begin BitBtn1.Caption := 'Import'; end; end else begin BitBtn1.Enabled := False; end; end;//利用ComboBox元件來提供使用者選取月份的動作﹐選取完成后﹐會使用ADOTable元件根据使用者選取的內容進行判斷此資料表是否為空的﹐若是空表﹐則將BitBtn1的Caption設為Import﹐若不是剛將BitBrn1的Caption設為Enter﹒小弟就是需要在Import按鈕按下時利用ADOQuery的SQL語法來擷取另一資料表中的資料錄﹐再寫入目前使用者選取的資料表中﹐StringReplace方法可以做到嗎﹖能否勞煩提供語法範例﹗ 謝謝﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
Build the SQL statement? I used StringReplace because parameters won't work on TableName/FieldName and I would like to edit the SQL statement in the IDE.....e.g. In the IDE, SQL statement of ADOQuery1 may be 'insert into [Table1] select Field1, Field2 from [Table2] where Field1=:Value1' In the code:
OldSQL := ADOQuery1.SQL.Text; // save the sql try ADOQuery1.1SQL.Text := StringReplace(ADOQuery.SQL.Text,[Table1],'MyTarget',[rfReplaceAll, rfIgnoreCase]); ADOQuery1.SQL.Text := StringReplace(ADOQuery.SQL.Text,[Table2],'MySource',[rfReplaceAll, rfIgnoreCase]); ADOQuery1.Parameters.ParamByName('Value1').Value := 1234; ADOQuery1.Exec; finally ADOQuery1.SQL.Text := OldSQL; // restore the original sql end; |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
感謝William版主﹗
問題得以解決﹐感激不盡﹗在以上的範例中﹐在增加如下程式碼即可﹕
< class="code">procedure TForm6.BitBtn1Click(Sender: TObject);
begin
OldSQL := ADOQuery1.SQL.Text;
if BitBtn1.Caption = 'Import' then
begin
Try
ADOQuery1.Close;
ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, 'TableName1', TableName, [rfReplaceAll, rfIgnoreCase]);
ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, 'TableName2', 'Employee', [rfReplaceAll, rfIgnoreCase]);
ADOQuery1.ExecSQL; ADOQuery1.Close;
ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, TableName, TableNameFirst, [rfReplaceAll, rfIgnoreCase]);
ADOQuery1.ExecSQL; ADOQuery1.Close;
ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, TableNameFirst, TableNameSecond, [rfReplaceAll, rfIgnoreCase]);
ADOQuery1.ExecSQL;
Finally
ADOQuery1.SQL.Text := OldSQL;
end;
end;
Form7.Show;
end; =====================
努力,相信會獲得美麗!
忻晟
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |