将nvarchar值转换为数据类型int时转换失败

5

你知道这里可能出了什么问题吗?

所有变量都是nvarchar类型。 当@FunctionValue包含以字符串格式表示的INT时,就会出现错误。

IF @TargetType = 'INT'
BEGIN
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
                        ' SET ' + @TargetColumn + ' = ' + COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) + 
                         ' '
END

您正在尝试将@SQLSTR varchar与INT进行赋值... COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT))将是INT类型,不能直接与Varchar拼接。 - bummi
@bummi,那我接下来该做什么? - hermann
COALESCE(@FunctionValue,@Value) 或者至少将(COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) as Varchar(20)) 强制转换。 - bummi
不幸的是,我仍然遇到相同的错误。 - hermann
2个回答

4
问题在于+运算符的歧义性。当任何参数是数字时,它会假定你正在进行数字相加,而不是字符串连接。
如果你的原始数据是字符型的,那么你可以通过完全删除转换来解决这个问题:
IF @TargetType = 'INT'
BEGIN
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
                        ' SET ' + @TargetColumn + ' = ' + COALESCE(@FunctionValue, @Value) + 
                         ' '
END;

如果您的原始数据是数字类型,则您需要显式将它们转换为字符类型:

IF @TargetType = 'INT'
BEGIN
    SELECT @SQLSTR = 'UPDATE ' + @TargetTable + 
                        ' SET ' + @TargetColumn + ' = ' + cast(cast(COALESCE(@FunctionValue, @Value) as int) as varchar(255)) + 
                         ' '
END;

我也将“转换为整数”的操作移到了 coalesce() 之外。

2

您正在进行'varchar'和'int'的转换,但没有明确转换类型。当发生这种情况时,具有最高优先级的数据类型获胜。在这种情况下,Int的优先级高于varchar,因此整个语句变为Int。而未经明确转换将int转换为varchar是不允许的。

尝试在Int值周围包装一个'CAST ... as VARCHAR':

CAST(COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) AS NVARCHAR(255))

有关数据类型优先级列表,请参见http://technet.microsoft.com/zh-cn/library/ms190309(v=sql.105).aspx

希望这可以帮到您。


谢谢,不过虽然这很有道理,但我仍然遇到了错误。 - hermann
啊,抱歉我看到你使用的是nvarchar而不是varchar。你可能需要将其转换为NVARCHAR(xxx),其中xxx是您所需数据的大小。您遇到的是同样的错误吗? - Rodders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接