1

我已阅读下面列出的几篇文章,试图找到我的问题的答案。他们似乎都有同样的问题。

我看到了这个,但我在 MySQL 文档中读到,默认情况下所有过程都是非确定性的。

与我的问题没有任何关系,因为它的 SQL Server(不是 MySQL)。

这是我用来创建程序的查询:

CREATE PROCEDURE getcusbyzip(zipcode VARCHAR(30),radius VARCHAR(30))
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (

SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (

SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <radius
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )

现在,如果我在该查询之后运行此查询:

CALL getcusbyzip(08360,50)

我得到零行返回。但是,如果我在过程中运行完全相同的语句作为查询并将参数放入如下:

SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (

SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (

SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (

SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <50
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )

我得到了我想要的。答案应该只有一排,但为什么结果会在不在程序中时出现在我面前,但是当我将其放入其中时,它不会给我这一排。

我想可能是因为我没有 BEGIN 和 END,但是当我将它放在创建行之后和最后一行之后,它无法生成过程。

4

1 回答 1

1

您的示例代码和存储过程代码彼此相差太大。

为了确定您的问题,您需要执行以下操作

在示例代码的顶部(不是 SP)

  • 声明一个名为 zipcode 的变量,类型为 varchar(30)
  • 声明一个类型为 varchar(30) 的名为 radius 的变量

然后,将示例代码的其余部分修改为与存储过程完全相同。

您将能够使用此方法确定确切的问题。

正如评论中提到的,这可能是由于滥用 varchars 被转换为数字。

概括

在示例代码的顶部声明并设置变量,以便示例的其余部分与您的存储过程完全相同。然后你就可以开始识别问题了。

于 2013-02-10T03:57:39.750 回答