【问题标题】:SQL Server Management Studio 2012 - Export all tables of database as csvSQL Server Management Studio 2012 - 将数据库的所有表导出为 csv
【发布时间】:2015-08-27 18:42:46
【问题描述】:

我在 SQL Server 中有一个包含很多表的数据库,并希望以 csv 格式导出所有表。来自之前提出的一个非常相似的问题 - Export from SQL Server 2012 to .CSV through Management Studio

在 Management Studio 中右键单击您的数据库并选择任务 -> 导出数据...

按照向导,在目标部分选择“平面文件” 目的地'。输入您的文件名并选择您的选项。

我想要的是一次导出所有表格的能力。 SQL Server 导入和导出向导一次只允许一个表。如果您有一个非常大的数据库,这非常麻烦。我认为更简单的解决方案可能涉及编写查询,但不确定。

【问题讨论】:

  • 理论上,您可以将任意数量的表格导出为 .XLS 格式,然后将它们保存为多个 CSV 文件会很简单。在实践中......如果其中包含大量数据,我不想在一个工作簿中尝试超过 10 个表。

标签: sql sql-server ssms


【解决方案1】:

不要点击Export Data,而是选择Generate Scripts。选择您想要的表,单击下一步,然后单击Advanced 按钮。 General 下的最后一个选项是 Types of data to script。选择Schema and data 或只选择Data

【讨论】:

  • 即使我只在最后一个选项中选择“数据”,导出的文件也是 Microsoft SQL Server 查询文件格式。这不是我想要的文本或 csv。有什么解决方法吗?
  • 在 SS2016 中我找不到这个选项。 Generate Scripts 只允许我选择数据库对象,但不提供从表中选择数据的选项。
  • @EAmez 我仍然可以看到该选项。选择选项后,Set Scription Options 选项卡有一个Advanced 按钮,用于更多选项。单击它,您应该会看到Types of data to script 作为常规下的最后一个选项。它默认为仅架构,但您可以选择仅数据或架构和数据。
  • @JamieD77,你是对的。我在脚本数据库的那个步骤中错过了“高级”按钮。谢谢。
  • 使用 MSSQL Studio 18 时,我不断获取 .sql 文件,无论是在选择“仅数据”还是“架构和日期”时:/我该如何解决这个问题?我需要 csv 的
【解决方案2】:

导出向导一次只允许一个。我使用 powershell 脚本将所有表导出到 csv 中。如果对您有帮助,请尝试一下。

$server = "SERVERNAME\INSTANCE"
$database = "DATABASE_NAME"
$tablequery = "SELECT schemas.name as schemaName, tables.name as tableName from sys.tables inner join sys.schemas ON tables.schema_id = schemas.schema_id"

#Delcare Connection Variables
$connectionTemplate = "Data Source={0};Integrated Security=SSPI;Initial Catalog={1};"
$connectionString = [string]::Format($connectionTemplate, $server, $database)
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString

$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandText = $tablequery
$command.Connection = $connection

#Load up the Tables in a dataset
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $command
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$connection.Close()



# Loop through all tables and export a CSV of the Table Data
foreach ($Row in $DataSet.Tables[0].Rows)
{
    $queryData = "SELECT * FROM [$($Row[0])].[$($Row[1])]"

    #Specify the output location of your dump file
    $extractFile = "C:\mssql\export\$($Row[0])_$($Row[1]).csv"

    $command.CommandText = $queryData
    $command.Connection = $connection

    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $command
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $connection.Close()

    $DataSet.Tables[0]  | Export-Csv $extractFile -NoTypeInformation
}

谢谢

【讨论】:

  • 谢谢你。 SERVERNAME\INSTANCE 遇到了一些问题---对我有用的只是将 SERVERNAME 放在那里,然后确保我也创建了文件夹 c:\mssql\export 文件夹。干杯。
  • 在每个导出的文件中附加表名和表中的行数是否足够容易?我试图将其用于比较目的,这对我来说会容易得多。顺便说一句,剧本很棒!
  • 此脚本的另一个改进是在 Export-Csv 行中添加“-encoding "unicode" "参数以支持国际语言。
  • 一个非常有用的脚本。不过有一个警告......它只适用于不太大的桌子。一段时间后,内存会饱和,我猜主要是最后一行。如果有人有这个脚本的内存更安全的版本,那可能会非常有用。
  • 感谢您提供此脚本!事实证明,对于必须“降级”的数据库(在 SQL 2016 上备份但其他人只有 SQL 2014),这对我很有帮助。再次感谢。
【解决方案3】:

评论@annem-srinivas 解决方案: 如果您使用默认 (dbo) 以外的模式,请在他的脚本中更改以下内容:

$tablequery = "SELECT schemas.name as schemaName, tables.name AS tableName from sys.tables INNER JOIN sys.schemas ON schemas.schema_id
= tables.schema_id ORDER BY schemas.name, tables.name"

$queryData = "SELECT * FROM [$($Row[0])].[$($Row[1])]"
$extractFile = "C:\temp\export\$($Row[0]).$($Row[1]).csv"

【讨论】:

    【解决方案4】:

    第一种方式

    您可以将架构复制到临时数据库,然后使用该数据库导出所有表(连同列名)。

    步骤:

    1) 首先,为所有表创建一个脚本:
    任务->生成脚本->所有表->单个sql文件

    2) 创建一个虚拟数据库并运行此脚本。

    3)右键单击虚拟数据库并选择任务->导出数据->选择源数据->选择目标为Microsoft Excel并给出其路径->执行

    您将获得一个包含所有表格及其列的电子表格。

    第二种方式

    执行下面的查询,它将在结果的第 1 列中给出所有表名以及在第 2 列中对应的列名。

    select t.name ,c.name from sys.columns c
    inner join sys.tables t
    on t.object_id = c.object_id
    order by t.name
    

    复制此结果并将其粘贴到 CSV 中。

    【讨论】:

    • 不幸的是,Excel 导出从未真正为我工作过。从太多行(当 excel 可以容纳 2^20 时似乎上限为 2^16)到转换错误时,总是存在大量错误。
    【解决方案5】:

    sree 的回答很棒。对于我的数据库,因为有多个模式,我改变了这个:

    $tablequery = "SELECT schemas.name as schemaName, tables.name as tableName from sys.tables inner join sys.schemas ON tables.schema_id = schemas.schema_id"
    

    还有

    $queryData = "SELECT * FROM [$($Row[0])].[$($Row[1])]"
    
    #Specify the output location of your dump file
    $extractFile = "C:\mssql\export\$($Row[0])_$($Row[1]).csv"
    

    【讨论】:

    • 这非常有用。大多数数据库都有多个模式,在脚本中说明这一点很重要。
    猜你喜欢
    • 2012-07-06
    • 2013-07-02
    • 1970-01-01
    • 2023-04-10
    • 2010-11-10
    • 1970-01-01
    • 2011-11-18
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多