【发布时间】: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