Problema con longitud de variable varchar

06/06/2005 - 23:37 por caceres | Informe spam
Hola a todos,
Tengo una variable de tipo varchar(8000) en un procedimiento almacenado, a
la cual le voy concatenando una cadena para formar un Query con subquery algo
así cómo esto:
DECLARE @SENTENCIA VARCHAR(8000)

SELECT @SENTENCIA = @SENTENCIA +'(SELECT ' + @CAMPO + ' FROM ' + @TABLA + '
WHERE CODI=''' + @INDI + '''' +
' AND ANO='+ @ANO + ' AND CODE=''' + @CODE + ''')' + '+'

y me sucede que la variable @SENTENCIA solo me guarda hasta 4000 caracteres,
los otros no es capaz de concatenarlos, le agradecería muchisimo que me
ayudaran con esto ya que no se qué puede estar pasando.

Saludos y gracias de antemano

caceres

Preguntas similare

Leer las respuestas

#6 caceres
10/06/2005 - 14:03 | Informe spam
Hola, primero que todo muchas gracias por su preocupación, de veras que se lo
agradezco.

No es que le llegen exactamente los 8000 caracteres, solo que a pesar de que
la cadena no llega a tener los 8000 caracteres, en un momento de la ejecución
trunca la cadena y no me concatena más y es por ello que no se completa el
resultado final.

Aquí le pongo el código del procedimiento, pero antes trataré de decirle que
es lo que debe hacer ese procedimiento:
Al procedimiento le paso una formula y a partir de esa formula yo formo un
query para realizar la suma o resta de cada uno de los elementos que la
forman, respetando el orden de prioridad de las operaciones que se indica
mediante parentesis


ALTER PROCEDURE CALCULA_FORMULA_ANUAL @Formula VARCHAR(8000),@ANO CHAR(4),
@CODE NVARCHAR(5),
@CAMPO NVARCHAR(20), @TABLA NVARCHAR(20), @@VALOR
DECIMAL(18,2) OUTPUT
AS

DECLARE @@VALOR DECIMAL(18,2)

SELECT @Formula =
'((20800003+20800005+20800007)+(20800004+20800006+20800008)+20500000)+(20918002+20918003+20918004)+(1106+1107+1108)+(20901000+20902000+20903001+1110+20906000+1112+1113+20990000+20989000)+1114+(20904000+20998007+20998008+20998009+20998010+20904001+20935002+20905000+20971000)+(20907000+20909000+20948002+20910000+20913000+20913002+20913003+20914023+20917004+20919000+20922004+20922011+20922018+20922022+20922026+20922030+20922021+20922037+20928001+20930001+20934000+20936000+20939000+20945000+20946000+20946001+20948001+20955000+20962001+20962004+20975005+20980000+20983000+20986001+20986002+20986003+(20987001+20987008+20987009+20987010+20987022+20987025)+(22040+22041+22042+22043)+20997000+20998001+20998004+20999000+20999010+20999038+20999040+20999041+20999050+20999051)-21000000+21100000+21200000-21300000'
SELECT @ANO = '2005'
SELECT @CODE = 'M0402'
SELECT @CAMPO = 'Val_PlanMLC'
SELECT @TABLA = 'PrPanIndi'


DECLARE @@CADENA VARCHAR(8000)
DECLARE @INDI NVARCHAR(15)
DECLARE @OPERADOR CHAR(1)
DECLARE @OP CHAR(1)
DECLARE @PART_OPEN NVARCHAR(5)
DECLARE @PART_CLOSE NVARCHAR(5)
DECLARE @CASO INT
DECLARE @SENTENCIA VARCHAR(8000)
DECLARE @@SENTENCIA1 VARCHAR(8000)
DECLARE @@RESULT DECIMAL(18,2)
DECLARE @VALUE DECIMAL(18,2)
DECLARE @OPEN INT
DECLARE @CLOSE INT

SELECT @OPEN = 0
SELECT @CLOSE = 0
SELECT @OP = ''
SELECT @VALUE = 0
SELECT @SENTENCIA = ''
SELECT @@CADENA = @Formula

IF ((CHARINDEX( '+', @@CADENA, 0 ) > 0) OR (CHARINDEX( '-', @@CADENA, 0 ) >
0))
BEGIN
WHILE ((CHARINDEX( '+', @@CADENA, 0 ) > 0) OR (CHARINDEX( '-', @@CADENA, 0
) > 0))
BEGIN
IF ((CHARINDEX( '+', @@CADENA, 0 ) > 0) AND (CHARINDEX( '-', @@CADENA, 0
) > 0))
SELECT @CASO = (CASE WHEN CHARINDEX( '+', @@CADENA, 0 ) < CHARINDEX(
'-', @@CADENA, 0 ) THEN 0 ELSE 1 END)
ELSE
IF ((CHARINDEX( '+', @@CADENA, 0 ) > 0))
SELECT @CASO = 0
ELSE
IF ((CHARINDEX( '-', @@CADENA, 0 ) > 0))
SELECT @CASO = 1

IF @CASO = 0 -- (+)
BEGIN
SELECT @INDI = SUBSTRING(@@CADENA, 0, CHARINDEX('+', @@CADENA))

SELECT @OPERADOR = SUBSTRING(@@CADENA, CHARINDEX('+', @@CADENA), 1)

SELECT @@CADENA = SUBSTRING(@@CADENA, CHARINDEX('+', @@CADENA)+1,
LEN(@@CADENA))
END
ELSE
IF @CASO = 1 -- (-)
BEGIN
SELECT @INDI = SUBSTRING(@@CADENA, 0, CHARINDEX('-', @@CADENA))

SELECT @OPERADOR = SUBSTRING(@@CADENA, CHARINDEX('-', @@CADENA), 1)

SELECT @@CADENA = SUBSTRING(@@CADENA, CHARINDEX('-', @@CADENA)+1,
LEN(@@CADENA))
END

SELECT @PART_OPEN = ''
WHILE (CHARINDEX('(', @INDI) > 0)
BEGIN
SELECT @PART_OPEN = @PART_OPEN + '('
SELECT @INDI = SUBSTRING(@INDI, 2, LEN(@INDI))
SELECT @OPEN = @OPEN + 1
END

SELECT @PART_CLOSE = ''

WHILE (CHARINDEX(')', @INDI) > 0)
BEGIN
SELECT @PART_CLOSE = @PART_CLOSE + ')'
SELECT @INDI = SUBSTRING(@INDI, 0, LEN(@INDI))
SELECT @CLOSE = @CLOSE + 1
END


IF ((@INDI = 'M1') OR (@INDI = 'M2') OR (@INDI = 'M3') OR (@INDI = 'M4'))
BEGIN
EXEC GET_VALUE_MODELOS_ANUAL @INDI, @CODE, @CAMPO, @TABLA, @ANO,
'EMPRESA',@@SENTENCIA1 OUTPUT
SELECT @SENTENCIA = @SENTENCIA + @PART_OPEN + @@SENTENCIA1 +
@PART_CLOSE + @OPERADOR
END
ELSE
SELECT @SENTENCIA = @SENTENCIA + @PART_OPEN +'(SELECT ' + @CAMPO + '
FROM ' + @TABLA + ' WHERE CODI=''' + @INDI + '''' +
' AND ANO='+ @ANO + ' AND CODE=''' + @CODE + ''')'+
@PART_CLOSE + @OPERADOR

END
END


SELECT @INDI = @@CADENA

SELECT @PART_OPEN = ''
WHILE (CHARINDEX('(', @INDI) > 0)
BEGIN
SELECT @PART_OPEN = @PART_OPEN + '('
SELECT @INDI = SUBSTRING(@INDI, 2, LEN(@INDI))
END

SELECT @PART_CLOSE = ''
WHILE (CHARINDEX(')', @INDI) > 0)
BEGIN
SELECT @PART_CLOSE = @PART_CLOSE + ')'
SELECT @INDI = SUBSTRING(@INDI, 0, LEN(@INDI))
END


IF ((@INDI = 'M1') OR (@INDI = 'M2') OR (@INDI = 'M3') OR (@INDI = 'M4'))
BEGIN
EXEC GET_VALUE_MODELOS_ANUAL @INDI, @CODE, @CAMPO, @TABLA, @ANO,
'EMPRESA',@@SENTENCIA1 OUTPUT
SELECT @SENTENCIA = @SENTENCIA + @PART_OPEN + @@SENTENCIA1 +
@PART_CLOSE + ' AS VALUE'
END
ELSE
SELECT @SENTENCIA= @SENTENCIA + @PART_OPEN +'(SELECT ' + @CAMPO + '
FROM ' + @TABLA + ' WHERE CODI=''' + @INDI + '''' +
' AND ANO='+ @ANO + ' AND CODE=''' + @CODE + ''')'+
@PART_CLOSE + ' AS VALUE'

SELECT @SENTENCIA ='DECLARE PCursor CURSOR FOR SELECT ' + @SENTENCIA
EXEC(@SENTENCIA)

OPEN PCursor

FETCH FROM PCursor INTO @VALUE

IF (@OP <> '')
BEGIN
IF (@OP = '+')
SELECT @@VALOR = @@VALOR + @VALUE
ELSE
IF (@OP = '-')
SELECT @@VALOR = @@VALOR - @VALUE
END
ELSE
SELECT @@VALOR = @VALUE

CLOSE PCursor
DEALLOCATE PCursor

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO




"Maxi" escribió:

Hola, y esa cadena estas seguro que le estan llegando los 8.000 caracteres?


Salu2
Maxi


"caceres" escribió en el mensaje
news:
> Es un varchar, en la ayuda de Sql2000 se dice que puede almacenar hasta
> 8000
> caracteres, pero me trunca la cadena que quiero guardar en ella
>
> "Maxi" escribió:
>
>> Hola, es varchar o nvarchar?
>>
>>
>> Maxi - Buenos Aires - Argentina
>> Desarrollador 3 Estrellas
>>
>> Msn_messager:
>> mail: Maxi.da[arroba]gmail.com
>>
>> "caceres" escribió en el mensaje
>> news:
>> > Hola a todos,
>> > Tengo una variable de tipo varchar(8000) en un procedimiento
>> > almacenado, a
>> > la cual le voy concatenando una cadena para formar un Query con
>> > subquery
>> > algo
>> > así cómo esto:
>> > DECLARE @SENTENCIA VARCHAR(8000)
>> >
>> > SELECT @SENTENCIA = @SENTENCIA +'(SELECT ' + @CAMPO + ' FROM ' + @TABLA
>> > +
>> > '
>> > WHERE CODI=''' + @INDI + '''' +
>> > ' AND ANO='+ @ANO + ' AND CODE=''' + @CODE + ''')' + '+'
>> >
>> > y me sucede que la variable @SENTENCIA solo me guarda hasta 4000
>> > caracteres,
>> > los otros no es capaz de concatenarlos, le agradecería muchisimo que me
>> > ayudaran con esto ya que no se qué puede estar pasando.
>> >
>> > Saludos y gracias de antemano
>> >
>> > caceres
>>
>>
>>



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