Tengo un caso que quiero comentar por si alguien sabe como hacerlo:
Debo construir un scrip en transact que me permite tomar de una cadena que
puede contener más de una palabra un código nemotecnico de tres letras, por
ejemplo:
Tengo el nombre: FINANCIERA PODER Y DINERO
El código podria ser : FPD, debe excluir todos los articulos (el, lo, la y,
etc) el criterio deber ser el siguiente:
Tomar la primera letra de la primera palabra, la primera letra de la segunda
y la primera de la tercera en caso de que tenga tres o mas palabras sin
tener en cuenta los articulos (la,el,lo, de, y , etc) y si es de una palabra
es fácil porque solo debe tomar las tres primeras letras, se debe válidar
que no este repetido y si lo esta debe empezar a buscar otras alternativas
como la primera letra es la primera de la primera palabra y la segunda de la
segunda y la segunda de la tercera y asi sucesivamente.
Mil gracias,
Marcos Espinosa
Para probarlo, puedes ejecutar:
declare @tla char(3)
exec CreaTLA 'FINANCIERA PODERIO Y DINERO', @tla output
SELECT @TLA
Espero que te sirva.
create table Ruido(
Palabra varchar(20) PRIMARY KEY)
go
CREATE TABLE TLA(
TLA CHAR(3) PRIMARY KEY)
GO
/*
Importar el fichero de ruido de MSSearch
Cambia los parámetros a tus necesidades
*/
exec master.dbo.xp_cmdshell 'bcp den0.dbo.ruido in
d:\mssql7\ftdata\sqlserver\config\noise.esn -STuServidor -Usa -t\r -w -P'
GO
CREATE procedure CreaTLA
@Frase varchar(100), @TLA char(3) OUTPUT
AS
DECLARE @pos int
DECLARE @palabra varchar(100)
DECLARE @resto varchar(100)
CREATE TABLE #TLA(
ID int PRIMARY KEY IDENTITY(1,1),
Palabra varchar(100))
SET @resto = ltrim(rtrim(@Frase))
SET @Pos = CHARINDEX(' ', @resto)
WHILE @Pos <> 0
BEGIN
SET @Palabra = SUBSTRING(@Resto, 1, @pos-1)
Insert #tla
select upper(@Palabra)
set @Resto = substring(@Resto, @pos + 1, 100)
SET @Pos = CHARINDEX(' ', @resto)
END
INSERT #tla
select UPPER(@Resto)
DELETE #tla
FROM #Tla JOIN Ruido
ON Ruido.Palabra = #tla.Palabra
DECLARE @NTLA int
SET @NTLA = (SELECT Count(*) FROM #Tla)
IF @Ntla = 1
BEGIN
EXEC CreaTLA1 @TLA OUTPUT
IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
EXEC CreaTLA1 @TLA OUTPUT
END
END
ELSE IF @NTLA = 2
BEGIN
EXEC CreaTLA2 @TLA OUTPUT
IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
EXEC CreaTLA2 @TLA OUTPUT
END
END
ELSE
BEGIN
EXEC CreaTLA3 @TLA OUTPUT
IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
EXEC CreaTLA3 @TLA OUTPUT
END
END
GO
CREATE procedure CreaTLA1
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra varchar(100)
SET @Palabra = (SELECT TOP 1 Palabra
FROM #TLA)
SET @i1 = 1
SET @i2 = 2
SET @i3 = 3
WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra, @i1, 1) +
SUBSTRING(@Palabra, @i2, 1) +
SUBSTRING(@Palabra, @i3, 1)
IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra) - 1
BEGIN
SET @i2 = @i2 + 1
SET @i3 = @i2 + 1
END
ELSE IF @i1 < LEN(@Palabra) - 2
BEGIN
SET @i1 = @i1 + 1
SET @i2 = @i1 + 1
SET @i3 = @i2 + 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA
BREAK
END
END
GO
CREATE procedure CreaTLA2
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra1 varchar(100)
DECLARE @Palabra2 varchar(100)
SET @Palabra1 = (SELECT TOP 1 Palabra
FROM #TLA
ORDER BY ID ASC)
SET @Palabra2 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
ORDER BY ID ASC)
SET @i1 = 1
SET @i2 = 2
SET @i3 = 1
WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra1, @i1, 1) +
SUBSTRING(@Palabra1, @i2, 1) +
SUBSTRING(@Palabra2, @i3, 1)
IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra2)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra1)
BEGIN
SET @i2 = @i2 + 1
SET @i3 = 1
END
ELSE IF @i1 < LEN(@Palabra1) - 1
BEGIN
SET @i1 = @i1 + 1
SET @i2 = @i1 + 1
SET @i3 = 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA
BREAK
END
END
GO
CREAE procedure CreaTLA3
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra1 varchar(100)
DECLARE @Palabra2 varchar(100)
DECLARE @Palabra3 varchar(100)
SET @Palabra1 = (SELECT TOP 1 Palabra
FROM #TLA
ORDER BY ID ASC)
SET @Palabra2 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
ORDER BY ID ASC)
SET @Palabra3 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
AND Palabra <> @Palabra2
ORDER BY ID ASC)
SET @i1 = 1
SET @i2 = 1
SET @i3 = 1
WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra1, @i1, 1) +
SUBSTRING(@Palabra2, @i2, 1) +
SUBSTRING(@Palabra3, @i3, 1)
IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra3)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra2)
BEGIN
SET @i2 = @i2 + 1
SET @i3 = 1
END
ELSE IF @i1 < LEN(@Palabra1)
BEGIN
SET @i1 = @i1 + 1
SET @i2 = 1
SET @i3 = 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA
BREAK
END
END
GO
--
Fernando G. Guerrero
MCDBA, MCSD, MCT, MCSE+Internet
QA Group Ltd., UK
Share what you know, learn what you don't
(please reply only to the newsgroup)
"Marcos Espinosa" <maesp...@firstcom.com.co> wrote in message
news:eNRaArs5$GA.197@cppssbbsa05...
Un saludo.
Marcos Espinosa <maesp...@firstcom.com.co> escribió en el mensaje de
noticias eNRaArs5$GA.197@cppssbbsa05...