Convert(int,value)会根据where子句导致错误

时间:2017-11-15 09:03:29

标签: sql-server-2016

一个完美的作品(通知转换):

select (select Twr_Kod from whm.CDN.TwrKarty where Twr_GIDNumer=Convert(int, value))
 from Workflow.ControlValues
 inner join Workflow.Controls on Controls.ID=ControlID and Controls.ValueTypeID=1

但是,如果在转换值时导致错误,我将使其成为子查询:

select
(select (select Twr_Kod from whm.CDN.TwrKarty where Twr_GIDNumer=Convert(int, value))
 from Workflow.ControlValues
 inner join Workflow.Controls on Controls.ID=ControlID and Controls.ValueTypeID=1
  where ItemID=Items.ID
   for XML path(''))
    from Offers.Items

我认为where会排除某些行,因此不会导致转换出现任何问题。你知道这种行为的原因是什么以及如何防止它?

P.S。我检查了错误消息中的行,但它与Controls.ValueTypeID=1子句中的on不匹配。

1 个答案:

答案 0 :(得分:1)

使用TRY_CONVERT

SELECT (
        SELECT (
                SELECT Twr_Kod
                FROM whm.CDN.TwrKarty
                WHERE TRY_CONVERT(INT, Twr_GIDNumer) = TRY_Convert(INT, value)
                )
        FROM Workflow.ControlValues
        INNER JOIN Workflow.Controls ON Controls.ID = ControlID
            AND Controls.ValueTypeID = 1
        WHERE ItemID = Items.ID
        FOR XML path('')
        )
FROM Offers.Items;

基于WHERE的排除取决于执行计划。如果查询优化器首先决定执行WHERE Twr_GIDNumer = Convert(INT, value),那么您将收到错误。