Parámetros Varchar en un Stored Procedure

15/07/2007 - 00:32 por Valeria | Informe spam
Hola !!!
Tengo el siguente problema:
Un stored procedure recibe entre otros parámetros un varchar, el cual
contiene una lista de códigos separados por comas (,). Dentro del sp tengo
este while que genera un temporal con todos los códigos que luego usaré.

WHILE (SELECT CHARINDEX(',', @codigo)) > 0
BEGIN
SELECT @id_codigo = SUBSTRING(@codigo, 1, (SELECT CHARINDEX(',', @codigo))
- 1),
@codigo = SUBSTRING(@codigo, (SELECT CHARINDEX(',', @codigo)) + 1,
LEN(@codigo))

INSERT @TTemp
SELECT @id_codigo
end

El problema es:
si @codigo es varchar --> me devuleve la TTemp vacía.
si @codigo es varchar(1000) --> me completa la TTemp perfectametne.
Sucede que como trabajo con vb.net 2003 que tienen un tipo String, pero
ningún tipo cadena de tamaño fijo.
¿Cómo puedo hacer para compatibilizar el String con el varchar?
Muchas gracias,
Valeria.-

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
15/07/2007 - 01:06 | Informe spam
Hola Valeria,

No entiendo bien tu pregunta. Siempre que declares una variable o parametro
de tipo varchar, debes especificar su longitud, de lo contrario SS asumira
que es 1.

declare @s varchar

set @s = 'SS 2005 DE'

select @s, datalength(@s)
go

create procedure #p1
@s varchar
as
set nocount on

select @s, datalength(@s)
go

exec #p1 'SS 2005 DE'
go

drop procedure #p1
go

Me inmagino que para invocar el procedimineto almacenado, desde tu
aplicacion .NET, estes usando un objeto tipo SqlCommand y al cual le llenas
la coleccion de parametros con los parametros del procedimiento. Cuando usas
parametros tipo char / varchar, debes especificar su longitud.

SqlParameter Class
http://msdn2.microsoft.com/EN-US/li...lparameter(VS.71).aspx

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html


AMB

"Valeria" wrote:

Hola !!!
Tengo el siguente problema:
Un stored procedure recibe entre otros parámetros un varchar, el cual
contiene una lista de códigos separados por comas (,). Dentro del sp tengo
este while que genera un temporal con todos los códigos que luego usaré.

WHILE (SELECT CHARINDEX(',', @codigo)) > 0
BEGIN
SELECT @id_codigo = SUBSTRING(@codigo, 1, (SELECT CHARINDEX(',', @codigo))
- 1),
@codigo = SUBSTRING(@codigo, (SELECT CHARINDEX(',', @codigo)) + 1,
LEN(@codigo))

INSERT @TTemp
SELECT @id_codigo
end

El problema es:
si @codigo es varchar --> me devuleve la TTemp vacía.
si @codigo es varchar(1000) --> me completa la TTemp perfectametne.
Sucede que como trabajo con vb.net 2003 que tienen un tipo String, pero
ningún tipo cadena de tamaño fijo.
¿Cómo puedo hacer para compatibilizar el String con el varchar?
Muchas gracias,
Valeria.-
Respuesta Responder a este mensaje
#2 Valeria
15/07/2007 - 01:32 | Informe spam
Es un reporte en Crystal Reports, así que no uso SqlCommand sino:

Dim parametro_coleccion As New CrystalDecisions.Shared.ParameterValues
Dim parametro_valor As New CrystalDecisions.Shared.ParameterDiscreteValue

