2014-03-05 107 views
0

我有以下存儲過程,但它沒有返回正確的值。我測試了一些東西,看起來像%是它無法正常工作的原因。儘管在數據庫中IDInt,但是由於%,程序一直保持失敗,直到我將IDOld更改爲VARCHAR存儲過程無法正常工作

我在SQL中測試了這個語句,它只返回正確的值,存儲過程返回了錯誤的值。另外,我在like之後插入'1'來測試它,即使它存在於數據庫中,它仍然無法找到值。所以不知道如何使其正常工作。

我得到舊的ID並刪除第一個數字,並試圖找到與舊ID相同但沒有第一個數字的ID,例如IDOld = 5623826,IDOld = 623826比它應該返回的值IDOld。在數據庫中有更多的ID的變體,如1623826,2623826,...但我想要最後更新的值,因此使用Max。

ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts 
(
    @IDOld VARCHAR, 
    @IDLastUpdated INT OUTPUT, 
) 
AS 
    SELECT @IDLastUpdated = MAX(ID) 
    FROM Products 
    WHERE ID LIKE '%' + @IDOld 

SqlCommand cmd = new SqlCommand("UP_getLastUsedIDFromProducts"); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("@IDOld", SqlDbType.VarChar).Value = tbOriginalID.Text; 
cmd.Parameters.Add("@IDLastUpdated", SqlDbType.Int).Direction = ParameterDirection.Output; 
+2

首先:你** CAN NOT **使用'對抗'INT'列LIKE'!其次:如果你定義一個參數爲'VARCHAR'而不指定長度**;那麼你得到一個長**的** VARCHAR **(通常**不是**你想要的!) –

+0

@marc_s我現在明白了。我只是設置了VARCHAR的長度,現在它返回了正確的值。 TY – user2994144

+2

您需要在'WHERE'子句中將'ID'轉換爲'VARCHAR(9)'。當然,它可能會運行緩慢,我對這個查詢的智慧和實用性有嚴重的懷疑... – RBarryYoung

回答

1

定義VARCHAR類型的參數沒有給它一個長度會給你的一個字符長度字符串...

ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts 
(
    @IDOld VARCHAR,   -- exactly ONE character long 
    @IDLastUpdated INT OUTPUT, 
) 

這是最常見的不是你重新尋找 - 所以請總是指定一個長度,當你定義一個VARCHAR(無論它用作參數,定義一個SQL變量,在CAST或01中使用它聲明或表定義)!

ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts 
(
    @IDOld VARCHAR(20),  -- or whatever fits your needs - just *DEFINE* the length! 
    @IDLastUpdated INT OUTPUT, 
) 
+0

是的,我分配了VARCHAR(9),現在它正在工作。 – user2994144

0

這是一個問題,來自未指定大小的VARCHAR字段。當你鍵入 VARCHAR它與VARCHAR(1)相同,因此SQL服務器將你的輸入截斷爲第一個字符。

閱讀本http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx

另外要避免數據類型之間的隱式轉換。如果SQL決定轉換您的列而不是參數,這可能會極大地影響查詢的性能。這就是爲什麼你總是希望匹配雙方的數據類型。你永遠不想1 = '1'這將工作,但會造成問題。這就是爲什麼它是更好地做到這一點1 = CONVERT(INT,'1')

閱讀本 - http://blogs.msdn.com/b/turgays/archive/2013/09/16/data-mismatch-on-where-clause-might-cause-serious-performance-problems.aspx

相關問題