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


3

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

更长的故事

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

我通常使用SSMS 2016连接到SQL Server,然后使用“导出数据”向导。由于需要使用此方法手动单击各种选项,因此不是非常有效,并且由于所有手动点击方面而且此错误正在此级别进行并且直到需要,分析等数据

我想要一种方法来制作这个过程我试图解释更有效,并自动化更少的手动人工步骤。我尝试使用PowerShell(和SQLPS)方法,看起来非常慢,导出文件的编码并不是真的正确。我使用旧的DB和旧的SSIS包,并将所有这些转换为UTF8似乎非常混乱,所以我绝对需要输出ANSI1252(Latin 1)编码。

那里的任何专家都有一些很好的建议可以帮助我吗?


好。感谢您的downvote和所有建设性的反馈。真有帮助..
Niclas 2016年

请注意,超级用户不是脚本编写服务。如果您告诉我们您到目前为止所尝试的内容(包括您正在使用的任何脚本)以及您遇到的问题,我们可以尝试帮助解决具体问题。您还应该阅读我如何提出一个好问题?
DavidPostill

我不是在寻求编写脚本的帮助,我甚至提到我编写了脚本,但发现SQLPS的性能和输出编码选项缺乏。更多TLDR摘要: SQLPS,编码处理不当而且速度慢。SMSS导出向导太多手动步骤(鼠标点击)。SSIS包依赖于对服务器的写访问权以及与VS版的紧密耦合。如何提高效率(如可重用,可移植和快速部署具有可选编码和良好性能的表的导出)。
Niclas 2016年

1
你试过BCP吗?性能方面,这是我们的最佳选择。不确定它是否可以执行ANSI1252编码
2676140 2016年

Answers:


3

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

我会在评论中再次说出来......所以请查看BCP实用程序

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

另外,不要忘记COLLATE,因为如果适用,您可以在应用于导出查询的逻辑中“ 使用COLLATE子句将字符表达式应用于某个排序规则 ”。

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

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

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

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

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

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

  • 生成格式文件。

bcp实用程序由bcp命令访问。要使用bcp 命令批量导入数据,必须了解表的架构及其列的数据类型,除非您使用的是预先存在的格式文件。

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

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

注意!!bcp实用程序是使用ODBC批量复制编写的。有关bcp命令语法的说明,请参见bcp实用程序。

例子

有关bcp示例,请参阅:

资源


Bcp似乎正是我所缺少的工具。谢谢!
尼克拉斯2016年

1

下午,

不确定它是否有很多帮助 - 但我总是发现在使用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()
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.