【问题标题】:Execution plan showing type conversion warning - ON Cond columns执行计划显示类型转换警告 - ON Cond 列
【发布时间】:2017-03-24 06:55:39
【问题描述】:

在表达式中进行类型转换.....可能会影响查询泛选择中的“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

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您的示例数据和查询存在一些问题。 KEY INT IDENTITY(1,1) NOT NULL 应更改为 [KEY] NOT NULL 或者不要插入到标识列中 INSERT INTO T1 VALUES('ASS','DESC','NULL',0) 此外,当您用单引号将“NULL”括起来时,您不是插入 DB NULL,而是插入 Text null。为了这。下面的代码应该可以工作


    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
    

    但是我认为您希望 NULL 为 NULL 而不是文本,因此请将您的插入从 INSERT INTO T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG) VALUES('ASS','DESC','NULL',0) 更改为 `INSERT INTO T1(CODE,DESCRIPTION,EXTERNAL_KEY,FLAG) VALUES('ASS','DESC',NULL, 0)


    样本数据

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2019-10-04
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多