Sql-Server

此查詢計劃中沒有 IMPLICIT_CONVERSION 警告

  • June 21, 2019

採用以下最低限度完整且可驗證的範例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 - 這是我的網站,順便說一句

您的參數的數據類型優先級低於與之比較的列。在這種情況下,參數值將被隱式轉換。這是一件好事。將列值轉換為參數的類型是有問題的,並且會觸發警告。

引用自:https://dba.stackexchange.com/questions/241118