【问题标题】:removing implicit conversion in SQL Server删除 SQL Server 中的隐式转换
【发布时间】:2013-03-06 11:12:03
【问题描述】:

我正在尝试从数据库中消除隐式转换。

我在下面的 UpdatedByID 字段上添加了 CAST 语句,因为这是一个 Char(10),它正在加入 FROM 语句中的一个 INT。但我仍然得到隐式转换。我一定遗漏了一些明显的东西??

        SELECT DISTINCT ba.BookingID INTO #temp1
        FROM BookedItemsAudit_tbl bia  
        INNER JOIN BookingAudit_tbl ba ON bia.BookingAuditID = ba.BookingAuditID    
        INNER JOIN User_tbl u ON  u.UserId  = CAST(ba.UpdatedById AS INT)
        WHERE bia.BookedItemTypeId IN (1, 58, 60)   
        AND u.UserId = 5

这是精简的架构

BOOKINGAUDIT_TBL
Column_name     Type        Length
BookingAuditID  int         4
BookingID       int         4
UpdatedByID     CHAR        10
UpdatedBy       varchar     50
UpdatedDate     datetime    8
TotalMargin     money       8
BookingStatusId int         4

 USER_TBL
 Column_name    Type        Length
 UserId         int         4
 FullName       varchar     100
 UserName       varchar     20

此链接中的完整查询和架构

SQL fiddle

附上执行计划中出现提示时的错误提示

【问题讨论】:

  • 您需要发布表的架构以及您收到的确切错误消息。
  • 为了让您的问题更容易理解,请链接到sqlfiddle.com 上的示例,其中包含一些导致失败的数据。
  • 我们能不能也看看 BookedItemsAudit_tbl 的架构
  • @tass 感谢 SQL 小提琴链接。我以前从未使用过该网站,看起来非常有用且直观
  • @robinDay 嗨罗宾,我想我会把很多东西发到 SQL fiddle 以防我错过了什么

标签: sql-server casting implicit-conversion


【解决方案1】:

警告是关于您的 显式 转换而不是 隐式 转换。您显示的工具提示未提及CONVERT_IMPLICIT

CAST(ba.UpdatedById AS INT) 在计划中显示为CONVERT(int,ba.UpdatedById ,0),它会警告您(它会阻止在 ba.UpdatedById 上进行索引搜索)。

要停止看到此警告,您需要修复架构,以便加入相同数据类型的列。

【讨论】:

  • @martin smith,好的,谢谢马丁,跳了枪,第二次没有正确读取错误...没想到在显式转换后它仍然会产生警告.. .. 更改字段有点棘手!
  • @DamagedGoods - 警告是提醒您明确的CAST 是不可分割的,并防止在ba.UpdatedById 上进行索引查找。顺便说一句,您是否都反对并接受了这个答案?
  • 真诚的道歉!我本来想对这个答案投赞成票,但现在它被锁定了。我会向管理员发送一封电子邮件,或者如果您稍微编辑一下答案,我想我可以更改投票
  • @DamagedGoods - 啊,谢谢。觉得这很奇怪!我现在已经编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多