web-dev-qa-db-ja.com

このクエリプランにはIMPLICIT CONVERSION警告はありません

次の例を見てください 最低限完全で検証可能な例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;

次のクエリは、意図的に誤った変数タイプを使用しています。クエリプランに暗黙の変換警告が含まれることを望んでいましたが、含まれていません。

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;

何故ですか?

クエリプランは here です。


1-それは私のウェブサイトです、ところで

4
Max Vernon

パラメーターの比較対象の列よりも Data Type Precedence が低くなっています。この場合、パラメーター値は暗黙的に変換されます。これは良いことです。列の値をパラメータのタイプに変換すると問題が発生し、警告が表示されます。