sp_executesql y cadena demasiado larga

13/11/2006 - 09:35 por Eva | Informe spam
Hola a Todos

Le estoy dando vueltas a un problemilla que tengo, y cada solución que
intento me doy de narices. Os cuento:

Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7. Para uno
de los reportes que ofrece la aplicación, tengo una selección de registros
complicadilla, más que nada por la cantidad de tablas que entran en juego y
por la sentencia where que tengo que aplicar, muuuuy variable y que monto
por código.

Hasta ahora lo he solucionado con una vista que me relaciona todas las
tablas, y en un procedimiento almacenado monto una cadena con esta vista (y
alguna fruslería que le hago) y un filtro que pasa como parámetro y forma el
where. Lo ejecuto mediante sp_executesql y le paso los parámetros que hacen
falta.

Todo correcto pero, muy lento :(

Siguiente intento: dividir mi where e irlo aplicando tan pronto (dentro de
mis joins) como pueda para ir restringiendo desde el principio el número de
registros. No problem, puedo ir montando una cadena, aplicando el filtro a
cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí todo
bien y montado, pero en algunos casos, la cadena puede pasar de 4000
caracteres y claro, me peta mucho.

¿Alguna sugerencia? Gracias mil

Eva Etxebeste

Preguntas similare

Leer las respuestas

#6 Salvador Ramos
14/11/2006 - 13:35 | Informe spam
Gracias Alejandro por la aclaración.

Así se consiguen las dos cosas que desea Eva, superar los 4000 caracteres y
seguir utilizando parámetros. :-)

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Alejandro Mesa" escribió en el
mensaje news:
Salvador,

Gracias por el comentario.

En realidad le estoy recomendando usar EXEC(...) para ejecutar
sp_executesql.

Ejemplo:

declare @s1 nvarchar(4000)
declare @s2 nvarchar(4000)

