你知道这里有什么不对吗?
所有变量都是nvarchar。 当@FunctionValue包含字符串格式的INT时,会发生错误。
IF @TargetType = 'INT'
BEGIN
SELECT @SQLSTR = 'UPDATE ' + @TargetTable +
' SET ' + @TargetColumn + ' = ' + COALESCE(CAST(@FunctionValue AS INT), CAST(@Value AS INT)) +
' '
END
答案 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
希望这有帮助