線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1318
推到 Plurk!
推到 Facebook!

請教SQL語法中該如何動態指定資料表名稱

答題得分者是:william
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-15 11:57:42 IP:63.84.xxx.xxx 未訂閱
請教各位前輩﹒    該如何可以在SQL語法中做到使用字串變數來取代資料表名稱呢﹖因為資料表是由使用者選擇的﹐那SQL是否可以做到如Parameters之方法或者直接在SQL語中使用組字串的方法來指定資料表名稱﹖    謝謝﹗    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-15 12:08:47 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-15 12:52:33 IP:63.84.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-15 13:43:08 IP:147.8.xxx.xxx 未訂閱
Parameter cannot be used on tables 
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-15 14:10:34 IP:63.84.xxx.xxx 未訂閱
感謝William版主大大﹒    那有沒有其它比較類似的方法可處理如小弟問題中所提及的需求呢﹖    謝謝﹗    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-15 14:14:58 IP:147.8.xxx.xxx 未訂閱
StringReplace.....
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-15 14:36:16 IP:63.84.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-15 15:22:46 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-15 16:14:21 IP:63.84.xxx.xxx 未訂閱
感謝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; ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
系統時間:2024-11-23 5:33:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!