【问题标题】:problem with creating stored procedure and view in sql server在sql server中创建存储过程和视图的问题
【发布时间】:2010-09-01 05:17:58
【问题描述】:

当我执行它时,我有以下存储过程代码给出了一个错误,指出列名无效 Lat 和 Lng。这些 Lat 和 Lng 变量是从后面的 c# 代码调用的参数,最后在这个特定段落中指示了 sql 查询。

CREATE FUNCTION spherical_distance(@a float, @b float, @c float)
RETURNS float
AS
BEGIN
    RETURN ( 6371 * ACOS( COS( (@a/@b) ) * COS(  (Lat/@b)  ) * COS( ( Lng/@b ) - (@c/@b) )  + SIN( @a/@b ) * SIN(  Lat/@b  ) ) )    
END

create view [dbo].[business] as 
SELECT Id,
       Name1,
       ZipCode,
       StreetName,
       StreetNumber,
       State1,
       Lat,
       Lng,
       Keyword
  FROM Business_Details

sqlda.SelectCommand.CommandText = "select *, spherical_distance( Lat, 57.2958, Lng) as distance
                                     from business 
                                    where (( distance < '" + radius + "' )
                                      and (StreetName like '%" + streetname + "%')
                                      and (Keyword like '%" + keyword1 + "%' )) 
                                 order by spherical_distance(Lat,57.2958,Lng)";

【问题讨论】:

  • 您的查询受 Sql Injection 约束。 (当 streetname 变量的值为“ ')); DELETE Business_Details; -- ”,运行 SelectCommand 将清空数据库中的表。)
  • 此问题已重复为stackoverflow.com/q/3615364/217751

标签: c# sql sql-server-2005


【解决方案1】:

在这些参数前面加上@符号怎么样?

【讨论】:

  • 感谢我尝试将 @ 放在 Lat 和 Lng 前面的回复,但它表明错误消息 137,级别 15,状态 2,过程球距离,第 6 行必须声明标量变量“@Lat” . CREATE FUNCTIONspherical_distance(@a float, @b float, @c float) RETURNS float AS BEGIN RETURN ( 6371 * ACOS( COS( (@a/@b) ) * COS( (@Lat/@b) ) * COS( (@Lng/@b) - (@c/@b)) + SIN(@a/@b) * SIN(@Lat/@b))) END
【解决方案2】:

当您创建spherical_distance 函数时,它对LatLng 表达式一无所知。这些是否应该是函数的两个附加参数,例如@a@b@c? (该函数对视图一无所知。)

稍后当您调用该函数时,将值从列Lat 传递到@a,并从Lng 传递到@c,因此在函数中这两个参数将包含来自这些列的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2012-04-18
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2013-08-14
    相关资源
    最近更新 更多