Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将参数从UNIX脚本传递到SQL文件?_Sql_Sql Server_Unix_Parameters_Parameter Passing - Fatal编程技术网

如何将参数从UNIX脚本传递到SQL文件?

如何将参数从UNIX脚本传递到SQL文件?,sql,sql-server,unix,parameters,parameter-passing,Sql,Sql Server,Unix,Parameters,Parameter Passing,我希望将参数从UNIX脚本传递到SQL文件中。不幸的是,它有问题 请参阅下面的UNIX脚本: #!/bin/ksh ############ # Functions _usage() { SCRIPT_NAME=XXX -eq 1 -o "$1" = "" -o "$1" = help -o "$1" = Help -o "$1" = HELP ]; then echo "Usage: $SCRIPT_NAME [ cCode ]" echo " - For examp

我希望将参数从UNIX脚本传递到SQL文件中。不幸的是,它有问题

请参阅下面的UNIX脚本:

#!/bin/ksh
############

# Functions
_usage() {
SCRIPT_NAME=XXX
    -eq 1 -o "$1" = "" -o "$1" = help -o "$1" = Help -o "$1" = HELP ]; then
    echo "Usage: $SCRIPT_NAME [ cCode ]"
    echo " - For example : $SCRIPT_NAME GH\n"
    exit 1
fi
}

_initialise() {
cCode=$1
echo $cCode
}

# Set Variables
_usage $@
_initialise $1

# Main Processing
sql $DBNAME < test.sql $cCode > $PVNUM_LOGFILE
RETCODE=$?
# Check for errors within log file
if [[ $RETCODE != 0 ]] || grep 'E_' $PVNUM_LOGFILE
    then
    echo "Error - 50 - running test.sql. Please see $PVNUM_LOGFILE"
    exit 50
fi
运行UNIX脚本时收到的错误是:

INGRES TERMINAL MONITOR Copyright 2008 Ingres Corporation
E_US0022 Either the flag format or one of the flags is incorrect,
    or the parameters are not in proper order.
有人知道我做错了什么吗


谢谢

注意:虽然我不使用
sql
命令,但在使用
isql
命令行工具时,我会定期将UNIX参数传递到sql模板/脚本文件中,因此fwiw

您要做的第一件事是用
cCode
变量中的值替换
&1
字符串;一种典型的方法是使用
sed
进行全局搜索,并用
${cCode}
替换
&1
,例如:

$ cCode=XYZ
$ sed "s/\&1/${cCode}/g" test.sql

SELECT DISTINCT v1.*
FROM data_latest v1
JOIN temp_table t
ON v1.number = t.id
WHERE v1.code = 'XYZ'    <=== &1 replaced with XYZ

您可能需要在文本文件中的SQL周围加上“\p\g”

我个人倾向于将SQL编码到脚本本身,如

#!/bin/ksh

var=01.01.2018
db=database_name
OUTLOG=/path/log.txt

sql $db <<_END_ > $OUTLOG
    set autocommit on;
    \p\g
    set lockmode session where readlock = nolock;
    \p\g
    SELECT *
    FROM table
    WHERE date > '${var}' ; 
    \p\g
_END_

exit 0
#/bin/ksh
var=01.01.2018
db=数据库名称
OUTLOG=/path/log.txt
sql$db'${var}';
\p\g
_结束_
出口0

@mathB重定向符号($PVNUM\u日志文件)。不确定这是否是问题所在?我不熟悉该错误,您是否以正确的格式传递参数?请尝试以下操作:在您的SQL文件
test.SQL
,将
'&1'
更改为
'VaLuE'
,在执行SQL之前,插入以下命令:
sed's/VaLuE/$cCode/'/full/path/to/test.SQL
,并在主数据库中插入此命令处理,删除
$cCode
并直接发送SQL文件。
sed "s/\&1/${cCode}/g" test.sql | sql $DBNAME > $PVNUM_LOGFILE
#!/bin/ksh

var=01.01.2018
db=database_name
OUTLOG=/path/log.txt

sql $db <<_END_ > $OUTLOG
    set autocommit on;
    \p\g
    set lockmode session where readlock = nolock;
    \p\g
    SELECT *
    FROM table
    WHERE date > '${var}' ; 
    \p\g
_END_

exit 0