set @s1 = N'exec sp_executesql N''select * from nortwind.dbo.orders where
orderid = @orderid'''
set @s2 = N',@orderid int, 10250'

exec (@s1 + @s2)
go

No he probado el codigo, pero se que la idea funciona.


AMB

"Salvador Ramos" wrote:

Hola,

Con el permiso de Alejandro.
La solución que te propone Alejandro es que utilices EXEC en lugar de
sp_executesql para superar los 4000 caracteres, ya que puedes concatenar
varias variables.

Te paso un ejemplo:
create table #Prueba(id int, nombre varchar(30))
declare @sql1 nvarchar(4000)
declare @sql2 nvarchar(4000)
set @sql1 = N'Select * from #Prueba '
set @sql2 = N'where Id < 100'
exec( @sql1 + @sql2 )
drop table #Prueba

Pd. Un abrazo muy fuerte Eva, cuidate mucho.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



"Eva" escribió en el mensaje
news:
> Hola Alejandro
>
> Utilizo sp_executesql para poder incorporar algunos parámetros tipo
> nvarchar que entran en el procedimiento almacenado, y el lío es que el
> parámetro de sp_executesql es un nvarchar, como máximo 4000 caracteres.
>
> Gracias, un saludo
>
> Eva.
>
> "Alejandro Mesa" escribió en
> el
> mensaje news:
>> Eva,
>>
>> Deberas armar varias cadenas con la ejecucion de la sentencia que
>> ejecuta
>> sp_executesql y ejecutar la concatenacion mediante "exec
>> (c1+c2+...+cn)"
>>
>> Las virtudes y maldades del SQL dinámico
>> http://www.hayes.ch/sql/sql_dinamico.html
>>
>>
>> AMB
>>
>> "Eva" wrote:
>>
>>> Hola a Todos
>>>
>>> Le estoy dando vueltas a un problemilla que tengo, y cada solución
>>> que
>>> intento me doy de narices. Os cuento:
>>>
>>> Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7.
>>> Para
>>> uno
>>> de los reportes que ofrece la aplicación, tengo una selección de
>>> registros
>>> complicadilla, más que nada por la cantidad de tablas que entran en
>>> juego y
>>> por la sentencia where que tengo que aplicar, muuuuy variable y que
>>> monto
>>> por código.
>>>
>>> Hasta ahora lo he solucionado con una vista que me relaciona todas
>>> las
>>> tablas, y en un procedimiento almacenado monto una cadena con esta
>>> vista
>>> (y
>>> alguna fruslería que le hago) y un filtro que pasa como parámetro y
>>> forma el
>>> where. Lo ejecuto mediante sp_executesql y le paso los parámetros que
>>> hacen
>>> falta.
>>>
>>> Todo correcto pero, muy lento :(
>>>
>>> Siguiente intento: dividir mi where e irlo aplicando tan pronto
>>> (dentro
>>> de
>>> mis joins) como pueda para ir restringiendo desde el principio el
>>> número
>>> de
>>> registros. No problem, puedo ir montando una cadena, aplicando el
>>> filtro
>>> a
>>> cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí
>>> todo
>>> bien y montado, pero en algunos casos, la cadena puede pasar de 4000
>>> caracteres y claro, me peta mucho.
>>>
>>> ¿Alguna sugerencia? Gracias mil
>>>
>>> Eva Etxebeste
>>>
>>>
>>>
>>>
>>>
>>>
>
>



Respuesta Responder a este mensaje
#7 Salvador Ramos
14/11/2006 - 13:36 | Informe spam
Alejandro te ha dado la solución, combinando el uso de EXEC con
sp_executesql. Yo malinterpreté parte de su solcución.

Lee su respuesta.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Eva" escribió en el mensaje
news:%
Hola Salva :)))

Ok, ahora tengo otro problemita :)) Tengo un parámetro nvarchar(50) que
tengo que incluir en la sentencia. Con sp_executesql es fácil, pero si
tengo que utilizar exec pos que no voy a saber como hacerlo :'(

Cuídate tú también :)

"Salvador Ramos" escribió en el
mensaje news:uA%
Hola,

Con el permiso de Alejandro.
La solución que te propone Alejandro es que utilices EXEC en lugar de
sp_executesql para superar los 4000 caracteres, ya que puedes concatenar
varias variables.

Te paso un ejemplo:
create table #Prueba(id int, nombre varchar(30))
declare @sql1 nvarchar(4000)
declare @sql2 nvarchar(4000)
set @sql1 = N'Select * from #Prueba '
set @sql2 = N'where Id < 100'
exec( @sql1 + @sql2 )
drop table #Prueba

Pd. Un abrazo muy fuerte Eva, cuidate mucho.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



"Eva" escribió en el mensaje
news:
Hola Alejandro

Utilizo sp_executesql para poder incorporar algunos parámetros tipo
nvarchar que entran en el procedimiento almacenado, y el lío es que el
parámetro de sp_executesql es un nvarchar, como máximo 4000 caracteres.

Gracias, un saludo

Eva.

"Alejandro Mesa" escribió en
el mensaje news:
Eva,

Deberas armar varias cadenas con la ejecucion de la sentencia que
ejecuta
sp_executesql y ejecutar la concatenacion mediante "exec
(c1+c2+...+cn)"

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"Eva" wrote:

Hola a Todos

Le estoy dando vueltas a un problemilla que tengo, y cada solución que
intento me doy de narices. Os cuento:

Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7.
Para uno
de los reportes que ofrece la aplicación, tengo una selección de
registros
complicadilla, más que nada por la cantidad de tablas que entran en
juego y
por la sentencia where que tengo que aplicar, muuuuy variable y que
monto
por código.

Hasta ahora lo he solucionado con una vista que me relaciona todas las
tablas, y en un procedimiento almacenado monto una cadena con esta
vista (y
alguna fruslería que le hago) y un filtro que pasa como parámetro y
forma el
where. Lo ejecuto mediante sp_executesql y le paso los parámetros que
hacen
falta.

Todo correcto pero, muy lento :(

Siguiente intento: dividir mi where e irlo aplicando tan pronto
(dentro de
mis joins) como pueda para ir restringiendo desde el principio el
número de
registros. No problem, puedo ir montando una cadena, aplicando el
filtro a
cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí
todo
bien y montado, pero en algunos casos, la cadena puede pasar de 4000
caracteres y claro, me peta mucho.

¿Alguna sugerencia? Gracias mil

Eva Etxebeste




















Respuesta Responder a este mensaje
#8 Eva
14/11/2006 - 14:55 | Informe spam
Gracias mil, a probarlo!!!!!

"Alejandro Mesa" escribió en el
mensaje news:
Salvador,

Gracias por el comentario.

En realidad le estoy recomendando usar EXEC(...) para ejecutar
sp_executesql.

Ejemplo:

declare @s1 nvarchar(4000)
declare @s2 nvarchar(4000)

set @s1 = N'exec sp_executesql N''select * from nortwind.dbo.orders where
orderid = @orderid'''
set @s2 = N',@orderid int, 10250'

