SQL Server中的转换错误-为什么?
我的代码如下所示,我无法找到导致转换错误的原因。有人能帮助确定问题吗SQL Server中的转换错误-为什么?,sql,sql-server,tsql,type-conversion,syntax-error,Sql,Sql Server,Tsql,Type Conversion,Syntax Error,我的代码如下所示,我无法找到导致转换错误的原因。有人能帮助确定问题吗 [COLUMN_A] = CASE WHEN [COLUMN_B] IS NOT NULL AND [COLUMN_B] <> '' AND CHARINDEX('MG', [COLUMN_B], 1) <> 0 THEN CONVERT(
[COLUMN_A] = CASE
WHEN [COLUMN_B] IS NOT NULL
AND [COLUMN_B] <> ''
AND CHARINDEX('MG', [COLUMN_B], 1) <> 0
THEN CONVERT(DECIMAL(8, 4), RTRIM(LEFT([COLUMN_B], CHARINDEX('MG', [COLUMN_B], 1)))
WHEN [COLUMN_B] IS NOT NULL
AND [COLUMN_B] <> ''
AND CHARINDEX('MCG', [COLUMN_B], 1) <> 0
THEN CONVERT(DECIMAL(8, 4), RTRIM(LEFT([COLUMN_B], CHARINDEX('MCG', [COLUMN_B], -1)))
WHEN [COLUMN_B] IS NOT NULL
AND [COLUMN_B] <> ''
THEN CONVERT(DECIMAL(8, 4), RTRIM([COLUMN_B]))
ELSE NULL
END
[COLUMN_A]=案例
当[COLUMN_B]不为空时
及[第B栏]”
和CHARINDEX('MG',[COLUMN_B],1)0
然后转换(十进制(8,4),RTRIM(左([COLUMN_B],CHARINDEX('MG',[COLUMN_B],1)))
当[COLUMN_B]不为空时
及[第B栏]”
和CHARINDEX('MCG',[COLUMN_B],1)0
然后转换(十进制(8,4),RTRIM(左([COLUMN_B],CHARINDEX('MCG',[COLUMN_B],-1)))
当[COLUMN_B]不为空时
及[第B栏]”
然后转换(十进制(8,4),RTRIM([COLUMN_B]))
否则无效
结束
对于列B
包含字符串'MCG'
的情况,您使用的是表达式
LEFT([COLUMN_B], CHARINDEX('MCG', [COLUMN_B], -1))
让我们看看包含此子字符串的字符串返回的内容
+-----------+---------+
| COLUMN_B | Returns |
+-----------+---------+
| MCG | M |
| MCG 12.45 | M |
| 12.45 MCG | 12.45 M |
+-----------+---------+
因此,您可以看到,任何包含MCG
的字符串都保证生成非数字结果,因为它们都包含匹配子字符串的第一个字母。因此这必然无法转换为十进制
将-1
作为第三个参数传递给CHARINDEX
是没有意义的。这是开始位置
,并且字符串没有负字符
我假设您试图找到charindex,然后减去1以提取子字符串左侧的所有内容,而不包括M
所以你需要
LEFT([COLUMN_B], CHARINDEX('MCG', [COLUMN_B]) -1)
对于列B
值12.45 MCG
这将返回
12.45,然后您的RTRIM`将删除尾随空格
这同样适用于您的另一个CHARINDEX
表达式
您还可以删除[COLUMN\u B]不为NULL和[COLUMN\u B]'
-的前两个实例,因为如果它与charindex
测试匹配,它将不为NULL且不为空。[COLUMN\u A]=大小写
[COLUMN_A] = CASE
WHEN try_convert(nvarchar(max),[COLUMN_B]) IS NOT NULL
AND try_convert(nvarchar(max),[COLUMN_B]) <> ''
AND CHARINDEX('MG', try_convert(nvarchar(max),[COLUMN_B]), 1) <> 0
THEN CONVERT(DECIMAL(8, 4), RTRIM(LEFT(try_convert(nvarchar(max),[COLUMN_B]), CHARINDEX('MG', try_convert(nvarchar(max),[COLUMN_B]), 1)))
WHEN try_convert(nvarchar(max),[COLUMN_B]) IS NOT NULL
AND try_convert(nvarchar(max),[COLUMN_B]) <> ''
AND CHARINDEX('MCG', try_convert(nvarchar(max),[COLUMN_B]), 1) <> 0
THEN CONVERT(DECIMAL(8, 4), RTRIM(LEFT(try_convert(nvarchar(max),[COLUMN_B]), CHARINDEX('MCG', try_convert(nvarchar(max),[COLUMN_B]), -1)))
WHEN try_convert(nvarchar(max),[COLUMN_B]) IS NOT NULL
AND try_convert(nvarchar(max),[COLUMN_B]) <> ''
THEN CONVERT(DECIMAL(8, 4), RTRIM(try_convert(nvarchar(max),[COLUMN_B])))
ELSE NULL
END
try_convert(nvarchar(max)时,[COLUMN_B])不为空
并尝试转换(nvarchar(max),[COLUMN_B])”
和CHARINDEX('MG',try_convert(nvarchar(max),[COLUMN_B]),1)0
然后转换(十进制(8,4),RTRIM(左)(尝试转换(nvarchar(max),[COLUMN_B]),CHARINDEX('MG',尝试转换(nvarchar(max),[COLUMN_B]),1)))
try_convert(nvarchar(max)时,[COLUMN_B])不为空
并尝试转换(nvarchar(max),[COLUMN_B])”
和CHARINDEX('MCG',try_convert(nvarchar(max),[COLUMN_B]),1)0
然后转换(十进制(8,4),RTRIM(左)(尝试转换(nvarchar(max),[COLUMN_B]),CHARINDEX('MCG',尝试转换(nvarchar(max),[COLUMN_B]),-1)))
try_convert(nvarchar(max)时,[COLUMN_B])不为空
并尝试转换(nvarchar(max),[COLUMN_B])”
然后转换(十进制(8,4),RTRIM(尝试转换(nvarchar(max),[COLUMN_B]))
否则无效
结束
这至少可以让您克服错误,并允许您至少通过使用内联try catch函数来运行它。您遇到了什么错误?请提供示例数据。我猜这与您正在对字符串的外观以及可以实际剪切字符串的位置进行一些假设有关产生一个小数。@Xedni-没有可能的数据可以匹配大小写表达式的前两个分支,并且是数字。