【问题标题】:Stored Procedure float input param truncating value存储过程浮点输入参数截断值
【发布时间】:2011-04-17 10:59:55
【问题描述】:

我有一个具有输入参数的存储过程:

  @Latitude float
, @Longitude float

但是当我传递这些值时:

 @Latitude=-28.640328248358344
,@Longitude=153.61249352645871

表中存储的值是:

Lat: -28.6403
Lng: 153.612

如果我对表进行标准插入或更新,则值是正确的。

我尝试将参数更改为 float(54),但没有任何区别...我使用浮点数的原因是因为 Lat/Lng 实际上是从地理列计算的列(并且它在设计器中声明它们是浮点数)-我通过将存储过程中的 lat/lng 值插入几个 varchar 列来仔细检查它是否与计算的 cols 无关。

我正在使用 EF 并且可以确认实体中的值是正确的,并且我已经检查了 SQL Profiler 以确认完整的值包含在 exec 调用中。

编辑: 我将这些值插入到地理类型的名为 GeoLocation 的列中:

GeoLocation = geography::STPointFromText('POINT(' + CONVERT(varchar, @Longitude) + ' ' + CONVERT(varchar, @Latitude) + ')',4326)

【问题讨论】:

  • @marc_s - 我的问题清楚地表明我使用地理列并且在我的 SP 中我有 --- GeoLocation = geography::STPointFromText('POINT(' + CONVERT(varchar, @Longitude) + ' ' + CONVERT(varchar, @Latitude) + ')',4326) --- 但这无关紧要,因为我还提到我将原始 @lat/lngs 存储在 varchar col 中以查看它们的外观和它们是也被截断了...
  • 我同意marc_s:从你的问题,甚至你上面的澄清,目标列的数据类型都不清楚。您说您从地理列中获取值,并将它们插入到 varchar 列中以进行测试;但是值似乎被截断的列的数据类型是什么? "...存储在表中的值..." --
  • Computed Float 列和 Varchar Cols(我做了额外的测试)都被截断了
  • 如果您使用 PRINT 检查这些结果,PRINT 总是将浮点数截断为 4 dp。

标签: sql-server stored-procedures input-parameters


【解决方案1】:

当您将 float 转换为 varchar 时,您会失去准确性。使用STR 转换为varchar

评论说“CONVERT(varchar, @Longitude)”。这不是“截断输入”而是正常行为

【讨论】:

    【解决方案2】:

    试试这个:

    DECLARE @Longitude FLOAT = 41.1234567
    
    SELECT CAST(@Longitude AS VARCHAR(24))
    

    你的结果是什么?就我而言,SQL Server 似乎总是会在小数点后截断到四位数.....

    这可能是您被截断的原因吗?真的只有转换为VARCHAR 会导致截断??尝试将存储过程中的值存储为 FLOAT 并查看这些值是否也被截断 - 我很确定它们不会被截断!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多