将SQL表导出到单独的管道分隔文件中的更快捷方法?

时间:2016-04-01 15:15:02

标签: sql-server

我需要将数据库中的表导出到单独的文件中。而不是在每个表的SQL Server Management Studio中运行导出向导,有没有更快的方法来实现这一目标?数据需要采用管道分隔的形式。我找到了一个solution,但它没有提取数据,只是表定义。

3 个答案:

答案 0 :(得分:1)

这是一种方法。您可以启用xp_cmdshell

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for advanced options.
RECONFIGURE;
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO

然后使用未记录的sp_msforeachtable和bcp导出到分隔的文件管道。

EXECUTE sp_msForEachTable
  'EXECUTE master.dbo.xp_cmdshell ''bcp "SELECT * FROM ?" queryout D:\Data\?.txt -t "|" -c -T -S ServerName\InstanceName'''

这是有效的,您要确保禁用xp_cmdshell,因为它已经启用,因为它可以被利用(有很多内容可供阅读)。还要确保您有权将文件写入需要的位置。

答案 1 :(得分:0)

您可以尝试使用bcp(查看此处https://msdn.microsoft.com/en-us/library/ms162802.aspx),您可以在其中指定导出格式以使用管道作为分隔符。唯一的缺点是每次都需要指定表名,因此您可能需要创建一个包含表名的列表,然后使用powershell脚本在列表上循环并执行bcp。

答案 2 :(得分:0)

我还发现以下内容有所帮助,假设已为xp_cmdshell设置了sp_configure,正如@SQLChao在其解决方案中指出的那样:

Execute sp_MSforeachtable
  'Execute master.dbo.xp_cmdshell ''findstr /R /C:"^[^-]*$" c:\temp\?.bak > c:\temp\?.txt'''

删除输出文件中列名下的短划线:

Execute master.dbo.xp_cmdshell 'del c:\temp\*.bak'

最后,删除创建的.bak文件:

function runSnapToRoad(path) {

  var pathValues = [];
  for (var i = 0; i < path.getLength(); i++) {
    pathValues.push(path.getAt(i).toUrlValue());

  }

  jQuery.get('https://roads.googleapis.com/v1/snapToRoads', {
    interpolate: true,
    key: apiKey,
    path: pathValues.join('|')
  }, function(data) {
document.getElementById('autoc').value = "aa";
    processSnapToRoadResponse(data);
    drawSnappedPolyline();

  });

}