jueves, 18 de octubre de 2012

Recorrer las filas de una tabla mediante Transac-SQL

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.