【问题标题】:SQL Server 2012 BCP returns bad data with guid parameter in where clauseSQL Server 2012 BCP 在 where 子句中返回带有 guid 参数的错误数据
【发布时间】:2014-03-31 18:22:32
【问题描述】:

我目前正在尝试从 C# 类中运行 bcp 命令。它应该完成从表中抓取二进制数据,然后将其保存到硬盘驱动器。如果我在我的命令之外设置CaseId,我将获得0 kb 的文档保存到我的硬盘驱动器。如果我对CaseId 进行硬编码(我的意思是从我的表中获取一个我知道存在的 Guid 并将其推入bcp 语句),文档将与所有数据一起保存到我的硬盘驱动器中。

此外,我尝试将 CaseId 插入到命令本身中,并使用传递给运行此代码的函数的 Guid,例如:

...cd.DocumentId = d.Id WHERE cd.CaseId = '" + CaseId + "' \"...

这是我的命令,因为它当前位于代码中:

var sql = "";
sql = sql + "DECLARE  @Command       VARCHAR(4000), ";
sql = sql + "@Filename VARCHAR(150), ";
sql = sql + "@DocId uniqueidentifier ";
sql = sql + "DECLARE curDoc CURSOR  FOR  ";
sql = sql + "SELECT ";
sql = sql + "d.Filename, ";
sql = sql + "d.Id ";
sql = sql + "FROM   oregon2.dbo.Doc2 d ";
sql = sql + "JOIN   oregon2.dbo.CaseDocuments cd on cd.DocumentId = d.Id ";
sql = sql + "WHERE  cd.CaseId = @CaseId ";
sql = sql + "OPEN curDoc ";
sql = sql + "FETCH NEXT FROM curDoc ";
sql = sql + "INTO ";
sql = sql + "@Filename, ";
sql = sql + "@DocId ";
sql = sql + "WHILE (@@FETCH_STATUS = 0) ";
sql = sql + "BEGIN ";
sql = sql + "SET @Command = 'bcp \"SELECT d.Content FROM oregon2.dbo.Doc2 d JOIN oregon2.dbo.CaseDocuments cd on cd.DocumentId = d.Id WHERE cd.CaseId = ''@CaseId'' \" queryout \"C:\\temp\\' + convert(varchar(50), @CaseId) + '\\' + convert(varchar(50), @DocId) + '\\' + @Filename + '\" -T -n -S.' ";
sql = sql + "PRINT @Command ";
sql = sql + "EXEC xp_cmdshell @Command ";
sql = sql + "FETCH NEXT FROM curDoc ";
sql = sql + "INTO ";
sql = sql + "@Filename, ";
sql = sql + "@DocId ";
sql = sql + "END ";
sql = sql + "CLOSE curDoc ";
sql = sql + "DEALLOCATE curDoc ";

我正在运行 Visual Studio 2012 和 SQL Server 2012。

任何帮助将不胜感激。拔毛即将开始。

【问题讨论】:

  • 确实知道你可以把它写成string sql = @"....."然后有你的整个语句,甚至分布在多行 - 在那些双引号?!?!?!这将 (a) 更容易 阅读,并且 (b) 将防止每次添加另一行时分配新字符串SQL 到您现有的sql .....
  • 感谢您的意见。是的,我确实知道这一点——以前是这样写的。无论出于何种原因,在我像这样写出来之前,我都无法在 bcp 命令中获得正确的语法。
  • "PRINT @Command " 语句的输出是什么?您是否尝试过捕获它然后自己从 DOS 执行它?这将是我的下一步。
  • 输入行太长:/

标签: sql sql-server-2012 guid bcp


【解决方案1】:

如果有人想知道这里是最终代码,工作代码:

            var sql = "";
            sql = sql + "DECLARE  @Command       VARCHAR(4000), ";
            sql = sql + "@Filename VARCHAR(150), ";
            sql = sql + "@DocId uniqueidentifier ";
            sql = sql + "DECLARE curDoc CURSOR  FOR  ";
            sql = sql + "SELECT ";
            sql = sql + "d.Filename, ";
            sql = sql + "d.Id ";
            sql = sql + "FROM   oregon2.dbo.Doc2 d ";
            sql = sql + "JOIN   oregon2.dbo.CaseDocuments cd on cd.DocumentId = d.Id ";
            sql = sql + "WHERE  cd.CaseId = @CaseId ";
            sql = sql + "OPEN curDoc ";
            sql = sql + "FETCH NEXT FROM curDoc ";
            sql = sql + "INTO ";
            sql = sql + "@Filename, ";
            sql = sql + "@DocId ";
            sql = sql + "WHILE (@@FETCH_STATUS = 0) ";
            sql = sql + "BEGIN ";
            sql = sql + "SET @Command = 'bcp \"SELECT d.Content FROM oregon2.dbo.Doc2 d JOIN oregon2.dbo.CaseDocuments cd on cd.DocumentId = d.Id WHERE cd.CaseId = '''+ convert(varchar(50), @CaseId) +''' \" queryout \"C:\\temp\\' + convert(varchar(50), @CaseId) + '\\' + convert(varchar(50), @DocId) + '\\' + @Filename + '\" -T -n -S.' ";
            sql = sql + "PRINT @Command ";
            sql = sql + "EXEC xp_cmdshell @Command ";
            sql = sql + "FETCH NEXT FROM curDoc ";
            sql = sql + "INTO ";
            sql = sql + "@Filename, ";
            sql = sql + "@DocId ";
            sql = sql + "END ";
            sql = sql + "CLOSE curDoc ";
            sql = sql + "DEALLOCATE curDoc ";

需要一个额外的转义例程,还需要在我的 CaseId 上转换为 varchar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多