采用以下最低限度完整且可验证的示例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;
这是为什么?
查询计划在这里。
1 - 这是我的网站,顺便说一句
您的参数的数据类型优先级低于与之比较的列。在这种情况下,参数值将被隐式转换。这是一件好事。将列值转换为参数的类型是有问题的,并且会触发警告。