2014-07-17 140 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'