我有以下存储过程,但它没有返回正确的值。我测试了一些东西,看起来像%是它无法正常工作的原因。尽管在数据库中ID
是Int
,但是由于%
,程序一直保持失败,直到我将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;
首先:你** CAN NOT **使用'对抗'INT'列LIKE'!其次:如果你定义一个参数为'VARCHAR'而不指定长度**;那么你得到一个长**的** VARCHAR **(通常**不是**你想要的!) –
@marc_s我现在明白了。我只是设置了VARCHAR的长度,现在它返回了正确的值。 TY – user2994144
您需要在'WHERE'子句中将'ID'转换为'VARCHAR(9)'。当然,它可能会运行缓慢,我对这个查询的智慧和实用性有严重的怀疑... – RBarryYoung