Sql server 显示类型转换警告的执行计划-在Cond列上

Sql server 显示类型转换警告的执行计划-在Cond列上,sql-server,Sql Server,正在表达式中获取类型转换。。。。。可能会影响查询范围选择中的“CardinalityEstimate”。 表T1和T2都具有聚集索引 如何克服警告 CREATE TABLE T1 ( KEY INT IDENTITY(1,1) NOT NULL, CODE VARCHAR(50), DESCRIPTION VARCHAR(100), EXTERNAL_KEY VARCHAR(15), FLAG BIT ) INSERT INTO T1 VALUES(

正在表达式中获取类型转换。。。。。可能会影响查询范围选择中的“CardinalityEstimate”。 表T1和T2都具有聚集索引

如何克服警告

CREATE TABLE T1
(
    KEY INT IDENTITY(1,1) NOT NULL,
    CODE VARCHAR(50), 
    DESCRIPTION VARCHAR(100),
    EXTERNAL_KEY VARCHAR(15),
    FLAG BIT
) 

INSERT INTO T1 VALUES(1,'ASS','DESC','NULL',0) 
INSERT INTO T1 VALUES(1,'ASS1','DESC','45213',1) 
INSERT INTO T1 VALUES(1,'ASS2','DESC','NULL',1) 
INSERT INTO T1 VALUES(1,'ASS3','DESC','NULL',0) 
INSERT INTO T1 VALUES(1,'ASS4','DESC','56321',1)

CREATE TABLE T2
(
    KEY INT IDENTITY(1,1) NOT NULL,
    CODE VARCHAR(50), 
    DESCRIPTION VARCHAR(100),
    EXTERNAL_KEY NUMERIC(14,0)
)

INSERT INTO T2 VALUES(1,'DSA','DESC',51256) 
INSERT INTO T2 VALUES(1,'DSA1','DESC',45213) 
INSERT INTO T2 VALUES(1,'DSA2','DESC',51256) 
INSERT INTO T2 VALUES(1,'DSA3','DESC',56321)
实际查询:

SELECT T1.KEY,T1.FLAG,T2.KEY, FROM T2 INNER JOIN T1 ON 
CAST(NULLIF(RTRIM(T1.EXTERNAL_KEY),'') AS NUMERIC(14,0)) = T2.EXTERNAL_KEY
WHERE T1.EXTERNAL_KEY IS NOT NULL

示例数据和查询都存在一些问题
KEY INT IDENTITY(1,1)NOT NULL
应更改为
[KEY]NOT NULL
或不插入标识列
插入T1值('ASS'、'DESC'、'NULL',0)
当您用单引号括住'NULL'时,您也不插入DB NULL,而是插入文本NULL。为了这个。下面的代码应该可以工作



但是,我认为您希望NULL为NULL而不是文本,因此请将插入内容从插入T1(代码、描述、外部密钥、标志)值('ASS','DESC','NULL',0)更改为插入T1(代码、描述、外部密钥、标志)值('ASS','DESC',NULL,0)


样本数据 密码
SELECT T1.[KEY],T1.FLAG,T2.[KEY]
FROM T2 
INNER JOIN T1 
ON NULLIF(T1.EXTERNAL_KEY ,'NULL')=T2.EXTERNAL_KEY 
WHERE T1.EXTERNAL_KEY IS NOT NULL
IF OBJECT_ID('tempdb..#T1') IS NOT NULL
    DROP TABLE #T1

IF OBJECT_ID('tempdb..#T2') IS NOT NULL
    DROP TABLE #T2

CREATE TABLE #T1
(
    [KEY] INT IDENTITY(1,1) NOT NULL,
    CODE VARCHAR(50), 
    DESCRIPTION VARCHAR(100),
    EXTERNAL_KEY VARCHAR(15),
    FLAG BIT
) 
GO

INSERT INTO #T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG) VALUES('ASS','DESC',NULL,0) 
INSERT INTO #T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG) VALUES('ASS1','DESC','45213',1) 
INSERT INTO #T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG)VALUES('ASS2','DESC',NULL,1) 
INSERT INTO #T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG)VALUES('ASS3','DESC',NULL,0) 
INSERT INTO #T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG)VALUES('ASS4','DESC','56321',1)

CREATE TABLE #T2
(
    [KEY] INT IDENTITY(1,1) NOT NULL,
    CODE VARCHAR(50), 
    DESCRIPTION VARCHAR(100),
    EXTERNAL_KEY NUMERIC(14,0)
)
GO

INSERT INTO #T2 (CODE,DESCRIPTION,EXTERNAL_KEY) VALUES('DSA','DESC',51256) 
INSERT INTO #T2 (CODE,DESCRIPTION,EXTERNAL_KEY)VALUES('DSA1','DESC',45213) 
INSERT INTO #T2 (CODE,DESCRIPTION,EXTERNAL_KEY)VALUES('DSA2','DESC',51256) 
INSERT INTO #T2 (CODE,DESCRIPTION,EXTERNAL_KEY)VALUES('DSA3','DESC',56321)
SELECT #T1.[KEY],#T1.FLAG,#T2.[KEY]
FROM #T2 
INNER JOIN #T1 
ON NULLIF(#T1.EXTERNAL_KEY ,NULL)=#T2.EXTERNAL_KEY 
WHERE #T1.EXTERNAL_KEY IS NOT NULL