SQL Server 存储过程仅适用于本地重新声明的变量,而不适用于传递给该过程的变量



我已经编辑了我的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子句。

我基本上有两个问题:

  1. 为什么使用相同的数据重新声明相同的变量类型可以解决问题?
  2. 有没有办法在不使用这种愚蠢的"重新声明"技巧的情况下解决我的问题?

提前感谢您对此的任何帮助。

我认为如果您使用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;

然后,这两个语句都将成为存储过程正文的一部分,您可以修复数据以使其正常工作。

相关内容

最新更新