将表从数据库导出到CSV文件


72

我想:csv不使用sql Server导入导出向导将表从sql server数据库导出到逗号分隔文件

我想使用查询来做,因为我想在自动化中使用查询

可能吗?我搜索了该文件,却找不到一个好的答案


3
是的,有可能,您可以使用C#,php和几乎任何其他编程语言...您尝试了什么?
Blachshma

您可以使用以下API:youtube.com/watch?
v=bwUy80UDWhE

Answers:


135

一些想法:

从SQL Server Management Studio

 1. Run a SELECT statement to filter your data
 2. Click on the top-left corner to select all rows
 3. Right-click to copy all the selected
 4. Paste the copied content on Microsoft Excel
 5. Save as CSV

使用SQLCMD(命令提示符)

例:

在命令提示符下,您可以运行查询并将其导出到文件中:

sqlcmd -S . -d DatabaseName -E -s, -W -Q "SELECT * FROM TableName" > C:\Test.csv

除非要将引号设置为分隔符,否则请勿仅使用-s引号分隔符,而不要使用-s'引号。

此处更多信息:ExcelSQLServer

笔记:

  • 这种方法将在文件底部显示“受影响的行”信息,但是您可以通过在查询本身中使用“ SET NOCOUNT ON”来消除此信息。

  • 您可以运行存储过程而不是实际查询(例如“ EXEC Database.dbo.StoredProcedure”)

  • 您可以使用任何编程语言甚至是批处理文件来自动执行此操作

使用BCP(命令提示符)

例:

bcp "SELECT * FROM Database.dbo.Table" queryout C:\Test.csv -c -t',' -T -S .\SQLEXPRESS

重要的是用逗号分隔符-t','vs -t

此处有更多信息:bcp实用程序

笔记:

  • 按照使用SQLCMD的方式,您可以运行存储过程而不是实际查询
  • 您可以使用任何编程语言或批处理文件来自动执行此操作

希望这可以帮助。


2
第一个建议是如此直接。:-)其他的将根据数据中的逗号和换行符而表现不同(两者均在正确的CSV文件中有效,并正确引用)。
TJ Crowder 2015年

第一条建议转储没有列名的数据(SQL Server 2014)。有方便的方法将它们包括在内吗?
Przemyslaw Remin

@PrzemyslawRemin-确保选择“结果到网格”,运行查询,然后在查询结果网格中,右键单击左上角的空白角单元格,然后选择“带标题复制”。它提供了制表符分隔的输出,可以轻松粘贴到excel中。
dunc

dunc,问题要求自动化解决方案。
FreeText

8

这是我找到的导出到Excel的选项(我相信可以修改为CSV)

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=D:\testing.xls;', 
'SELECT * FROM [SheetName$]') select * from SQLServerTable

我得到了SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', search for 'Ad Hoc Distributed Queries' in SQL Server Books Online.
xpt

2
您拥有纠正消息本身中的错误所需的所有信息。只需启用“临时分布式查询”即可。
Faiz 2015年

2
<sigh>,当我提供答案时,我会给出一个完整的答案,而stackexchange中超过99%的人也会这样做。stackexchange的目的是避免人们从网上寻找答案。显然,并非所有人都知道这一点的重要性。
xpt 2015年

5
答案是:stackoverflow.com/a/14544245/82961,但是在请别人为您做这件事之前,请付出一些努力。当您无法弄清楚该怎么做时,而不是对查找方法不感兴趣时​​,请使用SO。那只会使您成为一个懒惰的程序员,而不是一个好的程序员。.没有冒犯的意思。.也请养成完全阅读错误消息的习惯,大多数时候,您需要的所有线索都在那儿。
Faiz 2015年

1
显然,我们不同意提供完整答案的重要性,但是我可以接受-同意不同意。
xpt 2015年

8

您还可以使用以下Node.js模块轻松完成此操作:

https://www.npmjs.com/package/mssql-to-csv

var mssqlExport = require('mssql-to-csv')

    // All config options supported by https://www.npmjs.com/package/mssql 
    var dbconfig = {
        user: 'username',
        password: 'pass',
        server: 'servername',
        database: 'dbname',
        requestTimeout: 320000,
        pool: {
            max: 20,
            min: 12,
            idleTimeoutMillis: 30000
        }
    };

    var options = {
        ignoreList: ["sysdiagrams"], // tables to ignore 
        tables: [],                  // empty to export all the tables 
        outputDirectory: 'somedir',
        log: true
    };

    mssqlExport(dbconfig, options).then(function(){
        console.log("All done successfully!");
        process.exit(0);
    }).catch(function(err){
        console.log(err.toString());
        process.exit(-1);
   });

实际上,尽管值-1是我找到的最佳答案。.(下载Node.JS)
布达·弗洛林

优秀而有用。无论如何,有没有办法过滤表数据?创建一个特定的查询?
Federico Caccia

4
rsubmit;
options missing=0;
ods listing close;
ods csv file='\\FILE_PATH_and_Name_of_report.csv';

