此查询计划中没有 IMPLICIT_CONVERSION 警告

Han*_*non 4 sql-server type-conversion sql-server-2016 cardinality-estimates

采用以下最低限度完整且可验证的示例1代码:

USE tempdb;

DROP TABLE IF EXISTS dbo.t;
GO
CREATE TABLE dbo.t
(
    t_id int NOT NULL
        CONSTRAINT t_pk
        PRIMARY KEY 
        CLUSTERED
        IDENTITY(1,1)
    , k sysname NOT NULL
        INDEX t_001
    , s sysname NOT NULL
        INDEX t_002
    , somedata varchar(1000) NOT NULL
        CONSTRAINT t_somedata_df
        DEFAULT REPLICATE('A', 1000)
    , INDEX t_003 (k, s)
);

INSERT INTO dbo.t (s, k)
SELECT sc1.name, sc2.name
FROM sys.syscolumns sc1
    CROSS JOIN sys.syscolumns sc2;

CREATE STATISTICS t_st001 ON dbo.t (k) WITH FULLSCAN;
CREATE STATISTICS t_st002 ON dbo.t (s) WITH FULLSCAN;
Run Code Online (Sandbox Code Playgroud)

以下查询故意使用错误的变量类型。我希望查询计划会包含一个隐式转换警告,但它没有。

DECLARE @k char(128) = 'a';
DECLARE @s char(128) = '';
SELECT s 
FROM dbo.t 
    LEFT JOIN sys.syscolumns sc ON t.s = sc.name
WHERE dbo.t.s = @s
    OR dbo.t.k = @k;
Run Code Online (Sandbox Code Playgroud)

这是为什么?

查询计划在这里


1 - 那是我的网站,顺便说一句

Dav*_*oft 10

您的参数的数据类型优先级低于与之比较的列。在这种情况下,参数值将被隐式转换。这是一件好事。将列值转换为参数的类型是有问题的,会触发警告。