为什么查询在存入过程后会给出不同的结果?

时间:2013-02-10 02:19:35

标签: mysql sql

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

我看到this one但我在MySQL文档中读到默认情况下所有程序都是非确定性的。

This one与我的问题没有任何关系,因为它的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)

我返回零行。但是,如果我在程序中运行完全相同的语句只是一个查询,并将params放入这样:

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但是当我把它放在创建行之后而END放在最后一行之后它无法生成程序。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

<强>摘要

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