我的表有两个 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 形式接收)。此验证已在客户端应用程序中的此代码之前的步骤中进行。我只需要验证规模
。
最佳答案
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
如果字符串值末尾有零,则可以使用 REVERSE
和 PATINDEX
从右侧找到除零之外的第一个字符,并将这部分剪掉。然后重新反转字符串...
关于sql-server - 如果比例大于 2,则显示 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547752/