Sql 直接传递值时引发转换错误
此代码在直接传递值时抛出错误,但如果使用参数传递值,则不会显示任何错误 --它抛出了一个错误Sql 直接传递值时引发转换错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,此代码在直接传递值时抛出错误,但如果使用参数传递值,则不会显示任何错误 --它抛出了一个错误 DECLARE @sql NVARCHAR(4000) DECLARE @ID INT=1234 SET @sql = N'select [count] FROM dbo.Table_1 AS t JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
DECLARE @sql NVARCHAR(4000)
DECLARE @ID INT=1234
SET @sql = N'select
[count]
FROM dbo.Table_1 AS t
JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
AND t2.[year] = 17
AND t2.week_of_year = 6
AND t2.day_of_week = 2
WHERE t.RC_ID = @ID'
EXEC sp_executesql @sql
--它抛出了一个错误
select
[count]
FROM dbo.Table_1 AS t
JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
AND t2.[year] = 17
AND t2.week_of_year = 6
AND t2.day_of_week = 2
WHERE t.ID = 1234
-- IT WORKS
DECLARE @sql
DECLARE @ID INT
SET @ID = 1234
select
[count]
FROM dbo.Table_1 AS t
JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
AND t2.[year] = 17
AND t2.week_of_year = 6
AND t2.day_of_week = 2
WHERE t.ID = @ID
错误是:
转换时,Msg 245,16级,状态1,第1行转换失败
将varchar值“TEST”设置为数据类型int
但表中没有类似“Test”的数据。作为整数比较的一个值包含错误值:
select t2.*
from table_2 t2
where try_convert(int, year) is null or try_convert(int, week_of_year) is null or
try_convert(int, day_of_week) or try_convert(int, id) is null;
错误是否发生取决于执行计划。正在筛选的表列之一不是数字数据类型。当你这样做的时候
WHERE VarcharColumn = 1
SQL Server引擎将始终尝试将最复杂的类型转换为最简单的类型,在这种情况下,“1”是一个整数,而VarcharColumn是VARCHAR
,因此引擎将尝试将存储在VarcharColumn中的所有值转换为整数,然后再按值1进行筛选。由于存储的至少一个值不是整数(“TEST”),因此转换失败并弹出该消息
您有两种解决方案:
- 验证并修复这些列中的所有值,使它们实际上是数字,并将数据类型更改为相应的数据类型
- 与同一类型进行比较<代码>其中列='1'
@ID
的声明必须在脚本中(它还缺少初始值)
出现“有时”错误的原因是因为语句的不同形式使执行计划按不同的顺序执行。如果它首先尝试将varchar值转换为int,则会失败。如果它尝试将int值转换为varchar(例如),则不会失败
要查找问题,请尝试以下操作:
SELECT
*
FROM
dbo.Table_1 AS T
WHERE
CONVERT(VARCHAR(200), T.store_number) = 'Test' OR
CONVERT(VARCHAR(200), T.ID) = 'Test'
SELECT
*
FROM
dbo.table_2 AS T
WHERE
CONVERT(VARCHAR(200), T.store_number) = 'Test' OR
CONVERT(VARCHAR(200), T.[year]) = 'Test' OR
CONVERT(VARCHAR(200), T.week_of_year) = 'Test' OR
CONVERT(VARCHAR(200), T.day_of_week) = 'Test'
从我看到的情况来看,您试图在sp_executeSQL中使用一个参数(@id),而从不传递它。一个快速解决办法就是做类似的事情
DECLARE @sql NVARCHAR(4000)
DECLARE @ID INT = 10
SET @sql = N'select
[count]
FROM dbo.Table_1 AS t
JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
AND t2.[year] = 17
AND t2.week_of_year = 6
AND t2.day_of_week = 2
WHERE t.RC_ID = ' + cast(@ID as nvarchar(20))
EXEC sp_executesql @sql
希望这能有所帮助SQL Server不会仅仅是编造数据。如果它告诉您它在将值
TEST
转换为整数时遇到问题,那么该数据将在其中的某个位置。不要假设任何过滤器等都是按任何特定顺序执行的。你会在表格的某个地方找到数据。@Damien_不相信你是对的,我们找到了数据。。。。从视图表来看,表_1是视图表,其中包含值“Test”,非常感谢,这是我的错误,但它显示了相同的错误。Hai@Ezequiel,谢谢你的回答,如果你阅读我的问题两遍,你会得到更多的澄清,因为当我将值作为参数传递时,它不会显示任何错误,为什么?@ParvathiRajan原因在于不同的执行计划。对于我们的开发人员来说,这似乎是一样的,但是当一个值被硬编码时,引擎的工作或访问数据的方式可能与通过参数传递时不同。这就是我试图用“原因…”一段来解释的
DECLARE @sql NVARCHAR(4000)
DECLARE @ID INT = 10
SET @sql = N'select
[count]
FROM dbo.Table_1 AS t
JOIN dbo.table_2 AS t2 ON t.store_number = t2.store_number
AND t2.[year] = 17
AND t2.week_of_year = 6
AND t2.day_of_week = 2
WHERE t.RC_ID = ' + cast(@ID as nvarchar(20))
EXEC sp_executesql @sql