¿Puedo consultar un archivo delimitado por tabulaciones desde SSMS?

14

¿Es posible consultar un archivo delimitado por tabulaciones de Sql Server Management Studio para ver sus datos sin guardarlos en ningún lado?

Sé que puedes BULK INSERTdesde un archivo delimitado por tabulaciones usando algo como:

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');

sin embargo, eso requiere que conozca las columnas de antemano y cree una tabla para contener los datos.

También sé que puede consultar algunos otros tipos de archivos, como CSV o Excel, sin definir las columnas por adelantado OPENROWSETy los controladores de Excel, como:

-- Query CSV
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;', 
    'SELECT * FROM MyFile.csv')

-- Query Excel
SELECT *
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 
    'Excel 8.0;Database=MyFile.xls', 
    'SELECT * FROM [Sheet1$]')

Además, si cambio la clave de registro Formatdebajo HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textde CSVDelimiteda TabDelimiteden SQL Server, la consulta CSV anterior leerá correctamente un archivo de texto delimitado por tabulaciones, sin embargo, ya no leerá un archivo de texto delimitado por comas, así que no creo que quiera dejarlo así

Intentar usar Format=TabDelimiteden el OPENROWSETtampoco funciona

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;Format=TabDelimited', 
    'SELECT * FROM MyFile.txt')

He hecho algunos intentos de copiar las Textclaves de registro de las claves Enginesy ISAM Formatsa algo personalizado que está predeterminado TabDelimited, sin embargo, todavía está leyendo archivos con en CSVFormatlugar de TabDelimitedformato, por lo que me falta algo aquí.

¿Hay alguna manera de consultar un archivo delimitado por tabuladores para ver su contenido sin tener que crear una tabla BULK INSERT?

Estoy usando SQL Server 2005

Rachel
fuente
¿Es aceptable usar una tabla temporal creada dinámicamente que se vacía después del uso?
jcolebrand
Segunda pregunta: ¿ha intentado usar los controladores de Excel para abrir el TDF? A veces Excel es mágico.
jcolebrand
@jcolebrand Sí, puedo usar tablas temporales, sin embargo, la lista de columnas es bastante larga y puede cambiar, por lo que preferiría poder especificar solo las columnas que me interesan en lugar de tener que escribir la definición de todas ellas. , y recordando actualizarlos cada vez que cambien las columnas innecesarias.
Rachel
@jcolebrand No había pensado probar los controladores de Excel, aunque no parece prometedor en este momento. En realidad, la extensión del archivo .bakno es una extensión de archivo delimitada normal, y el error que me dio en mi primer intento es Could not find installable ISAM, así que no creo que esto funcione.
Rachel
2
Analizaría personalmente la lista de columnas sobre la marcha del archivo cada vez (solo hago un recuento de pestañas en la primera línea del archivo) en lugar de tratar de mantener el número de columnas necesarias para importar, por lo tanto, la tabla temporal creada dinámicamente . Nunca codifique lo que puede hacer ingeniería inversa a partir de los datos, en mi opinión.
jcolebrand

Respuestas:

13

Debe crear un archivo schema.ini que contenga el delimitador en el mismo directorio que el archivo de texto que está abriendo. Esta es la única forma de anular los valores del registro por archivo. Consulte la documentación del formato de archivo en MSDN . Ejemplo:

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Text; HDR=YES; Database=C:\Text', 
    'SELECT * FROM testupload2.txt')

En C: \ Text \ schema.ini:

[testupload2.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0

Si esta actividad necesita repetirse con frecuencia, sugeriría un script para crear schema.ini. Se puede hacer referencia a varios archivos en el mismo schema.ini o se puede incluir un schema.ini separado con cada archivo de texto en su propio directorio.

dartonw
fuente
¡Muchas gracias! Había visto indicios de usar un archivo schema.ini, sin embargo, estaba teniendo problemas para descubrir cómo implementar uno por mi cuenta
Rachel
Sé que esta es una publicación antigua, pero solo tenía que decir "Buen trabajo" @dartonw.
Jeff Moden