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

时间:2013-05-14 10:50:38

标签: sql sql-server tsql

你知道这里有什么不对吗?

所有变量都是nvarchar。 当@FunctionValue包含字符串格式的INT时,会发生错误。

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

2 个答案:

答案 0 :(得分: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()之外移动了“cast to int”。

答案 1 :(得分: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/en-us/library/ms190309(v=sql.105).aspx

希望这有帮助