7

¿Hay una limitación en la longitud de una consulta que SQL Server puede manejar?Cuál es la limitación en la longitud de una consulta SqlCommand

Tengo un objeto SqlCommand normal y paso una instrucción de selección muy larga como una cadena.

La consulta parece estar bien cuando se ejecuta en un motor SQL Server 2005/2008 pero no se ejecuta en un motor SQL Server 2000.

No tengo ningún error, ya que solo tengo esta información de tercera mano, pero mi aplicación no funciona como se esperaba. Podría tomar la molestia de instalar una instancia de SQL Server 2000, pero me preguntaba si alguien tiene una versión rápida. Sí, hay un límite de 4K u 8K en SQL Server 2000 pero no en la respuesta de tipo 2005.

Soy consciente de que podía utilizar procedimientos almacenados, pero supongamos que tengo una razón válida para no usarlos :-)

Respuesta

6

SqlServer 2000 tiene un límite de consulta 4000 caracteres para consultas ad hoc.

¿Puede abstraer esto en un procedimiento almacenado?

+0

Eso es lo que temía. Sí, puedo, el problema es que no tengo administración de la base de datos, lo que significa que no puedo controlar la adición de sprocs, etc. –

+0

que debe ser una gran pregunta ... – JoshBerke

+0

Ciertamente, tengo que hacer algunas manipulaciones de columnas serias ... así que realizar dinámicamente las operaciones IZQUIERDA, DERECHA, REEMPLAZAR en múltiples columnas. –

6

Aquí es un pensamiento:

SQL Server VARCHAR de 2000 permite un máximo de 8000 caracteres, así que esto podría funcionar:

pseudocódigo:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD"); 
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR); 
+0

Esa es una gran idea y algo que usaré si no puedo obtener la consulta bajo 4K –

-2

No hacer esto a causa de las inyecciones SQL. Abandónalo si el usuario puede manipular el sql dinámico de la aplicación.

también - considere SP porque es más fácil de mantener y también ayuda con la inyección sql.

+0

Como dije, no tengo control sobre la base de datos. Pero sí, soy consciente del potencial de las inyecciones de SQL. Como el SQL Server está muy bloqueado y la aplicación está en una red cerrada, no es una consideración importante en este momento. –

+0

Oh y yo desinfectamos la entrada del usuario, pero nunca puedes estar seguro ahora puedes. –

+1

Estoy lurkin ... heh dynamic sql es bueno si parametriza sus consultas ... (especialmente si los parámetros provienen de la entrada del usuario) – JoshBerke

6

a debe leer para las consultas dinámicas ... The Curse and Blessings of Dynamic SQL, le recomiendo que lo lea. Puede que no lo ayude esta vez, pero definitivamente lo ayudará en el futuro.

Una cita del artículo, por si acaso.

sp_executesql y largas cadenas SQL en SQL 2000

hay una limitación con sp_executesql en SQL 2000 y SQL 7, ya que no puede utilizar cadenas ya SQL de 4000 caracteres. (En SQL 2005 y posterior, debe usar nvarchar (MAX) para evitar este problema). Si desea usar sp_executesql cuando su cadena de consulta excede este límite para hacer uso de planes de consulta con parámetros, en realidad hay una solución. A saber, se puede envolver en sp_executesql EXEC():

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

Esto funciona, porque el parámetro @stmt para sp_executesql es ntext, por lo que solo lo hace no tiene ninguna limitación de tamaño.

incluso Puede utilizar parámetros de salida mediante el uso de INSERT-EXEC, como en este ejemplo:

CREAR TABLA #result (CNT int NOT NULL) DECLARE @ SQL1 nvarchar (4000), @ nvarchar sql2 (4000), carbón @state (2), @mycnt int SELECCIONAR = @state 'CA' SELECT @ SQL1 = N'SELECT @cnt = COUNT (*)' SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state ' INSERT #result (cnt) EXEC (' DECLARAR @cnt int EXEC sp_executesql N '' '+ @ sql1 + @ sql2 +' '', N '' Char estado @ (2), @cnt int OUTPUT '', @state = '' '+ @state + ''', @cnt = @cnt OUTPUT @cnt SELECT ') SELECT @ mycnt = cnt FROM # resultado

Tienes entendido que si crees que esto es demasiado complicado como para valer la pena.

+0

parece algo bueno, ¡gracias! –

2

He encontrado un límite de 2k para consultas ejecutadas en un AS/400. Por lo general, logré superar el límite de 2k eliminando todos los espacios en blanco, lo que hace que la consulta sea ilegible, pero es la forma más sencilla de superar el límite.

2

En mi propia experiencia, encontré que, lo que primero parecía ser un límite SQLServer2000 en la longitud de las consultas, en realidad (lo creas o no) no es realmente un límite en la longitud de una consulta, pero es un límite en la longitud de cualquier LÍNEA dada en la consulta.
Fue hace aproximadamente un año cuando me encontré con esto, así que de todas formas no recuerdo cuál era la longitud de la línea, pero podrías intentar dividir la gran consulta en líneas de una longitud de línea máxima de 64K o más o menos , y mira cómo va. Mi recuerdo es que el límite de la longitud de la línea podría haber sido de 64 K, créalo o no. Había tomado esta consulta insanamente larga (fue generada por un programa sql-generator), la consulta tenía aproximadamente 80K de longitud, y la dividí por la mitad en el Bloc de notas (es decir, coloqué un salto de línea en el código SQL aproximadamente a la mitad --- pero me aseguré de no dividir ninguna palabra), y luego pegué todo en la ventana de comandos del Analizador de consultas. Luego funcionó, con el avance de línea en algún lugar en el medio, lo que provocó que cada una de las 2 líneas tuviera menos de 64 K de longitud. Espero que esto ayude. De lo contrario, pruebe longitudes de línea más pequeñas. Estoy seguro de que cuando recibí mi consulta hasta el punto en que ninguna línea dentro de ella excedía una determinada longitud, la consulta general funcionó.

Cuestiones relacionadas