验证小数点前三位和小数点后六位

tej*_*eja 3 sql-server t-sql sql-server-2008-r2 data-validation

我有nvarchar 数据类型的经度纬度列。用户可以输入类似 (23.23424432),(432423.343) 的内容,这是不允许的。

谁能帮我在 SQL Server 中验证这一点?

  • 用户可以输入的数据:例如:0, 12, 101.0, 111.022222
  • 用户无法输入的数据:例如:1111、111.2222222、1234.1111

它应该只接受这种格式:(232.343244)

下面的代码接受任何数字:

 + CASE WHEN (CAST(A.GPS_LATITUDE AS NVARCHAR) IS NOT NULL AND CAST(A.GPS_LATITUDE AS NVARCHAR) <>'' AND CAST(A.GPS_LATITUDE AS NVARCHAR) NOT LIKE'%*%') 
AND ISNUMERIC(CAST(A.GPS_LATITUDE AS NVARCHAR)+'e0') = 0 OR (LEN(A.GPS_LATITUDE)>20)
 THEN 'Invalid Latitude. ' ELSE '' END
+ CASE WHEN (CAST(A.GPS_LONGITUDE AS NVARCHAR) IS NOT NULL AND CAST(A.GPS_LONGITUDE AS NVARCHAR) <>'' AND CAST(A.GPS_LONGITUDE AS NVARCHAR) NOT LIKE'%*%')
AND ISNUMERIC(CAST(A.GPS_LONGITUDE AS NVARCHAR)+'e0') = 0 OR (LEN(A.GPS_LONGITUDE)>20)
 THEN 'Invalid Longitude. ' ELSE '' END   
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我们有一个下载模板按钮。当我们按下下载模板按钮时,它会下载一个只有标题的模板 - 包含LONGITUDELATITUDE等列 。我们需要像 234.234325 这样手动输入,但用户可以输入 2342.234242 或 4353453.123213 并保存 Excel 文件。

在应用程序 UI 中,将有一个上传按钮。按上传按钮将数据发送到数据库,并在存储过程中进行验证。在存储过程中,以上代码行验证数据。我们需要为上面的代码添加十进制数字验证,如(432.342342)。

Ant*_*rds 8

  • 最好在数据库中使用 DECIMAL(9,6) 数据类型。

    • 然后你用一个简单的数字 BETWEEN 验证
  • 但是,如果您坚持使用字符类型,请使用 CHAR 而不是 NCHAR - 您只接受句点和数字,因此永远不会有任何“Unicode”;将您的空间使用量减半。

    • 然后你可以用类似的东西来验证 a.latitude LIKE '[0-3][0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9].[0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9].[0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9].[0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9].[0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9].[0-9]' ESCAPE '~' OR a.latitude LIKE '[0-3][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9].[0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9][0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9][0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9][0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9][0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9][0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9].[0-9]' ESCAPE '~' OR a.latitude LIKE '[0-9]' ESCAPE '~'

    • 请注意,对字符类型执行此操作既烦人又几乎没有性能。

请注意,最左边的数字仅限于 0-3,因为您永远不会有以 4 或更高(我假设度数)开头的纬度或经度。

由于您使用的是 SQL Server 2008 R2,您可能还想阅读 Stackoverflow 问题为什么使用 SQL Server 2008 地理数据类型?. 一个非常简短的总结是: DECIMAL(9,6) 明显更小,对于简单的 SELECT Lat,Long 明显更快。但是,要进行精确的邻近搜索(这通常是存储坐标的原因)、距离计算(通常也是您需要它们的原因)或区域等,地理类型要简单得多,而且几乎肯定会更准确。