AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi INSERT INTO SELECT ohne Spaltenliste
Thema durchsuchen
Ansicht
Themen-Optionen

INSERT INTO SELECT ohne Spaltenliste

Ein Thema von Alex.G · begonnen am 18. Okt 2011 · letzter Beitrag vom 24. Okt 2011
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 09:50
Du willst keinen Verbindugsserver aufbauen und hast die Zieltabellen schon?
Die Insert-SQL's aufzubauen mit Berücksichtigung aller Besonderheiten bzgl. Feldtypen, Codierung etc. wird Dich einige Zeit kosten, warum nicht die billige Variante


ExDataset = Select * from Quelle
Ads= Select * from Ziel
Delphi-Quellcode:


While (not ExDataset.EOF) do
      begin

      Ads.Append;
      for i:=0 to Ads.Fieldcount-1 do
          begin
          Ads.Fields[i].Assign(ExDataset.FieldByName(Ads.Fields[i].FieldName));
          end;
      ads.Post;
      ExDataset.Next;
      end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 10:35
... warum nicht die billige Variante
Weil es meine Aufgabe ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.505 Beiträge
 
Delphi 12 Athens
 
#3

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 10:38
Weil es meine Aufgabe ist
Aufgabe?

Hatte das schonmal wer hier erwähnt`?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 10:42
Weil es meine Aufgabe ist
Aufgabe?

Hatte das schonmal wer hier erwähnt`?
Bisher noch nicht.
Ich habe es nun mit:
InsertStr := InsertStr + IfThen(InsertStr <> '', ', ', '') + qryMasterExec.Parameters[i].Name; und
InsertStr := InsertStr + IfThen(InsertStr <> '', ', ', '') + qryMasterExec.Fields[i].Name; probiert. Wenn ich ein Breakpoint setze, sehe ich, dass InsertStr leider nach Ablauf der Schleife immer leer bleibt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#5

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 10:45
Was ist denn mit der Vorgehensweise nach #14 bis #19?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.505 Beiträge
 
Delphi 12 Athens
 
#6

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 10:48
Und qryMasterExec.Fields[i].FieldName ?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 11:14
Ich bin hierfür (mal eben herunter getippt)
Delphi-Quellcode:
procedure CopyADOData( SrcCon, TarCon : TADOConnection; const TableName : string );
var
  SrcData : TADOTable;
  TarData : TADOQuery;
  SqlStrFld : string;
  SqlStrPar : string;
  fld : TField;
begin
  SrcData := TADOTable.Create( nil );
  TarData := TADOQuery.Create( nil );
  try

    SrcData.Connection := SrcCon;
    SrcData.TableName := TableName;
    SrcData.FieldDefList.Update;

    TarData.Connection := TarCon;

    SqlStrFld := '';
    SqlStrPar := '';

    for fld in SrcData.Fields do
      begin
        if not( SqlStrFld = '' )
        then
          SqlStrFld := SqlStrFld + ', ';
        SqlStrFld := SqlStrFld + fld.FieldName;

        if not( SqlStrPar = '' )
        then
          SqlStrPar := SqlStrPar + ', ';
        SqlStrPar := SqlStrPar + ':' + fld.FieldName;
      end;

    TarData.SQL.Text := 'INSERT INTO ' + TableName + ' ( ' + SqlStrFld + ' ) VALUES ( ' + SqlStrPar + ' )';

    TarData.Prepared := True;
    try

      SrcData.Open;
      try

        while not SrcData.Eof do
        begin
          for fld in SrcData.FieldList do
          begin
            TarData.Parameters.ParamByName(fld.FieldName).Value := fld.Value;
          end;
          TarData.ExecSQL;
          SrcData.Next;
        end;

      finally
        SrcData.Close;
      end;

    finally
      TarData.Prepared := False;
    end;

  finally
    TarData.Free;
    SrcData.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alex.G

Registriert seit: 30. Aug 2011
31 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 11:15
Und qryMasterExec.Fields[i].FieldName ?
Das funktioniert!
Eine (hoffentlich) letzte Sache noch:
Delphi-Quellcode:
  qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]);
  while not qryMasterExec.Eof do begin
    qrySlaveExec.Insert;
Ist bei geschlossener Datenmenge nicht möglich. Ein qrySlaveExec.Open kann ich aber, soweit ich weiß, nur bei einem SELECT nutzen.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd
Online

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#9

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 11:34
Delphi-Quellcode:
  qrySlaveExec.SQL.Text := Format('INSERT INTO %s (%s) VALUES(%s)', [TableName, InsertStr, ValueStr]);
  while not qryMasterExec.Eof do begin
    qrySlaveExec.Insert;
Ist bei geschlossener Datenmenge nicht möglich.
  qrySlaveExec.ExecSQL;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: INSERT INTO SELECT ohne Spaltenliste

  Alt 21. Okt 2011, 11:15
zum fertigbasteln:
Delphi-Quellcode:

Function GetTableValueScript(Ads:TAdodataset;const tableName:String;HasIdentity:Boolean):String;
var

  FieldNames:TStringList;
  Values:TStringList;
  i:Integer;
  FieldNamesStr:String;
  Function Prepare(f:TField):String;
    begin
       if f.IsNull then Result := 'NULL'
       else
       Case
         f.DataType of
          ftSmallint, ftInteger, ftWord,ftAutoInc,ftLargeint,
          ftFloat, ftCurrency, ftBCD ,ftFMTBcd,ftLongWord, ftShortint, ftByte, ftExtended ,ftSingle: Result := Stringreplace(f.AsString, ',','.',[]) ;
          ftString,ftWideString,ftGuid : Result := QuotedStr(f.AsString);
          ftDate, ftDateTime, ftTime : Result := QuotedStr(FormatdateTime('yyyymmdd hh:nn:ss.zzz',f.AsDateTime));
          ftBoolean: Result := IntToStr(Integer(f.AsBoolean));
          // to be continued
       End;
    end;
  Function GetValues:String;
    begin
        Result := StringReplace(Values.Text,#13#10,', ',[rfReplaceAll]);
        Result := Copy(Result,1,Length(Result) - 2);
    end;
begin

  FieldNames:=TStringList.Create;
  Values:=TStringList.Create;
  try
  Ads.CommandText := 'Select top 100 * from ' + tablename;
  Ads.Open;
  for I := 0 to Ads.FieldCount -1 do FieldNames.Add('[' + Ads.Fields[i].FieldName + ']');
  FieldNamesStr := StringReplace(FieldNames.Text,#13#10,', ',[rfReplaceAll]);
  FieldNamesStr := Copy(FieldNamesStr,1,Length(FieldNamesStr) - 2);
  while not Ads.Eof do
    begin
      Values.Clear;
      for I := 0 to Ads.FieldCount -1 do Values.Add(Prepare(Ads.Fields[i]));
      Ads.Next;
      Result := Result + 'Insert Into ' + tablename + '(' + FieldNamesStr + ') VALUES (' + GetValues + ')'  + #13#10#13#10;
    end;
  finally
    FieldNames.Free;
    Values.Free;
  end;
  if HasIdentity then
    Result := 'Set Identity_Insert ' + tableName + ' ON' + #13#10
               + Result
               + 'Set Identity_Insert ' + tableName + ' OFF' + #13#10

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := GetTableValueScript(ADS,'[Adressen]',true);
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz