调用标量函数的存储过程不会在部署中运行

时间:2014-08-19 21:05:06

标签: asp.net sql-server stored-procedures

我在带有IIS 8的Windows Server 2012上部署的ASP.NET MVC中有一个Web应用程序,当我调用运行存储过程的方法运行标量函数时它不起作用,它不会给我任何有用的错误信息。我尝试使用Log4Net但不保存数据库上的任何日志。它在部署之前工作,我给了数据库,存储过程和函数所有的安全权限。

这是存储过程

PROCEDURE [dbo].[CasasCercanas]
    @Latitude DECIMAL(10,6),
    @Longitude DECIMAL(10,6),
    @Distancia decimal(15,9)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT DISTINCT
        PC.IdCasa,
        dbo.CalculateDistance(@Latitude, @Longitude, PC.LatitudCasa, PC.LongitudCasa) as Distance
    FROM Casa PC
    WHERE  
        @Distancia > dbo.CalculateDistance(@Latitude, @Longitude, PC.LatitudCasa, PC.LongitudCasa) 
        AND Activo = 1
    ORDER BY  
        Distance
END

2 个答案:

答案 0 :(得分:1)

首先,我认为在函数中关闭SQL查询语句时缺少一个分号。 - 这可能只是转录成SO。

接下来,我可以提供这种帮助:WHERE子句评估从输入lat / lon到每个Casa位置的距离,以便将该距离过滤为<输入@Distancia。对于合格记录,第二次评估相同的距离值....这是效率低下的。

存储过程(一旦正确部署/执行)应评估所有Casa行的距离一次,然后通过@Distancia和Activ0 = 1过滤那些结果,只返回满足两个标准的那些行。

下面的代码段是相关更改: ...

AS 
BEGIN
   SET NOCOUNT ON;

   SELECT
      IdCasa, Distance
   FROM  
         (SELECT PC.IdCasa, 
                 dbo.CalculateDistance(@Latitude, @Longitude, PC.LatitudCasa,     PC.LongitudCasa) as Distance 
          FROM Casa PC 
          WHERE Activo = 1
        ) ActivoDistance
   WHERE
      @Distancia > ActivoDistance.Distance
   ORDER BY Distance;

END;

我希望这段代码在正确运行后有助于让程序运行得更快!

答案 1 :(得分:0)

我已经解决了这个问题,我将默认的Culture和uiCulture更改为EN-us,因为我在德国服务器上部署它(所有者来自德国)问题是在德国文化中有不同的格式小数点,当它被发送到数据库时,转换中有一个错误,谢谢你的答案。

这是WebConfig中的代码

<globalization enableClientBasedCulture="true" culture="en-US" uiCulture="en-US" />

默认情况下,它捕获了SO文化,因此我将其更改为en-US