exec (@s1 + @s2)
go

No he probado el codigo, pero se que la idea funciona.


AMB

"Salvador Ramos" wrote:

Hola,

Con el permiso de Alejandro.
La solución que te propone Alejandro es que utilices EXEC en lugar de
sp_executesql para superar los 4000 caracteres, ya que puedes concatenar
varias variables.

Te paso un ejemplo:
create table #Prueba(id int, nombre varchar(30))
declare @sql1 nvarchar(4000)
declare @sql2 nvarchar(4000)
set @sql1 = N'Select * from #Prueba '
set @sql2 = N'where Id < 100'
exec( @sql1 + @sql2 )
drop table #Prueba

Pd. Un abrazo muy fuerte Eva, cuidate mucho.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



"Eva" escribió en el mensaje
news:
> Hola Alejandro
>
> Utilizo sp_executesql para poder incorporar algunos parámetros tipo
> nvarchar que entran en el procedimiento almacenado, y el lío es que el
> parámetro de sp_executesql es un nvarchar, como máximo 4000 caracteres.
>
> Gracias, un saludo
>
> Eva.
>
> "Alejandro Mesa" escribió en
> el
> mensaje news:
>> Eva,
>>
>> Deberas armar varias cadenas con la ejecucion de la sentencia que
>> ejecuta
>> sp_executesql y ejecutar la concatenacion mediante "exec
>> (c1+c2+...+cn)"
>>
>> Las virtudes y maldades del SQL dinámico
>> http://www.hayes.ch/sql/sql_dinamico.html
>>
>>
>> AMB
>>
>> "Eva" wrote:
>>
>>> Hola a Todos
>>>
>>> Le estoy dando vueltas a un problemilla que tengo, y cada solución
>>> que
>>> intento me doy de narices. Os cuento:
>>>
>>> Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7.
>>> Para
>>> uno
>>> de los reportes que ofrece la aplicación, tengo una selección de
>>> registros
>>> complicadilla, más que nada por la cantidad de tablas que entran en
>>> juego y
>>> por la sentencia where que tengo que aplicar, muuuuy variable y que
>>> monto
>>> por código.
>>>
>>> Hasta ahora lo he solucionado con una vista que me relaciona todas
>>> las
>>> tablas, y en un procedimiento almacenado monto una cadena con esta
>>> vista
>>> (y
>>> alguna fruslería que le hago) y un filtro que pasa como parámetro y
>>> forma el
>>> where. Lo ejecuto mediante sp_executesql y le paso los parámetros que
>>> hacen
>>> falta.
>>>
>>> Todo correcto pero, muy lento :(
>>>
>>> Siguiente intento: dividir mi where e irlo aplicando tan pronto
>>> (dentro
>>> de
>>> mis joins) como pueda para ir restringiendo desde el principio el
>>> número
>>> de
>>> registros. No problem, puedo ir montando una cadena, aplicando el
>>> filtro
>>> a
>>> cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí
>>> todo
>>> bien y montado, pero en algunos casos, la cadena puede pasar de 4000
>>> caracteres y claro, me peta mucho.
>>>
>>> ¿Alguna sugerencia? Gracias mil
>>>
>>> Eva Etxebeste
>>>
>>>
>>>
>>>
>>>
>>>
>
>



Respuesta Responder a este mensaje
#9 Eva
14/11/2006 - 15:07 | Informe spam
Gracias, Salva :)))

