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

#1 Alejandro Mesa
13/11/2006 - 13:28 | Informe spam
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
#2 Eva
13/11/2006 - 15:14 | Informe spam
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
#3 Salvador Ramos
13/11/2006 - 16:48 | Informe spam
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
#4 Eva
13/11/2006 - 17:20 | Informe spam
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
#5 Alejandro Mesa
13/11/2006 - 17:40 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida