2

我一直在尝试获取大型和多重连接的 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] Invalid object name 'datex_footprint.Shipments'。”

我 100% 肯定 datex_footprint.Shipments 是我要测试的数据的正确模式\表访问。

有没有人看到我在尝试将此结果导出到 CSV 文件时遗漏了什么或做错了什么?不过,具体来说,我正在尝试自动化这个过程。我知道如何将结果导出到 CSV 文件中,但我想在 T-SQL 中完成,这样我就可以按时间自动生成文件。

任何帮助,将不胜感激!

4

3 回答 3

3

[解决了]

我弄清楚我做错了什么。我没有以完整的形式识别视图。我使用的是“schema.Table/View”,而不是“database.schema.table/view”。另外,我添加了一个“-S”+@@SERVERNAME 标志——这告诉 BCP 实用程序使用 SQL Server 当前连接到的服务器进行查询。

在 T-SQL、SQL Server 2008 中生成 SELECT 查询结果的 CSV 文件的正确代码是:

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;

所以一旦我添加了“足迹”。为了识别数据库,它起作用了。

注意:我正在运行 SQL Server 2008 R2。

于 2012-09-26T15:45:07.457 回答
0

我遇到了同样的错误,但我以不同的方式解决了它。我已将默认数据库添加到我的 ID,然后 BCP 开始在我的默认数据库中查找表并处理文件。

于 2016-04-26T14:22:39.503 回答
0

在搜索和阅读文档后bcp,我发现当我们复制数据时,我们应该使用全球临时表,即 ## 而不是 #.. 因为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)

希望这会有所帮助

于 2020-08-12T16:17:40.943 回答