sql-server - 如果比例大于 2,则显示 -1

标签 sql-server

我的表有两个 sql_variant 列。在第一列中,十进制值作为 varchar 插入。在第二列中,将十进制值作为十进制本身插入。

DECLARE  @ATempSelected TABLE(RowNum [int] ,Quantity1 sql_variant,
Quantity2 sql_variant)

INSERT INTO @ATempSelected
SELECT 1,  '18.33',18.33
UNION ALL
SELECT 2,  '18.555555',18.555555

仅当小数位数小于或等于 2 时,我才应将 sql_variant 转换为十进制 ResultantValue。否则,我需要在 ResultantValue 中显示 -1。我有以下案例陈述。

SELECT T.Quantity1, 
        SQL_VARIANT_PROPERTY(T.Quantity1,'Scale')  ScaleValue1, 
        CASE WHEN SQL_VARIANT_PROPERTY(T.Quantity1,'Scale') <= 2 THEN CONVERT(DECIMAL(8,2),T.Quantity1) ELSE -1 END  AS ResultantValue1,
        T.Quantity2, 
        SQL_VARIANT_PROPERTY(T.Quantity2,'Scale')  ScaleValue2, 
        CASE WHEN SQL_VARIANT_PROPERTY(T.Quantity2,'Scale') <= 2 THEN CONVERT(DECIMAL(8,2),T.Quantity2) ELSE -1 END  AS ResultantValue2
FROM @ATempSelected T

SQL_VARIANT_PROPERTY为值“18.555555”赋予 scale 零。

SQL Server 2012 中实现上述逻辑(如果比例大于 2,则显示 -1)的最佳方法是什么?

注意:输入的实际值可以是整数或小数(但以 varchar 形式接收)。此验证已在客户端应用程序中的此代码之前的步骤中进行。我只需要验证规模

enter image description here

最佳答案

varchar 没有刻度...

对于通用方法来说,完全使用字符串方法来获取比例长度会更容易:

DECLARE  @ATempSelected TABLE(RowNum [int] ,Quantity1 sql_variant,
Quantity2 sql_variant)

INSERT INTO @ATempSelected
SELECT 1,  '18.33',18.33
UNION ALL
SELECT 2,  '18.555555',18.555555;

SELECT T.*
       ,ScaleLength.*
FROM @ATempSelected AS T
CROSS APPLY(SELECT CAST(Quantity1 AS VARCHAR(100)) AS q1
                  ,CAST(Quantity2 AS VARCHAR(100)) AS q2) AS AllText
CROSS APPLY(SELECT LEN(AllText.q1)-CHARINDEX('.',AllText.q1) AS Scale1
                  ,LEN(AllText.q1)-CHARINDEX('.',AllText.q2) AS Scale2 ) AS ScaleLength 

如果字符串值末尾有零,则可以使用 REVERSEPATINDEX 从右侧找到除零之外的第一个字符,并将这部分剪掉。然后重新反转字符串...

关于sql-server - 如果比例大于 2,则显示 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547752/

相关文章:

sql-server - 将数据从 Paradox 迁移到 SQL Server

sql - 分区表查询性能慢?

sql - 用于选择数字最后 6 位数字的存储过程

SQL Server : Permissions on table

sql-server - 从 mssql 中具有特定根节点的表中查找 XML 记录

sql-server - 添加参数时SSIS性能下降

sql-server - 将数据从 SQL Server 移动到 MS Access mdb

mysql - 如何将查询从 MYSQL 更改为 SQL SERVER 的 LIMIT

sql-server - SQL Server 中的别名

sql-server - 链接服务器插入选择性能