将 varchar 值 '43302001-8' 转换为数据类型 int 时转换失败



当我尝试执行以下命令时:

DECLARE @sqlText nvarchar(1000); 
SET @sqlText = N'SELECT TOP ' + CAST((:intValue) AS VARCHAR(20)) +  't_stamp, PART_NUM, ' + :Column  + ' FROM dbo.press_7_recipes_log WHERE PART_NUM = ' + CAST(:text AS VARCHAR(20))
Exec (@sqlText)

我得到以下内容

错误:com.microsoft.sqlserver.jdbc。SQLServerException:将varchar值"43302001-8"转换为数据类型int时,转换失败。

任何帮助将不胜感激,不确定这里还需要什么。

:intValue类型为int4
:文本类型为字符串
:列类型为字符串(这是从数据库中提取指定列,为什么我认为这需要是一个动态查询)

多次尝试在谷歌上搜索问题并更改命令,结果相同。如果我将where中的PART_NUM更改为int类型的列,则代码可以正常工作,任何与字符串相关的列都不能。

问题是,在你的准备之后,查询变成:SELECT TOP 666 t_stamp, PART_NUM, ANOTHER_COLUMN FROM dbo。press_7_recipes_log WHERE PART_NUM = 43302001-8

并且由于43302001-8是INTEGER=43301993, SQL Server将PART_NUM列转换为INT,这不起作用,因为它可能包含非整数。

你需要把你的动态查询改成这样:

DECLARE @sqlText nvarchar(1000); 
SET @sqlText = N'SELECT TOP ' + CAST((:intValue) AS VARCHAR(20)) +  't_stamp, PART_NUM, ' + :Column  + ' FROM dbo.press_7_recipes_log WHERE PART_NUM = ''' + REPLACE(CAST(:text AS VARCHAR(20)), '''', '''''') + ''''
Exec (@sqlText)

这将把WHERE改为:PART_NUM = '43302001-8'

但是正如其他人注意到的,这里有很多SQL注入的可能性。所以我可能会去掉这段代码并重写它以避免动态SQL

最新更新