2014-03-05 78 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

相关问题