y lo seteo:
reporte.parametro_valor.Value = Cadena ' de tipo String
reporte.parametro_coleccion.Add(parametro_valor
.DataDefinition.ParameterFields("@patologias").ApplyCurrentValues(parametro_coleccion)

entonces no tengo como especificarle el tipo (SqlDbType.VarChar, 80)
Gracias.

"Alejandro Mesa" wrote:

Hola Valeria,

No entiendo bien tu pregunta. Siempre que declares una variable o parametro
de tipo varchar, debes especificar su longitud, de lo contrario SS asumira
que es 1.

declare @s varchar

set @s = 'SS 2005 DE'

select @s, datalength(@s)
go

create procedure #p1
@s varchar
as
set nocount on

select @s, datalength(@s)
go

exec #p1 'SS 2005 DE'
go

drop procedure #p1
go

Me inmagino que para invocar el procedimineto almacenado, desde tu
aplicacion .NET, estes usando un objeto tipo SqlCommand y al cual le llenas
la coleccion de parametros con los parametros del procedimiento. Cuando usas
parametros tipo char / varchar, debes especificar su longitud.

SqlParameter Class
http://msdn2.microsoft.com/EN-US/li...lparameter(VS.71).aspx

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html


AMB

"Valeria" wrote:

> Hola !!!
> Tengo el siguente problema:
> Un stored procedure recibe entre otros parámetros un varchar, el cual
> contiene una lista de códigos separados por comas (,). Dentro del sp tengo
> este while que genera un temporal con todos los códigos que luego usaré.
>
> WHILE (SELECT CHARINDEX(',', @codigo)) > 0
> BEGIN
> SELECT @id_codigo = SUBSTRING(@codigo, 1, (SELECT CHARINDEX(',', @codigo))
> - 1),
> @codigo = SUBSTRING(@codigo, (SELECT CHARINDEX(',', @codigo)) + 1,
> LEN(@codigo))
>
> INSERT @TTemp
> SELECT @id_codigo
> end
>
> El problema es:
> si @codigo es varchar --> me devuleve la TTemp vacía.
> si @codigo es varchar(1000) --> me completa la TTemp perfectametne.
> Sucede que como trabajo con vb.net 2003 que tienen un tipo String, pero
> ningún tipo cadena de tamaño fijo.
> ¿Cómo puedo hacer para compatibilizar el String con el varchar?
> Muchas gracias,
> Valeria.-
Respuesta Responder a este mensaje
#3 principiante
15/07/2007 - 21:46 | Informe spam
Quizas si lo consultas en un foro de crystal o de VB te puedan ayudar mejor.

Jose TH

"Valeria" escribió en el mensaje
news:
Es un reporte en Crystal Reports, así que no uso SqlCommand sino:

Dim parametro_coleccion As New CrystalDecisions.Shared.ParameterValues
Dim parametro_valor As New CrystalDecisions.Shared.ParameterDiscreteValue

y lo seteo:
reporte.parametro_valor.Value = Cadena ' de tipo String
reporte.parametro_coleccion.Add(parametro_valor)
.DataDefinition.ParameterFields("@patologias").ApplyCurrentValues(parametro_coleccion)

entonces no tengo como especificarle el tipo (SqlDbType.VarChar, 80)
Gracias.

"Alejandro Mesa" wrote:

Hola Valeria,

No entiendo bien tu pregunta. Siempre que declares una variable o
parametro
de tipo varchar, debes especificar su longitud, de lo contrario SS
asumira
que es 1.

declare @s varchar

set @s = 'SS 2005 DE'

select @s, datalength(@s)
go

create procedure #p1
@s varchar
as
set nocount on

select @s, datalength(@s)
go

exec #p1 'SS 2005 DE'
go

drop procedure #p1
go

Me inmagino que para invocar el procedimineto almacenado, desde tu
aplicacion .NET, estes usando un objeto tipo SqlCommand y al cual le
llenas
la coleccion de parametros con los parametros del procedimiento. Cuando
usas
parametros tipo char / varchar, debes especificar su longitud.

SqlParameter Class
http://msdn2.microsoft.com/EN-US/li...lparameter(VS.71).aspx

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html


AMB

"Valeria" wrote:

> Hola !!!
> Tengo el siguente problema:
> Un stored procedure recibe entre otros parámetros un varchar, el cual
> contiene una lista de códigos separados por comas (,). Dentro del sp
> tengo
> este while que genera un temporal con todos los códigos que luego
> usaré.
>
> WHILE (SELECT CHARINDEX(',', @codigo)) > 0
> BEGIN
> SELECT @id_codigo = SUBSTRING(@codigo, 1, (SELECT CHARINDEX(',',
> @codigo))
> - 1),
> @codigo = SUBSTRING(@codigo, (SELECT CHARINDEX(',', @codigo)) + 1,
> LEN(@codigo))
>
> INSERT @TTemp
> SELECT @id_codigo
> end
>
> El problema es:
> si @codigo es varchar --> me devuleve la TTemp vacía.
> si @codigo es varchar(1000) --> me completa la TTemp perfectametne.
> Sucede que como trabajo con vb.net 2003 que tienen un tipo String, pero
> ningún tipo cadena de tamaño fijo.
> ¿Cómo puedo hacer para compatibilizar el String con el varchar?
> Muchas gracias,
> Valeria.-
Respuesta Responder a este mensaje
#4 Valeria
17/07/2007 - 14:18 | Informe spam
Ya encontré la solución, se las paso por si alguno tiene el mismo problema.
Antes de pasarle el valor al parámetro (en mi caso parametro_valor.Value =
Cadena) hay que aclararle que es de tipo String:

parametro_valor.Kind.ToString()

Muchas gracias,
Valeria.-


"principiante" wrote:

Quizas si lo consultas en un foro de crystal o de VB te puedan ayudar mejor.

Jose TH

"Valeria" escribió en el mensaje
news:
> Es un reporte en Crystal Reports, así que no uso SqlCommand sino:
>
> Dim parametro_coleccion As New CrystalDecisions.Shared.ParameterValues
> Dim parametro_valor As New CrystalDecisions.Shared.ParameterDiscreteValue
>
> y lo seteo:
> reporte.parametro_valor.Value = Cadena ' de tipo String
> reporte.parametro_coleccion.Add(parametro_valor)
> .DataDefinition.ParameterFields("@patologias").ApplyCurrentValues(parametro_coleccion)
>
> entonces no tengo como especificarle el tipo (SqlDbType.VarChar, 80)
> Gracias.
>
> "Alejandro Mesa" wrote:
>
>> Hola Valeria,
>>
>> No entiendo bien tu pregunta. Siempre que declares una variable o
>> parametro
>> de tipo varchar, debes especificar su longitud, de lo contrario SS
>> asumira
>> que es 1.
>>
>> declare @s varchar
>>
>> set @s = 'SS 2005 DE'
>>
>> select @s, datalength(@s)
>> go
>>
>> create procedure #p1
>> @s varchar
>> as
>> set nocount on
>>
>> select @s, datalength(@s)
>> go
>>
>> exec #p1 'SS 2005 DE'
>> go
>>
>> drop procedure #p1
>> go
>>
>> Me inmagino que para invocar el procedimineto almacenado, desde tu
>> aplicacion .NET, estes usando un objeto tipo SqlCommand y al cual le
>> llenas
>> la coleccion de parametros con los parametros del procedimiento. Cuando
>> usas
>> parametros tipo char / varchar, debes especificar su longitud.
>>
>> SqlParameter Class
>> http://msdn2.microsoft.com/EN-US/li...lparameter(VS.71).aspx
>>
>> Arrays and Lists in SQL Server
>> http://www.sommarskog.se/arrays-in-sql.html
>>
>>
>> AMB
>>
>> "Valeria" wrote:
>>
>> > Hola !!!
>> > Tengo el siguente problema:
>> > Un stored procedure recibe entre otros parámetros un varchar, el cual
>> > contiene una lista de códigos separados por comas (,). Dentro del sp
>> > tengo
>> > este while que genera un temporal con todos los códigos que luego
>> > usaré.
>> >
>> > WHILE (SELECT CHARINDEX(',', @codigo)) > 0
>> > BEGIN
>> > SELECT @id_codigo = SUBSTRING(@codigo, 1, (SELECT CHARINDEX(',',
>> > @codigo))
>> > - 1),
>> > @codigo = SUBSTRING(@codigo, (SELECT CHARINDEX(',', @codigo)) + 1,
>> > LEN(@codigo))
>> >
>> > INSERT @TTemp
>> > SELECT @id_codigo
>> > end
>> >
>> > El problema es:
>> > si @codigo es varchar --> me devuleve la TTemp vacía.
>> > si @codigo es varchar(1000) --> me completa la TTemp perfectametne.
>> > Sucede que como trabajo con vb.net 2003 que tienen un tipo String, pero
>> > ningún tipo cadena de tamaño fijo.
>> > ¿Cómo puedo hacer para compatibilizar el String con el varchar?
>> > Muchas gracias,
>> > Valeria.-



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