![]() |
Datenbank: MSSQL • Version: 12 • Zugriff über: ADO
max. Länge einer SQL Anweisung?
unser SQL String kann schon mal etwas länger werden, so 20.000 ---- 30.000 Zeichen
select * from ..... where aField in ('wert1', .......'wert20.000'); Bei Kürzeren SQL Strings sehen wir kein Problem , bei längeren kommt nix von der DB Zurück Ist die Länge eines SQL Strings begrenzt? |
AW: max. Länge einer SQL Anweisung?
Diese Seite kennst du schon ?
![]() |
AW: max. Länge einer SQL Anweisung?
die größte SQL Anweisung die ich getestet habe ist ca 14 KB groß.
Andere Möglichkeit lagere das in eine View aus :wink: |
AW: max. Länge einer SQL Anweisung?
Und ihr seid mit eurem SQL-Renderer, also dem Teil, der dieses Monstrum baut, zufrieden? Was sind das für Werte? Kann man die Liste nicht durch ein 'select' darstellen? Oder über Gruppen kategorisieren?
|
AW: max. Länge einer SQL Anweisung?
Zitat:
Ein guter Profiler darf später gerne Optimierungsratschläge geben aber jedwedes QueryBuilder und AutogeneratorGedöns lass ich da nicht dran. Erst recht nicht wenn es komplexer wird. So etwas wie
Code:
löst man wenn möglich nur auf einer Seite. Entweder in der DB (per sub select) oder in der Applikation (per LocateEx, Filter & Co.).
...where aField in ('wert1', .......'wert20.000');
Aus der DB abfragen, dann die Rückgabe in der Applikation "zusammenklicken", um die "zusammengeklickten Werte" wieder als Parameter an die nächste DB Anfrage zu schicken ist oft langsam und ineffektiv. |
AW: max. Länge einer SQL Anweisung?
Na ja. Eine IN-Liste bestehend aus 20.000 Werten hat jetzt nicht direkt etwas mit stark normalisierten Datenbanken zu tun. 50 JOINS schon, aber darum gehts ja hier nicht.
|
AW: max. Länge einer SQL Anweisung?
Zitat:
Ebenso stolper ADO über soche Ungetüme:
Code:
Da ist glaube ich bei 125 Zeichen Schluß.
Select wert1
,'Konstanter Text'||wert2||' und noch mehr Text '||wert3||' und jetzt noch mehr Text bis das es mal so richtig knirscht bei'||wert4||' ; ' ,wert9 .... Gruß K-H |
AW: max. Länge einer SQL Anweisung?
Bei MySQL ist die Anzahl der Elemente in einer "in"-Liste ebenfalls beschränkt. Bin zu faul den genauen Wert zu suchen, der ist hier aber ja nicht wichtig. Was ich damit andeuten will ist, dass es scheinbar bei vielen DBMS dort eine Grenze gibt, und möglicherweise diese ist, die das Problem macht.
|
AW: max. Länge einer SQL Anweisung?
Ja, natürlich ist das so. Normale Skripte sind ja auch nicht so groß.
|
AW: max. Länge einer SQL Anweisung?
Was ich sagen wollte ist: Unabhängig von der maximalen Länge eines Statements in Zeichen, kann die Anzahl der möglichen Elemente in "Stückzahl" in einer "in"-Klausel zusätzlich begrenzt sein. Einfach nur, damit der TE ggf. auch danach als Ursache für sein Problem suchen kann - mangels Erfahung mit seinem DBMS kann ich keine konkreteren Zahlen nennen.
|
AW: max. Länge einer SQL Anweisung?
Bei einer ähnlichen Problematik hat die Query so lange gebraucht, dass der Timeout zugeschlagen hat (auch MSSql).
Nachdem das über eine temporäre Tabelle läuft, ist es etliches schneller. Es handelt sich dabei um getestete 60.000 Ids. Subquery ging nicht, da es sich um die manuell getätigte Auswahl des Benutzers handelt. |
AW: max. Länge einer SQL Anweisung?
Zitat:
Ich weiß schon: Anzeige von 60.000 Möglichkeiten und ein Button 'Alles auswählen', oder? |
AW: max. Länge einer SQL Anweisung?
Zitat:
Gruß K-H |
AW: max. Länge einer SQL Anweisung?
"Zusammengeklickt und lässt sich nicht durch Subquery oder ><=... zu erschlagen" ist immer relativ.
Delphi-Quellcode:
Über eine em SQL Server angelegte Stored Procedure kann man das Ganze noch weiter tunen ...
Pseudocode Delphi:
var selectedIDs:TList<derIdTyp> := TList<derIdTyp>.create; for i:=0 to LangeAuswahlliste.items.count -1 do begin if LangeAuswahlliste[i].checked then selectedIDs.add(LangeAuswahlliste[i].id); end; // SQL für InnerSelect TEMP Table SQL_AufbereitungInnerSelect := ''; for id in selectedIDs do begin SQL_AufbereitungInnerSelect := SQL_AufbereitungInnerSelect + 'Insert into #SelectedIDs (ID) Values('''+id.ToString+''')' +#13#10; end; // SQL Datenabruf SQL_Datenabruf := 'BeginTransaction; ' +#13#10+ SQL_AufbereitungInnerSelect + 'SELECT * FROM Tabelle T WHERE T.ID IN (SELECT ID FROM #SelectedIDs)'; +#13#10+ 'EndTransaction; ' +#13#10+ |
AW: max. Länge einer SQL Anweisung?
Zitat:
Steht ja alles da, ohne Sarkasmus, ohne Witz. Da es eigentlich nicht sein kann, das irgendwer 60.000 Checkboxen anklickt, habe ich ja wohl eine Möglichkeit aufgezeigt, wie so etwas entstehen kann. Und deine 200-300 Checkboxen, die "wohlgemerkt nicht durch subquery oder ><=... zu erschlagen" sind, würde ich -zumindest wenn ich die Möglichkeit hätte- komplett in die Tonne treten. Und da wäre ich nicht der Einzige. Es mag -wie immer (und bitte gehe nicht schon wieder mit irgendwelchen Sonderfällen darauf ein)- Ausnahmen geben, aber in der Regel wird man diese 200-300 Checkboxen nicht jedesmal komplett neu gewürfelt individuell anklicken (wer hat den die Zeit dazu?), sondern eher in 'Templates', 'Gruppen' o.ä. zusammenfassen. Ich warte übrigens immer noch auf ein konkretes Beispiel, wo das nicht so ist, denn ich lerne immer wieder gerne dazu. So, nun bist Du wieder dran. Gähn. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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 by Thomas Breitkreuz