Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 直接传递值时引发转换错误_Sql_Sql Server_Tsql - Fatal编程技术网

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'
当然,一定要检查数据类型

同样在dynamicSQL查询中,
@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