proc sql;
SELECT *
FROM `YOUR_FINAL_TABLE_NAME';
quit;
ods csv close;

endrsubmit;

2
这是什么语言/环境?
alonso s

看起来像PROC SQL for SAS
doktr

4

从SQL Server Management Studio

右键单击要导出的表,然后选择“选择所有行”

右键单击结果窗口,然后选择“将结果另存为...”


1
该解决方案,选择制表符分隔或CSV不,正确地引用列,引用分隔符,或用换行的结果打交道时
本·德莫特

如果您有NULL列-使用COALESCE(ColumnName,'')-它将NULL值替换为空字符串。
Shukhrat Raimov

1
问题要求自动化解决方案。
FreeText

>我想使用查询来执行此操作,因为我想在自动化中使用查询
James Adams

1

我写了一个小工具来做到这一点。代码可以在github上找到

要将一个(或多个)SQL查询的结果转储到一个(或多个)CSV文件中:

java -jar sql_dumper.jar /path/sql/files/ /path/out/ user pass jdbcString

干杯。



0

当出于某种原因想要所有表时?

您可以在SSMS中生成以下命令:

SELECT 
CONCAT('sqlcmd -S ',
'Your(local?)SERVERhere'
,' -d',
'YourDB'
,' -E -s, -W -Q "SELECT * FROM ',
TABLE_NAME,
'" >',
TABLE_NAME,
'.csv') FROM INFORMATION_SCHEMA.TABLES

并再次获得这样的行

sqlcmd -S ... -d... -E -s, -W -Q "SELECT * FROM table1" >table1.csv
sqlcmd -S ... -d... -E -s, -W -Q "SELECT * FROM table2" >table2.csv
...

还可以选择使用更好的TAB作为分隔符,但它需要一个奇怪的Unicode字符-在CMD中使用Alt + 9,它的显示方式为○(Unicode CB25),但只能通过复制/粘贴到命令行来进行,而不是批量进行。


-1

也许是死马了,但是不久前我试图做同样的事情,并且遇到了一个脚本来创建一个STP,该脚本试图做我想要的事情,但是它有一些怪癖需要注意。为了找到我要发布更新的脚本的位置,我遇到了这个线程,似乎是共享它的好地方。

此STP(在大多数情况下,我都不会相信,但找不到在其上找到的站点),将模式名称,表名称以及Y或N [包括或排除标题]作为输入参数并查询提供的表,以逗号分隔的带引号的csv格式输出每一行。

我已经对原始脚本进行了许多修复/更改,但是其中的骨骼来自OP,无论是谁。

这是脚本:

IF OBJECT_ID('get_csvFormat', 'P') IS NOT NULL
    DROP PROCEDURE get_csvFormat
GO

CREATE PROCEDURE get_csvFormat(@schemaname VARCHAR(20), @tablename VARCHAR(30),@header char(1))
AS
BEGIN
    IF ISNULL(@tablename, '') = ''
    BEGIN
        PRINT('NO TABLE NAME SUPPLIED, UNABLE TO CONTINUE')
        RETURN
    END
    ELSE
    BEGIN
        DECLARE @cols VARCHAR(MAX), @sqlstrs VARCHAR(MAX), @heading VARCHAR(MAX), @schemaid int

        --if no schemaname provided, default to dbo
        IF ISNULL(@schemaname, '') = ''
            SELECT @schemaname = 'dbo'

        --if no header provided, default to Y
        IF ISNULL(@header, '') = ''
            SELECT @header = 'Y'

        SELECT @schemaid = (SELECT schema_id FROM sys.schemas WHERE [name] = @schemaname)
        SELECT 
        @cols = (
            SELECT ' , CAST([', b.name + '] AS VARCHAR(50)) '  
            FROM sys.objects a 
            INNER JOIN sys.columns b ON a.object_id=b.object_id 
            WHERE a.name = @tablename AND a.schema_id = @schemaid
            FOR XML PATH('')
        ),
        @heading = (
            SELECT ',"' + b.name + '"' FROM sys.objects a 
            INNER JOIN sys.columns b ON a.object_id=b.object_id 
            WHERE a.name= @tablename AND a.schema_id = @schemaid
            FOR XML PATH('')
        )

        SET @tablename = @schemaname + '.' + @tablename
        SET @heading =  'SELECT ''' + right(@heading,len(@heading)-1) + ''' AS CSV, 0 AS Sort'  + CHAR(13)
        SET @cols =  '''"'',' + replace(right(@cols,len(@cols)-1),',', ',''","'',') + ',''"''' + CHAR(13)

        IF @header = 'Y'
            SET @sqlstrs =  'SELECT CSV FROM (' + CHAR(13) + @heading + ' UNION SELECT CONCAT(' + @cols + ') CSV, 1 AS Sort FROM ' + @tablename + CHAR(13) + ') X ORDER BY Sort, CSV ASC'
        ELSE
            SET @sqlstrs =  'SELECT CONCAT(' + @cols + ') CSV FROM ' + @tablename 

        IF @schemaid IS NOT NULL 
            EXEC(@sqlstrs)
        ELSE 
            PRINT('SCHEMA DOES NOT EXIST')
    END
END

GO

--------------------------------------

--EXEC get_csvFormat @schemaname='dbo', @tablename='TradeUnion', @header='Y'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.