5

你知道这里有什么问题吗?

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

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

2 回答 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;

我还将“cast to int”移到coalesce().

于 2013-05-14T11:09:26.540 回答
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

希望这可以帮助

于 2013-05-14T10:59:50.830 回答