我有一个复杂的批处理脚本,涉及多个BCP命令,可以使用平面文件数据加载SQL Server。我正在使用分支语句将命令的结果记录到日志文件中。这一切都很好。
结果也会在SQL表中记录为成功或失败。我想要做的是,在失败时,使用我认为的简单重定向将日志文件的内容插入到SQL日志表中。它不起作用。
以下是我在Win Server 2012环境中的批处理文件中所做的事情:
BCP (the parameters here don't matter) >> %LogFile% (
MOVE %FileName% to Archive/%FileName%
sqlcmd -E -Q "EXEC spImportLog 'SUCCESS', %FileName%, ''
) || (
SET /p LogText=<%LogFile%
sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, %LogText%
)
此代码执行时没有错误。声明的真实部分运作正常。 假部分执行正常,但我最终得到空字符串而不是 %LogText%的内容。
当我从命令提示符运行它时,SET看起来像这样:
SET / p LogText&lt; 0Log_2016_9_23.log
%LogFile%是一个变量,因为它是根据今天的日期在运行时动态命名的。我不知道低于标志后的0来自何处,或者它是否是我问题的根源。有什么想法吗?
答案 0 :(得分:0)
YADXP。
SET /p LogText=<%LogFile%
setlocal enabledelayedexpansion
sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText!
endlocal
应该有效。查看关于&#34;延迟扩展&#34;
的十亿左右的SO条目正如我所说,set /p var=<filename
将从文件的第一个行设置变量。由于文件累积值并且最初sset只包含一行(AAUI)&#39;无&#39;然后 是将从文件中读取的值。
尝试
for /f "usebackqdelims=" %%a in ("%LogFile%") do set "logtext=%%a"
setlocal enabledelayedexpansion
sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText!
endlocal
应该读取%logfile%
的每一行并依次分配logtest
值(每行的值),这样当for
终止时,logtext
将会有文件的最后行的值。
答案 1 :(得分:0)
好的,谢谢你的帖子。它听起来不像我想做的事情是可能的。至少不是我试图这样做的方式。我想要的是将%LogFile%的全部内容作为文本流存储在变量中,然后将该文本流插入SQL Server中的varchar列。回想起来,我在最初的帖子中对我正试图解决的问题不够清楚。我知道我可以将命令结果(多行)存储在SQL Server的临时表中。它只需要使用xp_cmdshell,我希望避免使用它。