PDA

Ver la Versión Completa : convertir mayusculas y minusculas. Solo la primera letra en Mayusculas


Delphius
18-07-2007, 21:41:58
Buenas, llevo un tiempo intentando hacer que mi cabeza produzca alguna idea ingeniosa o por lo menos más sencilla ante una situación:

En mi trabajo estoy empleando SQL Server y los usuarios del sistema (que no lo hice yo) han ido ingresando los datos a su propio gusto. Hay datos tanto en minusculas como en mayusculas y esto para el jefe le resulta molesto....

Dediqué un tiempo en pensar de que modo puedo hacer para modificar todos los registros de modo tal que la unica letra en mayúscula sea la primera de cada palabra. Es decir que si en un campo existe algo como:
ABCDE FGHI JKLM, o abcde fghi jklm convertirlo a: Adcde Fghi Jklm

Lo más natural es crear un procedimiento almacenado.... pero hasta el momento no logrado hacer dicho propósito. Nunca me he topado con algo como esto.

Les agradecería, que si aguien tiene un tiempo, que me de unos consejos o guia de como proceder.

No es urgente. No hay prisa... cualquier ayuda será bien recibida.
Desde ya muchas gracias.

Saludos,
PD: Si hacen faltas detalles, veré si puedo estar en las condiciones de poder darlos a conocer.

poliburro
18-07-2007, 22:54:33
Está función igual puede servirte.

Select Databae.Owner.FcMinMayTexto('PEPE PECAS pica papas')

Que sería en tu tabla



Update Table
Set Campo = Modificada.CampoMod
From (
Select Llave,
Databae.Owner.FcMinMayTexto(Campo) As CampoMod
From Tabla
) As Modificada
Where Table.Clave = Modificada.Llave



Suerte



IF EXISTS (SELECT *
FROM sysobjects
WHERE name = N'FcMinMayTexto')
DROP FUNCTION FcMinMayTexto
GO
Create FUNCTION FcMinMayTexto
(@Ptexto As Varchar(100))
RETURNS VarChar(100)
AS
BEGIN
Declare
@ViPos As Integer, --Define la posicion del espacio en blanco en el texto
@VSAux As Varchar(100),
@VSRes As Varchar(100), --Almacena el texto resultado
@VSSubS As Varchar(100) --Almacena la subcadena cuya posicion inicia con el primer espacio en blanco encontrado dentro del texto

Set @VSSubS = Upper(LTrim(RTrim(@PTexto)))
Set @ViPos = 1
Set @VSRes = ''

--Bloque que analiza las dos primeras letras del texto para saber donde inician las letras y convertirla a mayúscula-
Set @VSAux = Substring(@VSSubS,@ViPos,1)
If Ascii(@VsAux) < 65 Or Ascii(@VsAux) > 90 Or Ascii(@VsAux) = 209
Begin
Set @VSAux = Substring(@VSSubS,@ViPos + 1,1)
If Ascii(@VsAux) < 65 Or Ascii(@VsAux) > 90 Or Ascii(@VsAux) = 209
begin
Set @ViPos = @ViPos + 1
End
Set @VSSubs = Lower(@VSSubs)
Set @VSSubs = Substring(@VSSubS,1,@ViPos) + Upper(Substring(@VSSubS,@ViPos + 1,1)) + Substring(@VSSubS,@ViPos + 2,Len(@VSSubS))
Set @Vipos = 10 --De esta manera le digo al siguiente bloque si debe o no convertir a minúsculas el texto
End
If @ViPos < 10
Set @VSSubs = Lower(@VSSubs)
--El siguiente bloque separa en palabras la cadena de texto y convierte en mayuscula la primera letra de cada una
While @ViPos > 0
Begin
Set @ViPos = charIndex(' ',@VSSubS)
Set @VSAux = Substring(@VSSubS,0,@ViPos + 1)
Set @VSAux = Upper(Left(@VSAux,1)) + Substring(@VSAux,2,Len(@VSAux))
Set @VSRes = @VSRes + @VSAux
Set @VSSubS = Substring(@VSSubS,@ViPos + 1,Len(@VSSubS))
End
Return @VSRes + Upper(Left(@VSSubS,1)) + Substring(@VSSubS,2,Len(@VSSubS))
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Delphius
21-07-2007, 02:20:22
poliburro, muchas gracias por dedicar tiempo y esfuerzo para ayudarme.

Todavía no he probado el código que tu me pasaste... con solo verlo me doy cuenta de que posiblemente a mi me llevase meses hacer algo así.

Como no dispongo de internet en el trabajo no puedo estar preguntando en los foros si es que voy haciendo bien o mal algunas cosas... asi que si tengo nuevas novedades o dudas tendré que esperar a llegar a casa para consultar.

Muchas gracias. Lo probaré en cuanto pueda.
Saludos,