Pegue o seguinte código de exemplo 1 minimamente completo e verificável :
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;
A consulta a seguir usa propositalmente os tipos de variável errados. Eu esperava que o plano de consulta incluísse um aviso de conversão implícito, mas isso não acontece.
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;
Por que é que?
O plano de consulta está aqui .
1 - esse é o meu site, BTW
Seus parâmetros têm uma precedência de tipo de dados menor do que as colunas com as quais são comparados. Neste caso, os valores dos parâmetros serão convertidos implicitamente. Isto é uma coisa boa. Converter os valores da coluna para o tipo do parâmetro é problemático e acionará o aviso.