Recorrer las filas de una tabla mediante Transac-SQL (es-ES)
Basado en este articulo
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:
http://4.bp.blogspot.com/-DKa8tvugeHE/T_8mDu4zCYI/AAAAAAAAAGc/PNKPVgGXArI/s400/tabla1.png
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
http://2.bp.blogspot.com/-g2cabroRjKo/T_88iiUvb2I/AAAAAAAAAGo/uiFbGnfrKlk/s1600/Tabla2.png
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.