That's really a bad idea, I don't understand why you need to do so, and it can't be done the way you are looking for, but if you going to do this, I suggest to declare 24 variable + 1 for the RowID
.
For example:
CREATE PROCEDURE MyProc
@RowID INT,
@Col1 VARCHAR(45),
@Col2 INT
-- In your case you will need 24 variable, each one represent a value for a column
AS
BEGIN
--Optional: Check if @RowID IS NULL and RAISERROR first
DECLARE @SQL NVARCHAR(MAX) = N'UPDATE [T]
SET [Col1] = ISNULL(@Col1, Col1),
[Col2] = ISNULL(@Col2, Col2)
WHERE [RowID] = @RowID';
EXECUTE sp_executesql @SQL,
N'@Col1 VARCHAR(45), @Col2 INT, @RowID INT',
@Col1,
@Col2,
@RowID;
END
Then call your procedure, and pass NULL
s for columns you don't want to be updated. That's the only way I can think of it.
Sample Demo
UPDATE:
You don't even need for DynamicSQL, so your SP
may looks like
CREATE PROCEDURE MyProc
@RowID INT,
@Col1 VARCHAR(45),
@Col2 INT
-- In your case you will need 24 variable, each one represent a value for a column
AS
BEGIN
--Optional: Check if @RowID IS NULL and RAISERROR ROLLBACK TRANSACTION
UPDATE T
SET Col1 = ISNULL(@Col1, Col1),
Col2 = ISNULL(@Col2, Col2)
WHERE RowID = @RowID;
END