从 MS SQL 服务器导出数据的更好方法

从 MS SQL 服务器导出数据的更好方法

[摘要:]我需要能够使用预先确定的格式和 *Latin1 编码将临时数据从 MS SQL Server DB 导出到本地计算机上的文件中。我不确定 SSMS 是否有办法创建工作流,或者是否有 PowerShell 脚本解决方案,但不幸的是,由于各种原因,我无法使用 SSIS。

更长的故事

我经常从各种 MS SQL Server 实例上的一堆表中提取数据,所有这些实例都运行着从 2008 版到目前的 2016 版的各种版本的 SQL Server。导出数据后,我会使用它来构建使用 SSIS 包设置的不同测试环境。

我通常使用 SSMS 2016 连接到 SQL Server,然后使用“导出数据”向导。由于需要手动单击此方法中的各种选项,因此效率不高,而且由于所有手动单击方面,此任务会发生人为错误,并且错误都发生在此级别,直到需要、分析数据等时才会被注意到。

我希望找到一种方法,使我试图解释的这个过程更加高效,自动化程度更高,减少人工步骤。我尝试使用 PowerShell(和 SQLPS )方法,但似乎非常慢,并且导出文件的编码从来都不正确。我使用旧的 DB 和旧的 SSIS 包,将所有这些转换为 UTF8 似乎非常混乱,所以我绝对需要以 ANSI1252(Latin 1)编码输出。

有没有专家能给我一些好的建议来帮助我?

答案1

使用预定义格式和 Latin1 编码将 MS SQL 服务器中的临时数据导出到本地计算机上的文件?由于只读服务器和不同的 SQL 服务器版本,SSIS 已经过时(我认为)。

正如评论中提到的那样,我会再说一遍...所以看看BCP 实用程序

你提到编码统一码; 和BCP 实用程序支持要导出的 Unicode 字符格式因此...研究使用此方法临时提取到本地计算机上的文件需求。

此外,别忘了校对因为,如果适用的话,你可以“使用 COLLATE 子句将字符表达式应用于特定的排序规则“在应用于导出查询的逻辑中。

使用 bcp 实用工具导入和导出批量数据 (SQL Server)

本主题概述了如何使用bcp 实用程序从 SQL Server 数据库中使用 SELECT 语句的任何位置导出数据,包括分区视图

bcp 实用工具 (Bcp.exe) 是一个使用批量复制程序 (BCP) API 的命令行工具。bcp 实用工具执行以下任务:

  • 将数据从 SQL Server 表批量导出到数据文件中。

  • 从查询中批量导出数据。

  • 将数据从数据文件批量导入到 SQL Server 表中。

  • 生成格式文件。

bcp 实用程序可通过以下方式访问支助和协调局命令。要使用支助和协调局 命令批量导入数据,您必须了解表的架构及其列的数据类型,除非您使用预先存在的格式化文件。

bcp 实用程序可以将数据从 SQL Server 表导出到数据文件,以供其他程序使用。该实用程序还可以将数据从另一个程序(通常是另一个数据库管理系统 (DBMS))导入到 SQL Server 表中。首先将数据从源程序导出到数据文件,然后在单独的操作中将数据从数据文件复制到 SQL Server 表中。

支助和协调局命令提供了开关,您可以使用它们来指定数据文件的数据类型和其他信息。如果未指定这些开关,命令将提示您输入格式信息,例如数据文件中的数据字段类型。然后,命令会询问您是否要创建包含交互式响应的格式文件。如果您希望将来批量导入或批量导出操作具有灵活性,格式文件通常很有用。您可以在以后指定格式文件支助和协调局命令。有关详细信息,请参阅使用 bcp 时指定兼容的数据格式 (SQL Server)

笔记!!bcp 实用工具是使用 ODBC 批量复制编写的。有关 bcp 命令语法的说明,请参阅 bcp 实用工具。

例子

为了支助和协调局示例见:

来源

答案2

下午,

不确定它是否有太大帮助 - 但我发现在使用 SQL 时使用 .net 对象相当可靠。类似这样的方法对我来说很有效:

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Connection_String_Goes_Here"
$conn.open()

$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.connection = $conn

$cmd.commandtext = "SELECT * FROM myTable"

$sqlResults = $cmd.ExecuteReader()

$sqlResults | Get-Member

if ($sqlResults.HasRows -eq $true) {
    while ($sqlResults.read()) {
        $sqlResults.GetValue(1)
    }
} else {
    "No Results"
}

$conn.Close()

相关内容