SQL Server 2012 BCP在where子句中返回guid参数为的错误数据

SQL Server 2012 BCP在where子句中返回guid参数为的错误数据,sql,sql-server-2012,guid,bcp,Sql,Sql Server 2012,Guid,Bcp,我目前正在尝试从C#类中运行bcp命令。它应该完成从表中获取二进制数据,然后将其保存到硬盘驱动器。如果我在命令之外设置CaseId,我将获得保存到硬盘的0 kb文档。如果我硬编码CaseId(我的意思是从我的表中获取一个我知道存在的Guid,并将其放入bcp语句),文档将与其所有数据一起保存到我的硬盘上 此外,我还尝试将CaseId插入命令本身,并将Guid传递到运行此代码的函数中,例如: ...cd.DocumentId = d.Id WHERE cd.CaseId = '" + CaseId

我目前正在尝试从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


任何帮助都将不胜感激。头发拉扯即将开始。

对于任何想知道这里是最终代码的人来说,工作代码:

            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。

你知道你可以将它写成
string sql=@“…”
,然后将整个语句,甚至分散在多行上-在那些双引号内?!?!?!这将(a)更易于阅读,(b)防止每次向现有的
SQL
添加另一行SQL时分配新字符串……感谢您的输入。是的,我确实知道这一点——以前也是这样写的。不管出于什么原因,在我像这样写出bcp命令之前,我无法在bcp命令中获得正确的语法。
“PRINT@command”
语句的输出是什么?你有没有试过捕获它,然后自己从DOS执行它?这将是我的下一步。输入行太长:/