2

我编写了一个构建文件,它在某些时候将对象安装到 Sybase 数据库中。

代码由我们的开发人员提供,我不允许修改它。isql如果使用命令手动运行给定的 SQL ,它可以工作。

这是安装给定对象的构建文件的一部分:

<sql
    driver="${db.driver}" url="${db.url}" userid="${db.user}"
    password="${db.password}" src="${file}"
    print="true" delimiter="go" delimitertype="row"
    classpathref="sybase.lib.path" output="${file}.out"
    errorproperty="install.failed" onerror="continue" keepformat="true" />

尽管该解决方案在大多数情况下都有效,但每次我尝试运行包含双引号 (") 的脚本时都会失败。

例如,如果 SQL 脚本包含如下内容:

declare @var varchar(30)
set @var = "SOME STRINGS"

它失败并出现错误:

[sql] com.sybase.jdbc3.jdbc.SybSQLException: Invalid column name 'SOME STRINGS'.

有人解决了这个问题吗?

我已阅读Antsql任务的文档。我正在使用 Ant 1.8.2 版。

我已经使用以下 jdbc 驱动程序进行了测试:

  • com.sybase.jdbc3.jdbc.SybDriver
  • net.sourceforge.jtds.jdbc.Driver
4

1 回答 1

0

建立会话后,默认情况下它的设置 QUOTED_IDENTIFIER 设置为 true。我相信您可以使用服务器设置进行调整,但无论如何,您可以通过将其附加到 url 来设置会话:

?SQLINITSTRING=set quoted_identifier off

所以网址可能看起来像:

"jdbc:sybase:Tds:<server>:<port>/<db>?SQLINITSTRING=set quoted_identifier off"

如果您有多个设置,请使用 & 符号加入它们&。另

引用标识符

确定 Adaptive Server 是否识别双引号内的定界标识符。默认情况下,quoted_identifier 是关闭的,所有标识符必须:

  • 符合有效标识符的规则。

  • 用括号括起来。

如果您使用 setquoted_identifier on,双引号的行为方式与括号的行为方式相同,并且您可以使用以非字母字符开头的表、视图和列名称,包括在其他情况下不允许使用的字符或保留字,方法是将其括起来双引号内的标识符。分隔标识符不能超过 28 字节,可能并非所有前端产品都能识别,并且在用作系统过程的参数时可能会产生意想不到的结果。

当quoted_identifier 打开时,双引号内的所有字符串都被视为标识符。在字符或二进制字符串周围使用单引号。

于 2012-08-30T19:36:42.040 回答