[英]Stored Procedure not working properly
我有以下存储过程,但是没有返回正确的值。 我测试了一些东西,看来%是它无法正常工作的原因。 尽管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
语句中使用它或在表定义中使用) !
ALTER PROCEDURE dbo.UP_getLastUsedIDFromProducts
(
@IDOld VARCHAR(20), -- or whatever fits your needs - just *DEFINE* the length!
@IDLastUpdated INT OUTPUT,
)
这是由于未指定VARCHAR
字段的大小而引起的问题。 当您键入VARCHAR
它与VARCHAR(1)
相同,因此SQL Server会将您的输入截断为第一个字符。
阅读此https://sqlblog.org/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length
另外,您还要避免在数据类型之间进行隐式转换。 万一SQL决定转换您的列而不是参数,这会极大地影响查询的性能。 这就是为什么您总是要在两侧都匹配数据类型的原因。 您永远不会希望1 = '1'
会起作用,但会引起问题。 这就是为什么最好这样做1 = CONVERT(INT,'1')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.