Puedo volcar datos con bastante facilidad en un archivo de texto como:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
Sin embargo, he examinado los archivos de ayuda SQLCMD
pero no he visto una opción específica para CSV.
¿Hay alguna manera de volcar datos de una tabla en un archivo de texto CSV usando SQLCMD
?
sql-server
file
csv
sqlcmd
Rayo
fuente
fuente
Respuestas:
Puedes ejecutar algo como esto:
-h-1
elimina los encabezados de nombre de columna del resultado-s","
establece el separador de columna en-w 700
establece el ancho de fila en 700 caracteres (esto tendrá que ser tan ancho como la fila más larga o se ajustará a la siguiente línea)fuente
'""' + col1 + '""' AS col1
, envuelto en comillas dobles (duplicadas) o simplemente llamando a un procedimiento almacenado.Con PowerShell, puede resolver el problema de manera ordenada si conecta Invoke-Sqlcmd a Export-Csv.
SQL Server 2016 incluye el módulo SqlServer , que contiene el
Invoke-Sqlcmd
cmdlet, que tendrá incluso si instala SSMS 2016. Antes de eso, SQL Server 2012 incluía el antiguo módulo SQLPS , que cambiaría el directorio actualSQLSERVER:\
cuando el módulo estaba instalado. utilizado por primera vez (entre otros errores), por lo que deberá cambiar la#Requires
línea anterior a:Para adaptar el ejemplo para SQL Server 2008 y 2008 R2, elimine la
#Requires
línea por completo y use la utilidad sqlps.exe en lugar del host estándar de PowerShell.Invoke-Sqlcmd es el equivalente de PowerShell de sqlcmd.exe. En lugar de texto, genera objetos System.Data.DataRow .
El
-Query
parámetro funciona como el-Q
parámetro de sqlcmd.exe. Pase una consulta SQL que describa los datos que desea exportar.El
-Database
parámetro funciona como el-d
parámetro de sqlcmd.exe. Pásele el nombre de la base de datos que contiene los datos a exportar.El
-Server
parámetro funciona como el-S
parámetro de sqlcmd.exe. Pásele el nombre del servidor que contiene los datos a exportar.Export-CSV es un cmdlet de PowerShell que serializa objetos genéricos en CSV. Se envía con PowerShell.
El
-NoTypeInformation
parámetro suprime la salida adicional que no forma parte del formato CSV. De forma predeterminada, el cmdlet escribe un encabezado con información de tipo. Le permite saber el tipo de objeto cuando lo deserializa más tardeImport-Csv
, pero confunde las herramientas que esperan CSV estándar.El
-Path
parámetro funciona como el-o
parámetro de sqlcmd.exe. Una ruta completa para este valor es más segura si está atascado con el antiguo módulo SQLPS .El
-Encoding
parámetro funciona como los parámetros-f
o-u
de sqlcmd.exe. De forma predeterminada, Export-Csv genera solo caracteres ASCII y reemplaza todos los demás con signos de interrogación. Utilice UTF8 en su lugar para preservar todos los caracteres y mantenerse compatible con la mayoría de las otras herramientas.La principal ventaja de esta solución sobre sqlcmd.exe o bcp.exe es que no tiene que hackear el comando para generar CSV válido. El cmdlet Export-Csv lo maneja todo por usted.
La principal desventaja es que
Invoke-Sqlcmd
lee todo el conjunto de resultados antes de pasarlo por la tubería. Asegúrese de tener suficiente memoria para todo el conjunto de resultados que desea exportar.Es posible que no funcione sin problemas para miles de millones de filas. Si eso es un problema, puede probar las otras herramientas o lanzar su propia versión eficiente del
Invoke-Sqlcmd
uso de la clase System.Data.SqlClient.SqlDataReader .fuente
La última línea contiene opciones específicas de CSV.
-W
eliminar espacios finales de cada campo individual-s","
establece el separador de columna a la coma (,)-w 999
establece el ancho de fila en 999 caracteresLa respuesta de scottm está muy cerca de lo que uso, pero considero
-W
que es una buena adición: no necesito recortar espacios en blanco cuando consumo el CSV en otro lugar.Consulte también la referencia de MSDN sqlcmd . Pone
/?
en vergüenza la salida de la opción.fuente
'""' + col1 + '""' AS col1
, envuelto en comillas dobles (duplicadas) o simplemente llamando a un procedimiento almacenado.¿No
bcp
es para esto?Ejecute esto desde su línea de comando para verificar la sintaxis.
Por ejemplo:
Tenga en cuenta que
bcp
no puede generar encabezados de columna.Ver: página de documentos de la utilidad bcp .
Ejemplo de la página anterior:
fuente
bcp
no incluye el encabezado (nombres de columna), pero es ~ 10 veces más rápido quesqlcmd
(según mi experiencia). Para obtener datos realmente grandes, puede usarbcp
para obtener los datos, y usarsqlcmd
(seleccione el 0 superior * de ...) para obtener el encabezado, y luego combinarlos.Una nota para cualquiera que quiera hacer esto pero también tenga los encabezados de columna, esta es la solución que usé en un archivo por lotes:
Esto genera los resultados iniciales (incluidos los separadores ----, ---- entre los encabezados y los datos) en un archivo temporal, luego elimina esa línea filtrándola a través de findstr. Tenga en cuenta que no es perfecto ya que se está filtrando:
-,-
no funcionará si solo hay una columna en la salida, y también filtrará las líneas legítimas que contienen esa cadena.fuente
Esta respuesta se basa en la solución de @ iain-elder, que funciona bien, excepto en el caso de la gran base de datos (como se señala en su solución). Toda la tabla debe caber en la memoria de su sistema, y para mí esto no era una opción. Sospecho que la mejor solución sería usar System.Data.SqlClient.SqlDataReader y un serializador CSV personalizado ( consulte aquí para ver un ejemplo ) u otro idioma con un controlador MS SQL y serialización CSV. En el espíritu de la pregunta original que probablemente buscaba una solución sin dependencia, el siguiente código de PowerShell funcionó para mí. Es muy lento e ineficiente, especialmente para crear instancias de la matriz de datos $ y llamar a Export-Csv en modo de agregado para cada línea $ chunk_size.
fuente
Opción alternativa con BCP:
fuente
Por lo general,
sqlcmd
viene con unabcp
utilidad (como parte demssql-tools
) que exporta a CSV de forma predeterminada.Uso:
Por ejemplo:
Para volcar todas las tablas en los archivos CSV correspondientes, aquí está el script Bash :
fuente
Una respuesta anterior casi lo resolvió para mí, pero no crea correctamente un CSV analizado.
Aquí está mi versión:
Alguien que dice que
sqlcmd
está desactualizado a favor de alguna alternativa de PowerShell está olvidando quesqlcmd
no es solo para Windows. Estoy en Linux (y cuando estoy en Windows evito PS de todos modos).Habiendo dicho todo eso, me resulta
bcp
más fácil.fuente
Desde las siguientes 2 razones, debe ejecutar mi solución en CMD:
El nombre de usuario y la contraseña de inicio de sesión a veces son necesarios para consultar una instancia remota de SQL Server
fuente
Puedes hacerlo de una manera hack. Cuidado con el
sqlcmd
truco. Si los datos tienen comillas dobles o comas, se encontrará con problemas.Puede usar un script simple para hacerlo correctamente:
Fuente: Escritura de salida SQL a CSV con VBScript .
fuente
sqlcmd
, solo estábamos afirmando el hecho de quesqlcmd
no se escapa correctamente de la coma, por lo que apenas se puede utilizar para cualquier salida CSV grave .