Was ist die Begrenzung der Länge einer SqlCommand-Abfrage?

7

Gibt es eine Einschränkung in der Länge einer Abfrage, die SQL Server verarbeiten kann?

Ich habe ein normales SqlCommand-Objekt und gebe eine sehr lange select-Anweisung als String weiter.

Die Abfrage scheint in Ordnung zu sein, wenn sie mit einer SQL Server 2005/2008-Engine ausgeführt wird, aber nicht mit einer SQL Server 2000-Engine ausgeführt wird.

Ich habe keine Fehlerdetails, da ich diese Informationen nur aus dritter Hand habe, aber meine Anwendung funktioniert nicht wie erwartet. Ich könnte die Probleme bei der Installation einer SQL Server 2000-Instanz beheben, aber ich habe mich nur gefragt, ob jemand eine schnelle Lösung hat. Ja, es gibt ein 4K- oder 8K-Limit in SQL Server 2000, aber nicht in 2005 type answer.

Ich bin mir bewusst, dass ich gespeicherte Prozeduren verwenden könnte, aber nehmen wir an, dass ich einen gültigen Grund habe, sie nicht zu verwenden: -)

    
Michael Prewecki 03.12.2008, 00:01
quelle

6 Antworten

6

SqlServer 2000 hat ein Abfrage-Limit von 4000 Zeichen für Ad-hoc-Abfragen.

Können Sie dies in eine gespeicherte Prozedur abstrahieren?

    
FlySwat 03.12.2008, 00:05
quelle
6

Hier ist ein Gedanke:

SQL Server 2000 VARCHAR erlaubt bis zu 8000 Zeichen, so könnte dies funktionieren:

PSeudoCode:

%Vor%     
FlySwat 03.12.2008 00:29
quelle
6

muss für dynamische Abfragen gelesen werden ... Der Fluch und Segen des dynamischen SQL , ich empfehle Ihnen, es zu lesen . Könnte dir dieses Mal nicht helfen, aber es wird dir definitiv in der Zukunft helfen.

Ein Zitat aus dem Artikel, nur für den Fall.

  

sp_executesql und lange SQL-Zeichenfolgen in SQL 2000

     

Es gibt eine Einschränkung mit sp_executesql in SQL 2000 und SQL 7, da Sie keine längeren SQL-Strings als 4000 Zeichen verwenden können. (In SQL 2005 und höheren Versionen sollten Sie nvarchar (MAX) verwenden, um dieses Problem zu vermeiden.) Wenn Sie sp_executesql verwenden möchten, wenn die Abfragezeichenfolge diese Grenze überschreitet, um parametrisierte Abfragepläne zu verwenden, gibt es eine Problemumgehung. Sie können sp_executesql in EXEC ():

einschließen      

DECLARE @ sql1 nvarchar (4000),           @ sql2 nvarchar (4000),           @state char (2)   SELECT @status = 'CA'   SELECT @ sql1 = N'SELECT COUNT (*) '   SELECT @ sql2 = N'FROM dbo.authors WHERE state = @status '   EXEC ('EXEC sp_executesql N' '' + @ sql1 + @ sql2 + '' ',                            N '' @ state char (2) '',                            @state = '' '+ @state +' '' ')

     

Das funktioniert, weil der @ stmt-Parameter für sp_executesql ntext ist, also an sich keine Größenbeschränkung hat.

     

Sie können Ausgabeparameter sogar mit INSERT-EXEC verwenden, wie in diesem Beispiel:

     

CREATE TABLE # Ergebnis (cnt int NOT NULL)   DECLARE @ sql1 nvarchar (4000),           @ sql2 nvarchar (4000),           @state char (2),           @mycnt int   SELECT @status = 'CA'   SELECT @ sql1 = N'SELECT @cnt = COUNT (*) '   SELECT @ sql2 = N'FROM dbo.authors WHERE state = @status '   INSERT # Ergebnis (cnt)      EXEC ('DECLARE @ cnt int            EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '',                               N '' @ Zustand char (2),                                  @cnt int OUTPUT '',                               @state = '' '+ @state +' '',                               @cnt = @cnt AUSGABE            WÄHLEN @cnt ')   SELECT @mycnt = cnt FROM # Ergebnis

     

Sie haben mein Verständnis, wenn Sie denken, dass dies zu unordentlich ist, um es wert zu sein.

    
Alan FL 03.12.2008 00:52
quelle
2

Ich habe ein Limit von 2k für Abfragen erreicht, die gegen ein AS / 400 laufen. Ich habe es normalerweise geschafft, unter die 2k-Grenze zu kommen, indem ich alle Leerzeichen löschte - es macht die Abfrage unlesbar, aber es ist der einfachste Weg, um unter das Limit zu kommen.

    
Booji Boy 03.12.2008 01:24
quelle
2

In meiner eigenen Erfahrung fand ich heraus, dass das, was zuerst ein SQLServer2000-Limit für die Länge der Abfragen zu sein schien, tatsächlich (glaube es oder nicht) nicht wirklich ein Limit für die Länge einer Abfrage ist, sondern ein Limit auf die Länge einer gegebenen LINE in der Abfrage.
Es war vor ungefähr einem Jahr, als ich darauf stieß, also weiß ich nicht mehr, wie hoch die Zeilenlänge war, aber Sie könnten versuchen, die riesige Anfrage in Zeilen mit einer maximalen Zeilenlänge von 64K oder darüber aufzuteilen Schau wie es läuft. Meine Erinnerung ist, dass das Zeilenlängenlimit 64K betragen könnte, ob Sie es glauben oder nicht. Ich hatte diese wahnsinnig lange Abfrage (wurde von einem sql-Generator-Programm generiert), die Abfrage war etwa 80K lang, und ich habe es in Notepad halbiert (dh, ich legte einen Zeilenvorschub in den SQL-Code etwa in der Mitte --- aber ich habe darauf geachtet, keine Wörter aufzuteilen, und fügte dann das Ganze in das Query Analyzer Befehlsfenster ein. Dann funktionierte es, mit dem Zeilenvorschub irgendwo in der Mitte, wodurch jede der beiden Zeilen weniger als 64K lang war. Ich hoffe das hilft. Wenn nicht, versuchen Sie kleinere Leitungslängen. Ich bin mir sicher, dass die gesamte Abfrage funktioniert hat, wenn ich meine Abfrage an den Punkt gebracht habe, an dem keine Zeile darin eine bestimmte Länge überschritten hat.

    
ralph croce 16.12.2008 20:03
quelle
-2

Tun Sie dies nicht wegen der SQL-Injektionen. Verzichte darauf, wenn der dynamische SQL der App vom Benutzer überhaupt manipuliert werden kann.

auch - betrachten SPs, da es einfacher zu pflegen ist und es auch mit SQL-Injektion hilft.

    
IEnumerator 03.12.2008 00:39
quelle