【问题标题】:xp_cmdshell Native Error 208, BCP in SQL Server 2008 R2xp_cmdshell 本机错误 208,SQL Server 2008 R2 中的 BCP
【发布时间】:2012-09-17 05:00:42
【问题描述】:

我一直在尝试获取大型多连接 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 中执行此操作,以便可以按时间自动生成文件。

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server-2008-r2 bcp xp-cmdshell


    【解决方案1】:

    在搜索和阅读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)
    

    希望这会有所帮助

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多