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 SQLCMDpero 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-1elimina los encabezados de nombre de columna del resultado-s","establece el separador de columna en-w 700establece 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-Sqlcmdcmdlet, 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#Requireslínea anterior a:Para adaptar el ejemplo para SQL Server 2008 y 2008 R2, elimine la
#Requireslí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
-Queryparámetro funciona como el-Qparámetro de sqlcmd.exe. Pase una consulta SQL que describa los datos que desea exportar.El
-Databaseparámetro funciona como el-dparámetro de sqlcmd.exe. Pásele el nombre de la base de datos que contiene los datos a exportar.El
-Serverparámetro funciona como el-Spará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
-NoTypeInformationpará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
-Pathparámetro funciona como el-oparámetro de sqlcmd.exe. Una ruta completa para este valor es más segura si está atascado con el antiguo módulo SQLPS .El
-Encodingparámetro funciona como los parámetros-fo-ude 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-Sqlcmdlee 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-Sqlcmduso de la clase System.Data.SqlClient.SqlDataReader .fuente
La última línea contiene opciones específicas de CSV.
-Weliminar espacios finales de cada campo individual-s","establece el separador de columna a la coma (,)-w 999establece el ancho de fila en 999 caracteresLa respuesta de scottm está muy cerca de lo que uso, pero considero
-Wque 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
bcpes para esto?Ejecute esto desde su línea de comando para verificar la sintaxis.
Por ejemplo:
Tenga en cuenta que
bcpno puede generar encabezados de columna.Ver: página de documentos de la utilidad bcp .
Ejemplo de la página anterior:
fuente
bcpno 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 usarbcppara 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,
sqlcmdviene con unabcputilidad (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
sqlcmdestá desactualizado a favor de alguna alternativa de PowerShell está olvidando quesqlcmdno es solo para Windows. Estoy en Linux (y cuando estoy en Windows evito PS de todos modos).Habiendo dicho todo eso, me resulta
bcpmá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
sqlcmdtruco. 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 quesqlcmdno se escapa correctamente de la coma, por lo que apenas se puede utilizar para cualquier salida CSV grave .