【问题标题】:jooq - select removes varchar length information of castjooq - 选择删除演员表的 varchar 长度信息
【发布时间】:2015-07-30 04:10:40
【问题描述】:

调用此代码时

DSLContext dslContext = DSL.using(SQLDialect.SQLSERVER);
dslContext.select(DSL.cast(field, SQLDataType.VARCHAR.length(255)));

select 语句去掉了varchar 长度的信息。 DSL.cast() 方法返回cast("fieldName" as varchar(255)),select 返回select cast("fieldName" as varchar)

问题在于,在 SQLServer 中,没有长度信息的强制转换会在 30 个字符后切割结果,这被描述为here。这很烦人,因为我的值超过 30 个字符。那么有没有人知道我如何获得一个看起来像这样select cast("fieldName" as varchar(255)) 的选择语句?

【问题讨论】:

标签: sql sql-server casting varchar jooq


【解决方案1】:

DataType 的长度、精度和比例信息仅在 jOOQ 3.0 中引入,尽管这些信息直到 jOOQ 3.2 (issue #2708) 才在 CAST() 表达式中使用:

最新版本的jOOQ正确渲染

cast([fieldName] as varchar(255))

所以,我建议升级到最新版本。

此外,如果您的版本/用法生成cast("fieldName" as varchar),我怀疑您也可能传递了错误的SQLDialect(而不是SQLSERVER)。使用SQLSERVER 方言,标识符是使用[brackets] 生成的,不像其他方言使用"double quotes" 作为标识符...

【讨论】:

  • 谢谢。你是对的,这是 SQLServer 使用括号的语法。我尝试过不同的方言——它们的行为都一样——所以我把这个例子弄混了。
  • @Simone:好的,只是想确定一下方言 :) 那么升级对你有用吗?
  • 是的。顺便说一句,如果字段有一个带长度的 varchar,强制转换表达式在 concat 表达式中的行为如何?像这样的 DSL.concat(DELIM, table.val)
  • @Simone:嗯,那个例子中的演员在哪里?顺便说一句:您可以使用像 `code` 这样的反引号来分隔 Stack Overflow 上的代码 :)
  • 类似这样的 Field DELIM = inline("\""); DSL.concat(DELIM, table.val, DELIM); 其中 table.val 的类型是 VARCHAR(4000)?是 table.val 强制转换,因为它是 VARCHAR(4000) 类型而不是 VARCHAR 类型?
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2021-05-06
相关资源
最近更新 更多