【发布时间】:2020-10-27 19:16:10
【问题描述】:
我有一个需要舍入varchar(255) 数据类型的存储过程。在尝试 round 这个数据类型时,我得到了错误
将数据类型 varchar 转换为 float 时出错
所以我尝试在round 函数中将varchar(255) 转换为float。我附上了我的存储过程。有3例。 [paramvalue] 列中的值可以是“101.667483932”、“27.63749569”等...我需要将它们四舍五入到小数点后 1 位,然后是小数点后 2 位。这不是绕过 [paramvalue] 列的合适方法吗?
ALTER PROCEDURE [dbo].[ReportParameters]
@StartTime datetime
,@EndTime datetime
,@UniqueID varchar(155)
AS
BEGIN
SELECT DISTINCT PA.[uniqueid]
,PA.[paramname]
,(SELECT PH.recipephase FROM BHPhase PH WHERE PH.uniqueid = PA.uniqueid AND PA.eventtime > PH.starttime AND PA.eventtime <= PH.endtime) AS Phase
,PA.[eu]
,CASE
WHEN PA.[eu] = 'pH' THEN ROUND (CONVERT(float, PA.[paramvalue]), 1)
WHEN PA.[eu] = 'KG' THEN ROUND (CONVERT(float, PA.[paramvalue]), 1)
WHEN PA.[eu] = 'mL/min' THEN ROUND (CONVERT(float, PA.[paramvalue]), 2)
ELSE PA.paramvalue
END
,PA.[paramtype]
,PA.[recipe]
,PA.[area]
,PA.[eventtime]
,PA.[userid]
FROM [BatchHistoryEx].[dbo].[BHParameter] PA
WHERE [eventtime] >= @StartTime AND [eventtime] <= @EndTime
AND PA.[paramtype] = 'Report'
AND PA.[uniqueid] = @UniqueID
ORDER BY [eventtime] ASC
End
【问题讨论】:
-
如果您使用正确的数据类型,您将永远不会遇到此问题。
-
为什么你认为你需要使用
DISTINCT?这只是您添加到每个查询的标准做法吗?给定谓词PA.[uniqueid] = @UniqueID,似乎应该只选择一行(假设该列的名称准确地反映了它的用法)。 -
并且在没有充分理由的情况下使用三部分名称只是其他人需要在某些时候解决的问题。如果您需要引用一个不是您的过程所在的数据库,您应该考虑使用同义词或视图。这将使您的代码更容易移植到一组不同名称的数据库中(因为我们经常需要在同一个实例中运行多个环境)。
标签: sql sql-server stored-procedures rounding