2014-07-17 107 views
0

我在执行查询时遇到了一个奇怪的场景。我对Sql Server执行查询的方式感到惊讶。Sql Server数据类型值问题

引用:

SELECT TOP 10 
    MR.MerchantContactFirstName +' '+ MR.MerchantContactLastName 
     AS MerchantName, 
    AISLTrans.DeviceID,AISLTrans.TransactionID, 
    AISLTrans.CardNumber, 
    AISLTrans.TransactionDateTime, 
    AISLTrans.TransactionStatus, 
    AISTRNSTYPE.TransactionType 
     AS TransactionRequestType,AISLTrans.TransactionAmount, 
    (AISLTrans.BasePointEarn+AISLTrans.BonusPointEarn) 
     AS 'Point Awarded' 
FROM AISLoyaltyTransactions AISLTrans 
    INNER JOIN MerchantRegistration MR 
     ON AISLTrans.MerchantID = MR.MerchantID 
    INNER JOIN AISTransactionTypes AISTRNSTYPE 
     ON AISLTrans.ProcessingCode = AISTRNSTYPE.ProcessingCode 
     AND AISLTrans.TransactionType = AISTRNSTYPE.MessageType 
WHERE **AISLTrans.TransactionType = 0200** 
    AND AISLTrans.ProcessingCode = 071000 
ORDER BY AISLTrans.TransactionDateTime DESC 

在上面的查询字段ISLTrans,TRANSACTIONTYPE工作正常的所有除0200它接受所有整数的值虽然字段类型是VARCHAR的值。

但是,当我给值为0200它引发异常说不能将varchar转换为int。

我在寻找为什么查询仍在执行,虽然我提供的是整数值而不是varchar,并且它正在执行为什么它不接受我提供的所有整数值。

+3

让你的生活更轻松,修复你的代码。 WHERE AISLTrans.TransactionType ='0200'。不要依赖隐式转换。对于性能来说这很糟糕,并且遇到这些类型的随机问题。发生这种情况的原因有时是因为执行计划可能会略有不同,并且可能会改变谓词在内部解决的顺序。您很可能在该表中有一些行,其中TransactionType不是整数。 –

回答

1

在给出输入的同时实现标准方式。

如果AISLTrans.TransactionType申请类型是整数, 使用这些代码

AISLTrans.TransactionType = CAST(0200 AS INT) 

别人使用这些代码

AISLTrans.TransactionType = '0200'