我已经编辑了我的SQL代码块,以更准确地显示正在发生的事情
假设我有一个简单的存储过程:
CREATE PROCEDURE [DBO].[FOO]
(@VARIABLE VARCHAR(500))
AS
BEGIN
SELECT AVG(BAR)
FROM MYTABLE
WHERE THING = @VARIABLE AND RTRIM(LTRIM(THING)) <> ''
END
当我从经典的 ASP 页调用此存储过程时;在本例中为:
Set foo = Server.CreateObject("ADODB.RecordSet")
curCmd = "Foo 'MYVARIABLE'"
foo.Open curCmd, connectionString
我收到此错误(在页面打开foo对象的同一行上(:
将 varchar 转换为数据类型数值的算术溢出错误。
如果我在终端(IDE?(中手动调用存储过程;那么它工作正常。
另外,如果我按如下方式重新创建存储过程:
CREATE PROCEDURE [DBO].[FOO]
(@VARIABLE VARCHAR(500))
AS
BEGIN
DECLARE @VARIABLE2 VARCHAR(500) = @VARIABLE
SELECT AVG(BAR)
FROM MYTABLE
WHERE THING = @VARIABLE2 AND RTRIM(LTRIM(THING)) <> ''
END
然后存储过程运行正常。
我尝试删除并重新创建存储过程(不使用重新声明技巧(,但它不能解决问题。
*顺便说一句;对插入到表中的数据进行验证,以确保仅为 THING 字段输入数字(整数(。THING 字段也可以为空;因此,WHERE子句。
我基本上有两个问题:
- 为什么使用相同的数据重新声明相同的变量类型可以解决问题?
- 有没有办法在不使用这种愚蠢的"重新声明"技巧的情况下解决我的问题?
提前感谢您对此的任何帮助。
我认为如果您使用begin
/end
,您可能会遇到相同的错误:
CREATE PROCEDURE [DBO].[FOO] (
@VARIABLE VARCHAR(500)
)
AS
BEGIN
DECLARE @VARIABLE2 VARCHAR(500) = @VARIABLE;
SELECT AVG(BAR) FROM MYTABLE WHERE THING = @VARIABLE2;
END;
然后,这两个语句都将成为存储过程正文的一部分,您可以修复数据以使其正常工作。