Regresar texto desde un Procediemiento
Publicado por Carlos Reyes (49 intervenciones) el 13/05/2009 19:18:09
Hola a todos, recurro al foro por que tengo la siguiente duda, no se como atacar el problema que me surgio, espero me puedan ayudar.
El siguiente SP ya es funcional, el unico inconveniente es que en ocasiones la cadena de texto dinamica que se genera excede los 8000 caracteres, estoy trabajando en SQL 2000, por lo que esta es la limitante de los varchar, requiero que me genere un objeto de texto y se regrese este, el problema es que no puedo declarar variables de tipo texto, no es valido y segun tengo entendido unicamente se puede escribir texto en tablas, ¿alguna idea de como solucionarlo?, ademas el dato tiene que ser volatil, es decir, que se genere en tiempo de ejecucion y se elimine despues de ejecutarse sin causar errores de que ya existe un determinado objeto en la base ya que el proceso es concurrente, segun yo tendria que transformarlo a Procedimiento almacenado.
CREATE FUNCTION [dbo].[fun_obtieneCotizacionesBenchmark](@Cotizacion INT)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Paquete VARCHAR(15),
@Nombre VARCHAR(150),
@SumaAsegurada VARCHAR(20),
@Deducible VARCHAR(20),
@Prima VARCHAR(20),
@Aseguradora VARCHAR(15),
@TotRegistros INT,
@RegActual INT,
@NumAsegAnt VARCHAR(15),
@NumAsegAct VARCHAR(15),
@PaqueteAnt VARCHAR(15),
@PaqueteAct VARCHAR(15)
DECLARE @htmlSpan VARCHAR(8000),
@htmlCob VARCHAR(8000),
@htmlCompleto VARCHAR(8000)
SET @htmlSpan = ''
SET @htmlCob = ''
SET @htmlCompleto = ''
SET @RegActual = 0
SELECT @TotRegistros = COUNT(cc.CotizacionID)
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion
DECLARE cur_CoberturasCot CURSOR FOR
SELECT pc.AseguradoraID,
--cc.CotizacionID,
--cc.Numero,
--pc.ProductoID,
pc.PaqueteID,
e.Nombre AS Cobertura,
CONVERT(VARCHAR,cc.SumaAsegurada) AS SumaAsegurada,
CASE WHEN CONVERT(VARCHAR,cc.Deducible) = 0 THEN '-'
ELSE CONVERT(VARCHAR,cc.Deducible) + ' %' END AS Deducible,
CONVERT(VARCHAR,CONVERT(MONEY,cc.PrimaNeta),1) AS Prima
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion
GROUP BY pc.AseguradoraID,cc.CotizacionID,cc.Numero,pc.PaqueteID,e.Nombre,cc.SumaAsegurada,cc.Deducible,cc.PrimaNeta
OPEN cur_CoberturasCot
FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @htmlSpan = '<span id = detalle' + @Paquete + @Aseguradora + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'
SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
SET @htmlCompleto = @htmlCompleto + @htmlSpan + @htmlCob
SET @RegActual = @RegActual + 1
SET @NumAsegAnt = @Aseguradora
SET @NumAsegAct = @Aseguradora
SET @PaqueteAnt = @Paquete
SET @PaqueteAct= @Paquete
--print 'Entra ' + CONVERT(varchar,@RegActual)
--print @htmlSpan
WHILE @@FETCH_STATUS = 0
BEGIN
SET @NumAsegAnt = @Aseguradora
SET @PaqueteAnt = @Paquete
FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @NumAsegAct = @Aseguradora
SET @PaqueteAct = @Paquete
IF (@NumAsegAnt <> @NumAsegAct) OR (@PaqueteAnt<>@PaqueteAct)
SET @htmlCob = '<span id = detalle' + @PaqueteAct + @NumAsegAct + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'+
'<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
ELSE
SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
IF @RegActual = @TotRegistros
SET @htmlCompleto = @htmlCompleto + '</td></tr></table></span>'
ELSE
SET @htmlCompleto = @htmlCompleto + @htmlCob
SET @RegActual = @RegActual + 1
-- print 'Entra ' + CONVERT(varchar,@RegActual)
-- print @htmlCompleto
END
CLOSE cur_CoberturasCot
DEALLOCATE cur_CoberturasCot
RETURN @htmlCompleto
END
Espero me puedan ayudar, me urge!!!
Saludos
El siguiente SP ya es funcional, el unico inconveniente es que en ocasiones la cadena de texto dinamica que se genera excede los 8000 caracteres, estoy trabajando en SQL 2000, por lo que esta es la limitante de los varchar, requiero que me genere un objeto de texto y se regrese este, el problema es que no puedo declarar variables de tipo texto, no es valido y segun tengo entendido unicamente se puede escribir texto en tablas, ¿alguna idea de como solucionarlo?, ademas el dato tiene que ser volatil, es decir, que se genere en tiempo de ejecucion y se elimine despues de ejecutarse sin causar errores de que ya existe un determinado objeto en la base ya que el proceso es concurrente, segun yo tendria que transformarlo a Procedimiento almacenado.
CREATE FUNCTION [dbo].[fun_obtieneCotizacionesBenchmark](@Cotizacion INT)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Paquete VARCHAR(15),
@Nombre VARCHAR(150),
@SumaAsegurada VARCHAR(20),
@Deducible VARCHAR(20),
@Prima VARCHAR(20),
@Aseguradora VARCHAR(15),
@TotRegistros INT,
@RegActual INT,
@NumAsegAnt VARCHAR(15),
@NumAsegAct VARCHAR(15),
@PaqueteAnt VARCHAR(15),
@PaqueteAct VARCHAR(15)
DECLARE @htmlSpan VARCHAR(8000),
@htmlCob VARCHAR(8000),
@htmlCompleto VARCHAR(8000)
SET @htmlSpan = ''
SET @htmlCob = ''
SET @htmlCompleto = ''
SET @RegActual = 0
SELECT @TotRegistros = COUNT(cc.CotizacionID)
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion
DECLARE cur_CoberturasCot CURSOR FOR
SELECT pc.AseguradoraID,
--cc.CotizacionID,
--cc.Numero,
--pc.ProductoID,
pc.PaqueteID,
e.Nombre AS Cobertura,
CONVERT(VARCHAR,cc.SumaAsegurada) AS SumaAsegurada,
CASE WHEN CONVERT(VARCHAR,cc.Deducible) = 0 THEN '-'
ELSE CONVERT(VARCHAR,cc.Deducible) + ' %' END AS Deducible,
CONVERT(VARCHAR,CONVERT(MONEY,cc.PrimaNeta),1) AS Prima
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion
GROUP BY pc.AseguradoraID,cc.CotizacionID,cc.Numero,pc.PaqueteID,e.Nombre,cc.SumaAsegurada,cc.Deducible,cc.PrimaNeta
OPEN cur_CoberturasCot
FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @htmlSpan = '<span id = detalle' + @Paquete + @Aseguradora + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'
SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
SET @htmlCompleto = @htmlCompleto + @htmlSpan + @htmlCob
SET @RegActual = @RegActual + 1
SET @NumAsegAnt = @Aseguradora
SET @NumAsegAct = @Aseguradora
SET @PaqueteAnt = @Paquete
SET @PaqueteAct= @Paquete
--print 'Entra ' + CONVERT(varchar,@RegActual)
--print @htmlSpan
WHILE @@FETCH_STATUS = 0
BEGIN
SET @NumAsegAnt = @Aseguradora
SET @PaqueteAnt = @Paquete
FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @NumAsegAct = @Aseguradora
SET @PaqueteAct = @Paquete
IF (@NumAsegAnt <> @NumAsegAct) OR (@PaqueteAnt<>@PaqueteAct)
SET @htmlCob = '<span id = detalle' + @PaqueteAct + @NumAsegAct + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'+
'<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
ELSE
SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
IF @RegActual = @TotRegistros
SET @htmlCompleto = @htmlCompleto + '</td></tr></table></span>'
ELSE
SET @htmlCompleto = @htmlCompleto + @htmlCob
SET @RegActual = @RegActual + 1
-- print 'Entra ' + CONVERT(varchar,@RegActual)
-- print @htmlCompleto
END
CLOSE cur_CoberturasCot
DEALLOCATE cur_CoberturasCot
RETURN @htmlCompleto
END
Espero me puedan ayudar, me urge!!!
Saludos
Valora esta pregunta


0