我需要编写一个批处理文件,将SQLCMD的输出传递给一个应用程序,该应用程序将修改SQLCMD正在读取的表:
sqlcmd -E -h-1 -S . -d Database -i Script.sql|ModifyApplication.exe
不幸的是,上面的命令确实遇到死锁。所以我将批处理脚本修改为:
sqlcmd -E -h-1 -S . -d Database -i Script.sql>tmp.txt
type tmp.txt|ModifyApplication.exe
这很有效 - 但它很难看,因为它需要写入文件系统,如果由于某种原因SQLCMD无法写入文件,那么上一次运行的旧文件将通过管道传输到ModifyApplication.exe 撞击>
如果我可以将sqlcmd中的所有数据缓冲到内存中,然后再将它连接到ModifyApplication.exe,那将是理想的:
sqlcmd -E -h-1 -S . -d Database -i Script.sql|Buffer.exe|ModifyApplication.exe
Windows中是否有类似“Buffer.exe”的命令?
答案 0 :(得分:1)
您可以尝试我的PIPE.COM计划。以这种方式创建:
@ECHO off
if not exist pipe.com call :DefinePipe
sqlcmd -E -h-1 -S . -d Database -i Script.sql|pipe|ModifyApplication.exe
goto :EOF
:DefinePipe
setlocal DisableDelayedExpansion
set pipe=´)€ì!Í!ŠÐŠà€Ä!€ü.t2€ü+u!:æu8²A€ê!´#€ì!Í!².€ê!´#€ì!Í!²+€ê!´#€ì!Í!Šò€Æ!´,€ì!Í!"Àu°´LÍ!ëÒ
setlocal EnableDelayedExpansion
echo !pipe!>pipe.com
exit /B
你必须知道我的PIPE.COM在空行中插入一个空格。但是,如果您不需要,我可以修改该行为。
编辑:添加了源代码,由Martin提出
下面的批处理文件创建了一个更简单的PIPE.COM版本,它不检查空行:
(
echo A100
echo mov ah,8 ;AH = CONSOLE_INPUT_WITHOUT_ECHO
echo int 21H ;get next char. in AL
echo mov dl,al ;pass it to DL
echo mov ah,2 ;AH = VIDEO_OUTPUT
echo int 21H ;show the char. in the screen
echo mov ah,0B ;AH = CHECK_KEYBOARD_STATUS
echo int 21H ;get key status in AL: 0=no more keys
echo cmp al,0 ;is there another key?
echo jne 100 ;yes: go back for it
echo mov ah,4C ;AH = TERMINATE_PROGRAM
echo int 21H ;terminate this program
echo/
echo RCX
echo 16
echo W
echo Q
) | DEBUG PIPE.COM
要获得有关DEBUG使用的基本帮助,请输入DEBUG吗?然后问:如果你没有DEBUG.COM程序,你可以从this site
获得它答案 1 :(得分:0)
没有这样的标准实用程序。你应该写一个,创建它是一件相当简单的事情。
答案 2 :(得分:0)
正如nos所建议我写了一篇:
using System;
using System.Collections.Generic;
namespace Buffer
{
class Program
{
static void Main(string[] args)
{
foreach(string line in new List<string>(GetLines()))
{
Console.WriteLine(line);
}
}
static IEnumerable<string> GetLines()
{
string line;
while (!string.IsNullOrEmpty(line = Console.ReadLine()))
{
yield return line;
}
}
}
}
答案 3 :(得分:0)
即使sqlcmd“无法写入文件系统”,>
运算符也会删除之前的tmp.txt,因此不会重复使用“之前运行的旧文件”。但是,您始终可以通过在执行sqlcmd之前插入del tmp.txt
命令来确保不会出现这种情况。