如何将双引号中的路径传递给sql文件

Posted

技术标签:

【中文标题】如何将双引号中的路径传递给sql文件【英文标题】:How to pass path in double quotes to sql file 【发布时间】:2013-12-28 12:40:28 【问题描述】:

我想将当前的批处理文件路径传递给 sqlplus 将调用的 sql 文件,并将结果假脱机到该路径中。我的代码如下。它在假脱机线上失败,因为路径没有用双引号传递。你能帮帮我吗

启动 sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

在设置sql中,我给出了下面一行

假脱机 &1

【问题讨论】:

“sqlplus”是 exe 文件还是批处理文件? 【参考方案1】:

快速猜测:

start "" sqlplus....

现在好了!有一个有趣的练习。

start "" sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

start 的“引用参数”问题的标准解决方案。第一个"quoted string" 被指定为窗口的标题——这就是正常的抱怨。插入明显冗余的空字符串不会为窗口提供标题 - 它实际上是“这是我想要的窗口标题”的最简单形式 - 并且更容易键入。

我没有时间以任何方式对此进行测试,这就是我建议它作为猜测的原因。我尝试了一个名为sqlplus.bat 的批处理文件,它只显示了它的参数:

@echo off
setlocal
echo @~nx0 received ==^>%*^<==
pause
exit

但这似乎按预期传达了所有论点。

所以由于sqlplus 是一个可执行文件,我想我会安装它并尝试。呃 - 至少 33Mb,以及所有合法的登录和密码以及另一个我只会使用一次的帐户......不。

所以我在 Delphi 中构建了自己的 sqlplus.exe - 只需评估命令行参数。三十秒的工作。

问题是我无法使用声称按位置返回参数的函数让可执行文件在参数中显示引号。所以我不得不调查。我发现了一个函数来返回提供的整个命令行 - 并且有引号,大如生命。

原来有一个 Delphi 错误,其中paramstr(x) 从为参数 x 返回的值中删除了封闭引号。向 EMBT 报告。

并重新测试,使用我构建的可执行文件 - 显示命令行本身(cmdline,如果你有兴趣) - 好吧,在这个问题的上下文中是个坏消息 - 我的测试表明

start sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

start "" sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

两者都提供相同的命令行 - 包括所写的引号。

所以 - 似乎问题出在sqlplussqlplus 执行的指令上。引用的字符串似乎可以很好地传递给可执行文件。

假设OP执行

sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

(替换适当的参数后) - 这是否按预期显示引号? (这个问题真的是一个SQLPLUS 的问题和这个标签的题外话。我不知道sqlplus


附加(嗯,确实是评论,但它不太适合评论系统...)我相信我们遇到了语言或术语问题...

sqlplus %DBUName%/%DBPwd%@%GISName% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"

当使用该语法(但将%dbuName% 等替换为实际名称)直接从命令提示符执行时是否正确运行?

【讨论】:

这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 No.. 我想用双引号传递路径“%~dp0Config\SETUP.ok”。当我使用上面的代码时,在 sql 文件中它看起来像 SPOOL Z:\Test folder\test folder 1\SETUP.ok 但我希望代码应该传递像 SPOOL "Z:\Test folder\test folder 1\ 这样的值SETUP.ok" @RaulRene 这有点奇怪,但我想这确实是答案,因为start 有带引号的特殊规则。第一个引号在这里作为窗口标题处理 @jeb:第一个引号你的意思是“@%~dp0SQL\SetUp\SETUP.sql”??这是我的sql放置的路径 @RaulRene :既然您表现出兴趣 - 我不确定您是否会收到更新通知...【参考方案2】:

我不确定,你需要什么。您需要 more 引号还是 no 引号。任何- 你可以有尽可能多的报价。我没有sqlplus,但没那么重要。我可以用 'calc.exe` 给你看这个:

我认为,这不是 cmd/Batch 问题。它属于你的sqlplus

@ECHO OFF &SETLOCAL
title Test of Quotes
set dbuname=dbuname
set DBPwd=DBPwd
set gisname=gisname

start calc %dbuname%/%DBPwd%@%gisname% @%~dp0SQL\SetUp\SETUP.sql %~dp0Config\SETUP.ok
start calc %dbuname%/%DBPwd%@%gisname% @%~dp0SQL\SetUp\SETUP.sql "%~dp0Config\SETUP.ok"
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" %~dp0Config\SETUP.ok
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" "%~dp0Config\SETUP.ok"
start calc %dbuname%/%DBPwd%@%gisname% "@%~dp0SQL\SetUp\SETUP.sql" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% ""@%~dp0SQL\SetUp\SETUP.sql"" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% """@%~dp0SQL\SetUp\SETUP.sql""" ""%~dp0Config\SETUP.ok""
start calc %dbuname%/%DBPwd%@%gisname% """@%~dp0SQL\SetUp\SETUP.sql""" """%~dp0Config\SETUP.ok"""

ping -n 3 localhost > nul

wmic process where name='calc.exe' get commandline

【讨论】:

问题不在批处理文件中,而是 sqlplus 存在截断双引号的问题。当批处理文件使用双引号传递参数时,sqlplus 会忽略该双引号。因此,如果您帮助我如何将文件假脱机到正在通过批处理文件的路径,那将是很大的帮助 抱歉,我不知道你说的. Hence if u help how to spool a file to the path which am passing through batch file是什么意思。 我的意思是,如果您帮助我们提取通过 sql 查询运行并存储在我作为参数传递的路径中的 sql 查询的结果,那么这将对我有帮助

以上是关于如何将双引号中的路径传递给sql文件的主要内容,如果未能解决你的问题,请参考以下文章

将双引号添加到列中的值,只要值在数据框中有引号

关于JS替换双引号

Excel vba替换双引号怎么写?

如何将双引号 ( " ) 插入 SQLite 数据库 Varchar 字段?

如何将双引号字符串与字符进行比较?

Python MySQLdb 将双引号改为单引号