我一直在尝试获取大型且多重连接的SELECT语句的结果,并将查询结果通过电子邮件发送为CVS文件。 我有正确的查询和电子邮件,但我无法自动导出结果作为CVS文件。根据我一直在阅读的内容,自动导出查询结果的最佳选择是一个名为“BCP”的工具。
我尝试在Management Studio中使用这样的BCP:
USE FootPrint;
DECLARE @sql VARCHAR(2048);
DECLARE @dir VARCHAR(50);
SET @dir = 'C:\Users\bailey\Desktop';
SET @sql = 'bcp "SELECT TOP 10 * FROM datex_footprint.Shipments" queryout "' + @dir + '" -c -t, -T';
EXEC master..xp_cmdshell @sql;
FootPrint是特定数据库的名称,datex_footprint是架构。 (这不是真正的查询,只是一个测试)。
当我运行它时,我得到的错误是: “SQLState = S0002,NativeError = 208” “错误= [Microsoft] [SQL Server Native Client 10.0] [SQL Server]无效的对象名称'datex_footprint.Shipments'。”
我100%肯定datex_footprint.Shipments是我正在尝试测试的数据的正确架构\表访问。
有没有人在尝试将此结果导出到CSV文件时看到我遗漏或做错了什么?但具体来说,我正在尝试自动化这个过程。我知道如何将结果导出到CSV文件中,但我想在T-SQL中进行,这样我就可以按时间自动生成文件。
任何帮助将不胜感激!
答案 0 :(得分:3)
[解决]
我弄清楚我做错了什么。我没有以完整的形式识别视图。我使用的是“schema.Table / View”,而不是“database.schema.table / view”。 此外,我添加了一个“-S”+ @@ SERVERNAME标志 - 这告诉BCP实用程序使用SQL Server当前连接的服务器进行查询。
在T-SQL中生成SELECT-query的CSV文件的正确代码,SQL Server 2008是:
DECLARE @sql VARCHAR(8000);
SELECT @sql = 'bcp "SELECT * FROM FootPrint.datex_footprint.Shipments" queryout "C:\Users\bailey\Desktop\FlatTables\YamotoShipping.csv" -c -t, -T -S' + @@SERVERNAME;
exec master..xp_cmdshell @sql;
所以一旦我添加了“FootPrint”。为了识别数据库,它起了作用。
注意:我正在运行SQL Server 2008 R2。
答案 1 :(得分:0)
我有同样的错误,但我以不同的方式解决了它。 我已将默认数据库添加到我的ID,然后BCP开始在我的默认数据库中查找表并处理这些文件。
答案 2 :(得分:0)
在搜索并阅读了bcp
的文档之后,我发现,当我们复制数据时,我们应该使用GLobal临时表,即##而不是#..,因为在tempdb
中将发生冲突,并且不允许将数据复制到目标文件。
示例:
DECLARE @OutputFilePath nvarchar(max); SET @OutputFilePath = 'C:\OutputData'
DECLARE @ExportSQL nvarchar(max); SET @ExportSQL = N'EXEC xp_cmdshell ''bcp
"SELECT * FROM LW_DFS_DIT.dbo.##Mytemptable " queryout "' + @OutputFilePath +
'\OutputData.txt" -T -c -t '''
EXEC(@ExportSQL)
希望这会有所帮助