gpt4 book ai didi

java - 即使准备好的语句中没有记录匹配子句,sql 请求也会因隐式转换而失败

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:06 25 4
gpt4 key购买 nike

我非常喜欢 StackOverFlow,因为我经常找到问题的解决方案。但今天我迷路了,需要你的帮助。我为我糟糕的英语道歉。

我有一个 Spring Batch 软件,可以查询 SQL Server 数据库。为此,我们使用准备好的语句:

select linkcode, cmpcode, doccode, docnum, doclinenum, usrref1 from oas_linkline  where linkcode in ( ? , ? ) and usrref1 is not null and usrref1 <> 0 

事实上 usrref1 是一个 varchar,因此进行了隐式转换。在我们的例子中,与子句 < linkcode in (?, ?) > 匹配的每个记录都应该有一个带有数值的 usrref1 ,所以这应该不是问题。

但是有一种情况是有问题的。当没有记录匹配 < linkcode in (?, ?) > 时。 DBMS 返回以下错误:

nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting the varchar value '00000U20IGRI' to data type int.

值“00000U20IGRI”涉及来自其他链接代码的记录...

如果我直接使用具有任意链接代码值(例如 A 和 B)的 Squirrel 请求:

select linkcode, cmpcode, doccode, docnum, doclinenum, usrref1 from oas_linkline  where linkcode in ( 'A' , 'B' ) and usrref1 is not null and usrref1 <> 0 

没问题,DBMS 不返回任何内容,但不返回错误。

如果我在代码中的 org.springframework.batch.item.database.JdbcCursorItemReader 中使用相同的请求,则相同,没问题。

如果我用 ? 参数化请求并使用 org.springframework.jdbc.core.PreparedStatementSetter 设置值,嘭!大错误。就好像子句 < linkcode in (?, ?) > 已从请求中删除。

有人有关于这个特定问题的信息吗?感谢您的关注。

最佳答案

where 子句或 join 条件中依赖隐式转换时,必须小心。如果您使用隐式转换,它需要对表中的所有记录都有效,否则您的查询可能会失败,具体取决于所选的执行计划。我遇到过这样的情况:查询已经运行了多年,但突然开始失败,因为优化器选择了不同的执行计划。结果,它开始扫描不同的记录(即使这些记录与任何 joinwhere 条件都不匹配)并且隐式转换失败。您可以通过使用显式强制转换来解决此问题。

关于java - 即使准备好的语句中没有记录匹配子句,sql 请求也会因隐式转换而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com