It can only be done through dynamic SQL in the stored procedure (as Brad has alreayd answered, but of course you'd use QUOTENAME(@columnName)
to properly protect against SQL injection, and use a sysname
parameter type). If you go down that path, I recommend you read up first The Curse and Blessings of Dynamic SQL.
Updated:
I had to post code, since Brad's code has just too many mistakes.
create procedure myCustomUpdate
@columnName sysname,
@value sql_variant,
@id int
AS
declare @sql NVARCHAR(max);
set @sql = N'UPDATE SomeTable SET ' + QUOTENAME(@columnName)
+ N' = @value WHERE TableId = @id';
exec sp_executesql @sql, N'@value sql_variant, @id int', @value, @id;