En cuanto al origen de todo este lío, ¿utilizar vistas para ir "escalonando"
los resultados puede ralentizar mi proceso? y ¿puedo acelerarlo si aplico
filtros en los primeros pasos, antes de hacer más enlaces con otras tablas?



"Salvador Ramos" escribió en el
mensaje news:etZ6Om%
Alejandro te ha dado la solución, combinando el uso de EXEC con
sp_executesql. Yo malinterpreté parte de su solcución.

Lee su respuesta.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Eva" escribió en el mensaje
news:%
Hola Salva :)))

Ok, ahora tengo otro problemita :)) Tengo un parámetro nvarchar(50) que
tengo que incluir en la sentencia. Con sp_executesql es fácil, pero si
tengo que utilizar exec pos que no voy a saber como hacerlo :'(

Cuídate tú también :)

"Salvador Ramos" escribió en el
mensaje news:uA%
Hola,

Con el permiso de Alejandro.
La solución que te propone Alejandro es que utilices EXEC en lugar de
sp_executesql para superar los 4000 caracteres, ya que puedes concatenar
varias variables.

Te paso un ejemplo:
create table #Prueba(id int, nombre varchar(30))
declare @sql1 nvarchar(4000)
declare @sql2 nvarchar(4000)
set @sql1 = N'Select * from #Prueba '
set @sql2 = N'where Id < 100'
exec( @sql1 + @sql2 )
drop table #Prueba

Pd. Un abrazo muy fuerte Eva, cuidate mucho.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



"Eva" escribió en el mensaje
news:
Hola Alejandro

Utilizo sp_executesql para poder incorporar algunos parámetros tipo
nvarchar que entran en el procedimiento almacenado, y el lío es que el
parámetro de sp_executesql es un nvarchar, como máximo 4000 caracteres.

Gracias, un saludo

Eva.

"Alejandro Mesa" escribió en
el mensaje news:
Eva,

Deberas armar varias cadenas con la ejecucion de la sentencia que
ejecuta
sp_executesql y ejecutar la concatenacion mediante "exec
(c1+c2+...+cn)"

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"Eva" wrote:

Hola a Todos

Le estoy dando vueltas a un problemilla que tengo, y cada solución
que
intento me doy de narices. Os cuento:

Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7.
Para uno
de los reportes que ofrece la aplicación, tengo una selección de
registros
complicadilla, más que nada por la cantidad de tablas que entran en
juego y
por la sentencia where que tengo que aplicar, muuuuy variable y que
monto
por código.

Hasta ahora lo he solucionado con una vista que me relaciona todas
las
tablas, y en un procedimiento almacenado monto una cadena con esta
vista (y
alguna fruslería que le hago) y un filtro que pasa como parámetro y
forma el
where. Lo ejecuto mediante sp_executesql y le paso los parámetros que
hacen
falta.

Todo correcto pero, muy lento :(

Siguiente intento: dividir mi where e irlo aplicando tan pronto
(dentro de
mis joins) como pueda para ir restringiendo desde el principio el
número de
registros. No problem, puedo ir montando una cadena, aplicando el
filtro a
cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí
todo
bien y montado, pero en algunos casos, la cadena puede pasar de 4000
caracteres y claro, me peta mucho.

¿Alguna sugerencia? Gracias mil

Eva Etxebeste
























Respuesta Responder a este mensaje
#10 Salvador Ramos
16/11/2006 - 13:32 | Informe spam
Hola Eva,

Creo que en los casos en que estás hablando no puede haber un plan de
ejecución común, ya que montas la instrucción de forma dinámica y puede
tener muchas variantes. Salvo el uso de parámetros estas haciendo, que
podría ayudar por ejemplo a evitar inyección de código SQL, poca diferencia
hay entre lo que estás haciendo y montar la instrucción SQL y lanzarla sin
utilizar procedimientos almacenados. Te puedo decir que vistas de vistas y
cosas similares, normalmente no tienen buen rendimiento, y suele haber
alternativas más optimas para los resultados esperados.

De todas formas, si nos puedes enviar por aquí algunos ejemplos variados de
instrucciones que se pueden montar en esa consulta y el DDL de las tablas
que intervienen, intentaresmos buscar una solución mejor.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Eva" escribió en el mensaje
news:OZFDwg$
Gracias, Salva :)))

