1

Hola buenas queria saber si hay alguna manera de exportar todos los registros de todas las tablas a un XML, he estado usando lo siguiente.

SELECT * FROM AGENCIA FOR XML raw,elements,root('xml')

Pero esto solo me sirve para una tabla y queria saber si hay alguna manera de obtener todos los registros de todas las tablas. O para ellop es necesario cursor o procedimiento o algo.

La tabla AGENCIA tiene las siguientes columnas:

V_COD
V_NOM
V_CP
V_POB
V_PROV
V_TIPO_VIA
V_NOM_VIA
I_NUM_VIA
V_PISO
V_LETRA 

La columna V_COD es mi clave primaria

Pondre de ejemplo otra tabla pero tengo muchas mas TABLA CLIENTE con las siguientes columnas:

V_COD
V_NOM
V_CP
V_POB
V_PROV
V_TIPO_VIA
V_NOM_VIA
I_NUM_VIA
V_PISO
V_LETRA

Mi columna V_COD es la clave primaria

Antonio
  • 65
  • 7

1 Answers1

2

Una forma podría ser construyendo una sentencia dinámica a partir de las tablas de tu base de datos:

DECLARE @SQL NVARCHAR(MAX)

SELECT  @SQL = 'SET NOCOUNT ON' + CHAR(10)
SELECT  @SQL = @SQL + 'SELECT * FROM ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' FOR XML raw,elements,root(''xml'')' + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE' 
        AND TABLE_CATALOG='<El nombre de la base de datos>'

-- PRINT @SQL
EXEC sp_executesql @SQL

Esto generará tu sentencia original para cada tabla de la base de datos que quieras ver. Luego simplemente la ejecutaremos mediante: EXEC sp_executesql @SQL. Siempre que uno menciona sentencias dinámicas debe advertir también de eventuales problemas de inyección de código malicioso.

Patricio Moracho
  • 54,367
  • 12
  • 35
  • 68
  • Gracias por la ayuda. Pero la verdad aunque la generación del archivo deja mucho que desear ya que tambien te pone el texto de fials afectadas, datos de XML, etc. Pero bueno eso no pasa nada porque los borro y ya, lo unico que ocurre es que algunos elementos pierden datos, ya que les aparece (2 filas afectadas) o las que sean. Pero gracias por la aportacion me ha servido aunque el fallo es de sql server. – Antonio Apr 30 '19 at 09:59
  • @Antonio, la cantidad de filas, al menos, las puedes quitar con un `set nocount on`, ahí edito la respuesta – Patricio Moracho Apr 30 '19 at 12:35
  • Perdon por la tardanza gracias por la ayuda. Aun no lo he probado con el set not count porque no me encontraba ahora mismo trabajando con ello, pero lo probe sin el set not count, asique lo probare gracias por tu aportacion. – Antonio May 07 '19 at 07:09
  • Me lanza este error Mens. 6829, Nivel 16, Estado 1, Línea 15 Actualmente, los modos FOR XML EXPLICIT y RAW no admiten datos binarios como direcciones URL en la columna 'definition'. Quite la columna, utilice el modo BINARY BASE64 o cree la dirección URL directamente con la sintaxis 'dbobject/TABLE[@PK1='V1']/@COLUMN'. – Antonio May 07 '19 at 07:13
  • Alguna de las columnas de alguna de las tablas es un dato `binary`, puedes hacer que las mismas se retornen automáticamente en BASE64 y evitar el error simplemente agregando `BINARY BASE64` al la consulta por ejemplo: `SELECT * FROM Tabla FOR XML raw,elements,root('xml'), BINARY BASE64` – Patricio Moracho May 07 '19 at 14:09