tej*_*eja 3 sql-server t-sql sql-server-2008-r2 data-validation
我有nvarchar 数据类型的经度和纬度列。用户可以输入类似 (23.23424432),(432423.343) 的内容,这是不允许的。
谁能帮我在 SQL Server 中验证这一点?
它应该只接受这种格式:(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)
在我的应用程序中,我们有一个下载模板按钮。当我们按下下载模板按钮时,它会下载一个只有标题的模板 - 包含LONGITUDE和LATITUDE等列 。我们需要像 234.234325 这样手动输入,但用户可以输入 2342.234242 或 4353453.123213 并保存 Excel 文件。
在应用程序 UI 中,将有一个上传按钮。按上传按钮将数据发送到数据库,并在存储过程中进行验证。在存储过程中,以上代码行验证数据。我们需要为上面的代码添加十进制数字验证,如(432.342342)。
最好在数据库中使用 DECIMAL(9,6) 数据类型。
但是,如果您坚持使用字符类型,请使用 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 明显更快。但是,要进行精确的邻近搜索(这通常是存储坐标的原因)、距离计算(通常也是您需要它们的原因)或区域等,地理类型要简单得多,而且几乎肯定会更准确。