繁体   English   中英

存储过程无法正常工作

[英]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变量,在CASTCONVERT语句中使用它或在表定义中使用) !

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')

阅读此内容-http://blogs.msdn.com/b/turgays/archive/2013/09/16/data-mismatch-on-where-clause-might-cause-serious-performance-problems.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM