我有数百个SQL Server表要导出到带有"
文本限定符和|
分隔符的txt或csv。导入/导出向导一次只允许一个表。
这一切都有更好的方法/工具/脚本吗?
由于
答案 0 :(得分:2)
您可以使用以下方法对BCP执行某些操作:
SELECT 'bcp [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] out "' + TABLE_SCHEMA + '.' + TABLE_NAME + '.txt" -T -c -t"|" -d {DATABASE NAME} -S {SERVER NAME} -T'
FROM INFORMATION_SCHEMA.TABLES
这将为您运行它的数据库中的每个表输出BCP语句。然后,您可以将它们复制并粘贴到命令窗口中。
在上文中,您希望将{DATABASE NAME}和{SERVER NAME}替换为您的环境的详细信息。 " -T"使用可信连接(即您),因此如果您需要使用特定用户名和密码执行某些操作,则需要进行相应调整。请查看BCP util文章了解更多详情。
SELECT可能需要根据数据库中对象的名称进行更多调整,但希望这可以让您了解在何处/如何开始。
答案 1 :(得分:1)
我看到了你的帖子,也看了SQL管理工作室里的导出工具,注意到它没有你正在谈论的多表导出(在我的情况下是sql management studio 2016预览版)。我想也许我会写一个快速的PowerShell脚本来完成这项工作。
这至少为我完成了这项工作,1。提取数据库中所有表的列表,然后2.循环遍历所有表,3。从表中选择并导出到预定义位置的csv。 / p>
我在Windows 10,PowerShell版本5上通过PowerShell ISE执行。
如果您不确定您的版本是否运行:
$PSVersionTable.PSVersion
请记住在运行之前更改执行政策,例如 https://technet.microsoft.com/en-us/library/ee176961.aspx
我在执行此脚本之前让我无限制。
Set-ExecutionPolicy Unrestricted
这是我写的剧本。
$databaseName="<DATABASE_NAME>"
$instanceName="<HOSTNAME\INSTANCENAME>"
$baseExportPath="C:\temp1\dbexport"
$query = "SELECT name FROM sys.Tables"
$tableNames = Invoke-SqlCmd –ServerInstance $instanceName -Database $databaseName –Query $query
New-Item -Force $baseExportPath -type directory
foreach($dataRow in $tableNames)
{
$exportFileName=$baseExportPath + "\\" + $dataRow.get_Item(0).ToString() + ".csv"
$tableSpecificQuery="select * from " + $dataRow.get_Item(0).ToString()
Invoke-SqlCmd –ServerInstance $instanceName -Database $databaseName –Query $tableSpecificQuery | Export-Csv -Path $exportFileName -NoTypeInformation
}
我没有为export-csv函数明确指定分隔符,但可以通过添加
轻松完成-Delimiter '|'
答案 2 :(得分:0)
导入/导出向导创建并运行一个简单的SSIS包。在包中使用多个数据流任务来执行其他表。一个好的开始是从向导中保存包并在那里复制/粘贴任务。从那里,在每个任务中更改数据源和目标。
在BIDS或SQL数据工具中工作对于像这样简单的事情来说并不算太糟糕。