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