Sql 存储过程工作不正常

Sql 存储过程工作不正常,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有以下存储过程,但它没有返回正确的值。我测试了一些东西,似乎%是它不能正常工作的原因。虽然,ID是数据库中的一个Int,但由于%,程序一直失败,直到我将IDOld更改为VARCHAR 我在SQL中测试了该语句,它返回了正确的值,只有存储过程返回了错误的值。此外,我通过在like之后插入'1'对其进行了测试,但它仍然无法找到该值,即使它确实存在于数据库中。因此,我不知道如何使其正常工作 我正在获取旧ID并删除第一个数字,试图找到与旧ID相似但没有第一个数字的ID,因此示例IDOld=562382

我有以下存储过程,但它没有返回正确的值。我测试了一些东西,似乎%是它不能正常工作的原因。虽然,
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;

定义
VARCHAR
类型的参数而不给它长度将给您一个长度只有一个字符的字符串

ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts
(
    @IDOld VARCHAR,            -- exactly ONE character long
    @IDLastUpdated INT OUTPUT,
)
这通常不是您想要的-因此请在定义
VARCHAR
时始终指定长度(无论它是用作参数、定义SQL变量、在
CAST
CONVERT
语句或表定义中使用)


这是由于未指定
VARCHAR
字段的大小而导致的问题。你打字的时候
VARCHAR
它与
VARCHAR(1)
相同,因此SQL server会将您的输入截断为第一个字符

读这个

此外,您希望避免数据类型之间的隐式转换。当SQL决定转换列而不是参数时,这会极大地影响查询的性能。这就是为什么您总是希望在两侧匹配数据类型。你永远不会想要
1='1'
,它可以工作,但会引起问题。这就是为什么最好这样做
1=CONVERT(INT,'1')


阅读此-

首先:不能对
INT
列使用
LIKE
!第二:如果将参数定义为
VARCHAR
,而不指定长度;然后你得到一个长度只有一个字符的
VARCHAR
。(通常不是你想要的!)@marc\s我现在得到了。我刚刚设置了VARCHAR的长度,现在它返回了正确的值。t您需要将
ID
强制转换为
WHERE
子句中的
VARCHAR(9)
。当然,它可能运行缓慢,我对这个查询的智慧和实用性有严重怀疑…@rbaryyoung是的,这就是我所做的,现在它正在工作。泰。
ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts
(
    @IDOld VARCHAR(20),        -- or whatever fits your needs - just *DEFINE* the length!
    @IDLastUpdated INT OUTPUT,
)