En cuanto al origen de todo este lío, ¿utilizar vistas para ir
"escalonando" los resultados puede ralentizar mi proceso? y ¿puedo
acelerarlo si aplico filtros en los primeros pasos, antes de hacer más
enlaces con otras tablas?



"Salvador Ramos" escribió en el
mensaje news:etZ6Om%
Alejandro te ha dado la solución, combinando el uso de EXEC con
sp_executesql. Yo malinterpreté parte de su solcución.

Lee su respuesta.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Eva" escribió en el mensaje
news:%
Hola Salva :)))

Ok, ahora tengo otro problemita :)) Tengo un parámetro nvarchar(50) que
tengo que incluir en la sentencia. Con sp_executesql es fácil, pero si
tengo que utilizar exec pos que no voy a saber como hacerlo :'(

Cuídate tú también :)

"Salvador Ramos" escribió en el
mensaje news:uA%
Hola,

Con el permiso de Alejandro.
La solución que te propone Alejandro es que utilices EXEC en lugar de
sp_executesql para superar los 4000 caracteres, ya que puedes
concatenar varias variables.

Te paso un ejemplo:
create table #Prueba(id int, nombre varchar(30))
declare @sql1 nvarchar(4000)
declare @sql2 nvarchar(4000)
set @sql1 = N'Select * from #Prueba '
set @sql2 = N'where Id < 100'
exec( @sql1 + @sql2 )
drop table #Prueba

Pd. Un abrazo muy fuerte Eva, cuidate mucho.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



"Eva" escribió en el mensaje
news:
Hola Alejandro

Utilizo sp_executesql para poder incorporar algunos parámetros tipo
nvarchar que entran en el procedimiento almacenado, y el lío es que el
parámetro de sp_executesql es un nvarchar, como máximo 4000
caracteres.

Gracias, un saludo

Eva.

"Alejandro Mesa" escribió en
el mensaje news:
Eva,

Deberas armar varias cadenas con la ejecucion de la sentencia que
ejecuta
sp_executesql y ejecutar la concatenacion mediante "exec
(c1+c2+...+cn)"

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"Eva" wrote:

Hola a Todos

Le estoy dando vueltas a un problemilla que tengo, y cada solución
que
intento me doy de narices. Os cuento:

Tengo una aplicación Access (proyecto ADP) tirando de SQL Server 7.
Para uno
de los reportes que ofrece la aplicación, tengo una selección de
registros
complicadilla, más que nada por la cantidad de tablas que entran en
juego y
por la sentencia where que tengo que aplicar, muuuuy variable y que
monto
por código.

Hasta ahora lo he solucionado con una vista que me relaciona todas
las
tablas, y en un procedimiento almacenado monto una cadena con esta
vista (y
alguna fruslería que le hago) y un filtro que pasa como parámetro y
forma el
where. Lo ejecuto mediante sp_executesql y le paso los parámetros
que hacen
falta.

Todo correcto pero, muy lento :(

Siguiente intento: dividir mi where e irlo aplicando tan pronto
(dentro de
mis joins) como pueda para ir restringiendo desde el principio el
número de
registros. No problem, puedo ir montando una cadena, aplicando el
filtro a
cachitos y, al final, ejecutarla mediante sp_executesql. Hasta aquí
todo
bien y montado, pero en algunos casos, la cadena puede pasar de 4000
caracteres y claro, me peta mucho.

¿Alguna sugerencia? Gracias mil

Eva Etxebeste




























email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida