相关疑难解决方法(0)

触发此警告的原因:表达式中的类型转换可能会影响查询计划选择中的“CardinalityEstimate”

使用 SQL Server 2016 我试图理解为什么我在运行这个 T-SQL 语句时收到这个警告(我选择了表变量以便于测试。这发生在具有int类型列的数据库表中):

declare @test as table(
    col1 int
)

insert into @test (col1)
values(30500600)

select LEFT(test.col1, 2)
from @test as test
Run Code Online (Sandbox Code Playgroud)

30按预期返回,但在检查执行计划时,我看到以下SELECT语句的警告:

表达式中的类型转换 (CONVERT_IMPLICIT(varchar(12),[test].[col1],0)) 可能会影响查询计划选择中的“CardinalityEstimate”

如果我在不从表中拉出的情况下运行相同的:

select LEFT(30500600, 2)
Run Code Online (Sandbox Code Playgroud)

30 按预期返回,执行计划中没有警告。

两个语句都应该LEFT()int类型上执行,所以我不明白为什么一个返回警告而另一个不返回。这里发生了什么?

编辑:

我已经尝试将col1数据类型声明更改为varchar并清除了错误。但这仍然没有向我解释为什么select LEFT(30500600, 2)如果我int直接将 an传递给LEFT()函数,它本身不会引起警告。

我试着castvarchar原查询:LEFT(cast(test.col1 as varchar(12)), 2)返回相同的警告。

可能重复

链接重复指出计算列是该用户的问题。我的示例中没有计算列,所以这不是问题。这使我进入了关于使用CONCAT函数隐式转换为字符串类型的答案的第二部分,该函数也相同LEFT。在我上面编辑的第二段中,我曾经CAST明确地转换为,varchar …

sql-server sql-server-2016 cardinality-estimates

6
推荐指数
1
解决办法
5764
查看次数