Se trata de un pequeño script escrito en Transac-SQL para que a partir de los campos obtenidos en una tabla recorrerlo uno por uno y del texto de cada fila guardar en otra tabla cierto valor:
Suponiendo que tengamos que de esta tabla mas especificamente del campo TransactionsResponseRequestResult extraer del texto el valor de DS_ERROR_ID=0 en este caso 0
Nota:
El texto de la columna TransactionsResponseRequestResult tienen el formato de un query string del tipo variable=valor&variable2=valor....
Este es el código:
--Crear primero la funcion fnSplit create FUNCTION dbo.fnSplit( @sInputList VARCHAR(8000) -- List of delimited items , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items ) RETURNS @List TABLE (item VARCHAR(8000)) BEGIN DECLARE @sItem VARCHAR(8000) WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+
LEN(@sDelimiter),LEN(@sInputList))))
/*IF LEN(@sItem) > 0
-- INSERT INTO @List SELECT @sItem
*/
END
--esta parte inserta solo el segundo valor del split
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO
-- tabla auxiliar para obtener los valores
drop table #tmp
CREATE TABLE #tmp(item varchar(1000))
declare @PROFESOR varchar(2000)
--declaramos el Cursor para la consulta, este cursor nos permitira recorrer las filas de la tabla.
DECLARE TODOS CURSOR FOR
select aux.TransactionsResponseRequestResult from
( select p.* from transactions t
inner join TransactionsRequest q on t.TransactionsID = q.TransactionsID
left join TransactionsResponse p on t.TransactionsID = p.TransactionsID
left join ProcessorsResponse x on p.ProcessorsResponseID = x.ProcessorsResponseID
where q.AccountsID = 77
and TransactionsDate >=GETDATE()-30
) as aux --de aux seleccionamos el campo a tratar
/*Abrimos el cursor*/
OPEN TODOS
/*Extraemos el Primer registo*/
FETCH NEXT FROM TODOS
INTO @PROFESOR
/* imprimimos todos los registros mientras la variable @@FETCH_STATUS sea igual a 0*/
WHILE @@FETCH_STATUS = 0
BEGIN
insert into #tmp (item) values ((select * from fnSplit(@PROFESOR,'&DS_ERROR_ID=')) )
--insertamos los valores a los que se les hizo el split, en la tabla temporar/*Nos Movemos al siguiente registro*/ FETCH NEXT FROM TODOS INTO @PROFESOR END /*cerramos el cursor*/ CLOSE TODOS DEALLOCATE TODOS select * from #tmp
Este seria el resultado de ejecutar el codigo
Conclusiones:
Hemos visto uso de cursores para recorrer filas de una tabla, la creación de una función personalizada que nos permita hacer split a una cadena de texto y devuelva solo el segundo de los textos que divide.
No hay comentarios:
Publicar un comentario