Archivos de Categoría: SQL Server - Paginas 5

transacciones en SQL Server

Venga va, ya que estamos, seguimos con SQL server y las transacciones cuando hay un try catch de por medio.

Cuando hacemos un procedimiento almacenado y tenemos que insertar varios registros que dependen entre si, lo normal es usar transacciones para poder hacer un roll back en caso de que se produzca algún error. Antiguamente los programaba asi:

BEGIN TRANSACTION

/* código del procedimiento*/
IF (@@ERROR <> 0) GOTO ERROR

/* código del procedimiento*/

COMMIT TRAN
RETURN 0

Y al final del procedimiento nuestra anticuada rutina

ERROR:
ROLLBACK TRANSACTION
RETURN 1

Esto sigue funcionando pero es del pleistoceno y es mejor hacerlo con un try catch, que así nos evita tener que estar preguntando cada dos por tres si se ha producido un error:

 
BEGIN TRANSACTION;
BEGIN TRY

/* código del procedimiento*/


END TRY
BEGIN CATCH
    
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

Parsera XML desde SQL server

Bueno, parece que el chuletero lo tengo un poco abandonado pero es porque ando un pelín saturado de curro. Hoy toca pelearse un poco con SQL y la forma de parsear los XML.

En ocasiones podemos necesitar pasar una lista de valores a un procedimiento para insertarlos en base de datos. Si el número de esos valores puede ser dinámico la mejor forma de pasarlos es mediante un XML. Supongamos que tenemos por ejemplo el siguiente XML:

declare @xml xml;
set @xml = '
	<productos>
		<codigo>1</codigo>
		<codigo>2</codigo>
		<codigo>3</codigo>
	</productos>
';

Sin queremos hacer una consulta sobre este XML sería tan sencillo como:

SELECT  ParamValues.ID.value('.','int') as id 
FROM @xml.nodes('/productos/codigo') as ParamValues(ID) 

Pero qué pasa si queremos complicarlo un poco y no es una lista de valores sino un XML más complejo, como por ejemplo:

declare @xml xml
set @xml = '
	<home>		
		<posicion>
			<imagen>aa</imagen>
			<hover>bbb</hover>
			<url>cccc</url>
		</posicion>
		<posicion>
			<imagen>ddd</imagen>
			<hover>eee</hover>
			<url>ffff</url>
		</posicion>
	</home>
';

Pues la forma de hacerlo sería así:

SELECT
   pos.value('imagen[1]', 'Varchar(250)') as 'imagen',
   pos.value('hover[1]', 'Varchar(250)') as 'hover',
   pos.value('url[1]', 'varchar(250)') as 'url'
FROM
   @xml.nodes('/home/posicion') as posicion(pos)

Escribir fichero de texto desde SQL Server

Esta vez ha tocado ir escribiendo un log en un procedimiento almacenado por petición del cliente, asi que nada, la forma basica de escribir un fichero:

exec master..xp_cmdshell 'echo texto de inicio de log> c:\logs\fichero.txt'
exec master..xp_cmdshell 'echo texto concatenado al fichero >> c:\logs\fichero.txt'

peeeeero, para poder hacer esto, hay que habilitar el uso del xp_cmdshell que por defecto viene desactivado

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE

y logicamente, que la carpeta donde vayamos a escribir el log, debe tener permiso de escritura