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-没有可能的数据可以匹配大小写表达式的前两个分支,并且是数字。