429 „Die Anfrage bindet zu viele Einzelwerte.“
Eine Leseanfrage mit einer langen Bedingung wird mit 429 abgewiesen, bevor sie die Datenbank erreicht.
Umgebung
Bedingungen mit vielen Werten, etwa IN (…) aus Access über den Treiber oder lange Oder-Ketten.
Ursache
SQL Server nimmt in einer parametrisierten Anweisung höchstens 2 100 Parameter an (Microsoft:
Maximum capacity specifications for SQL Server,
„Parameters per stored procedure“); zwei davon belegt sp_executesql, über das der Dienst jede
Anweisung schickt. Für die Werte des Aufrufers bleiben 2 098. Der Dienst zählt vorher und weist ab, statt die Bedingung
zu kürzen. Die Antwort ist 429 (Grenze überschritten) wie bei den übrigen Mengengrenzen des Dienstes,
nicht 400: Die Anfrage ist gültig, sie übersteigt nur, was eine Anweisung tragen kann. Mehr als 100 Gleichheiten auf
derselben Spalte in einem or fasst der Dienst zu einem einzigen Parameter zusammen; alles andere –
viele verschiedene Spalten, Vergleiche mit gt oder lt, Textsuche, kurze Ketten auf vielen Spalten –
zählt Wert für Wert.
Behebung
- Formulieren Sie die Bedingung als Liste von Werten einer Spalte (
Nummer eq 1 or Nummer eq 2 …bzw.IN (…)); dann begrenzt nur noch der Rumpf der Anfrage (MaxBodyBytes, Vorgabe 1 MB, als Richtwert rund 36 000 kurze Zahlenwerte). - Teilen Sie eine Bedingung über viele verschiedene Spalten auf mehrere Anfragen auf.
- Schicken Sie lange Bedingungen im Rumpf (
POST …/$query); der Treiber tut das von selbst.
Prüfung
Die Anfrage antwortet 200 mit derselben Zeilenzahl wie dieselbe Bedingung in der Datenbank.