Cmd Isql Less 运算符

Cmd Isql Less Operator

我有一个 firebird 数据库,我正在尝试做一些事情。当我尝试这个命令时它不起作用。

echo DELETE FROM TXN WHERE SALESBEGIN < current_date - 2;" | isql -u sysdba -p masterkey localhost:C:\aaa.fdb

SALESBEGIN 列的类型为 DATETIME

但是当我删除“<”运算符时它的工作。我该如何解决?这是输出;

    C:\Program Files (x86)\Firebird\Firebird_2_0\bin>echo "DELETE FROM TXN 
    WHERE SALESBEGIN < current_date - 2;" | isql -u sysdba -p masterkey 
    localhost:C:\aaa.fdb
    Database:  localhost:C:\aaa.fdb, User: sysdba
    SQL> CON> Expected end of statement, encountered EOF

问题是 <,它是命令行的重定向字符。您需要使用 ^ 转义它。

然而,根据 this site

When a pipe is used, the expressions are parsed twice. First when the expression before the pipe is executed and a second time when the expression after the pipe is executed. So to escape any characters in the second expression double escaping is needed

因此您需要三个 ^ 个字符来转义 < 符号:

echo DELETE FROM TXN WHERE SALESBEGIN ^^^< current_date - 2; | isql -u sysdba -p masterkey localhost:C:\aaa.fdb

根据我的经验,如果您只是将语句放入 SQL 脚本,然后 运行 该脚本,这样的事情会 容易得多 。在 isql 中是 isql -i delete.sql

如果您仍想将所有内容保存在一个批处理文件中,您可以这样做:

echo DELETE FROM TXN WHERE SALESBEGIN ^< current_date - 2;> _temp_delete.sql 
isql -i _temp_delete.sql -u sysdba -p masterkey localhost:C:\aaa.fdb

您仍然需要转义那里的 < 但只需转义一次,因为不涉及 |


有关如何在 Windows 命令行或批处理脚本中转义特殊字符的详细信息,另请参阅 Batch character escaping