El proceso almacenado "sp_executesql" espera que se ejecute un único parámetro de cadena @statement.
Su cadena está totalmente fuera de control aquí... necesita prefijar cualquier parte de cadena "fija" con una N'......' para convertirlas en cadenas Unicode, pero este definitivamente no es el caso aquí.
Creo que te gustaría probar esto:
DECLARE @a INT
DECLARE @b VARCHAR(2)
SET @a = 1
DECLARE @statement NVARCHAR(500)
WHILE @a < 30
BEGIN
SET @b = CAST(@a AS VARCHAR(2))
SET @statement =
N'update source_temp set pmt_90_day = pmt_90_day + ' +
'convert(money, ''trans_total_' + @b + ''') ' +
'where convert(datetime, ''effective_date_' + @b + ''')' +
' <= DATEADD(DAY, 90, ORSA_CHARGE_OFF_DATE) ' +
'and DRC_FLAG_' + @b + ' = ''C'''
exec sp_executesql @statement
SET @a = @a + 1
END
¿Funciona esto y hace lo que esperas que haga?
Explicación:la N'.........' delimita la cadena completa que contiene la instrucción SQL. Cualquier apóstrofe dentro que tenga que ser duplicado ("escapado"). Espero haber entendido tu lógica correctamente.
Marc