Cierto, no me había fijado antes, 'T.CODIGO' lo está interpretando como una cadena de caracteres.
No estoy seguro de que lo que pretendes con ese if se pueda hacer de esa manera, pues como bien has dicho en la última frase no puedes comparar una variable (en este caso un parámetro de entrada) con una columna entera de una tabla.
Puedes hacerlo con un EXISTS como te dije en el SP que puse más arriba:
Código SQL
[-]CREATE PROCEDURE SP_UPDATEORINSERT2(
codigo VARCHAR(20),
nombre VARCHAR(50),
precio NUMERIC(10,4),
AS
DECLARE VARIABLE COD VARCHAR(20);
BEGIN
SELECT A.CODIGO
FROM TABLA2 A
WHERE NOT EXISTS (SELECT B.CODIGO FROM TABLANUEVA B WHERE B.CODIGO=A.CODIGO)
INTO :COD
Esta consulta mira si ya existe el codigo en la tabla, y entonces haces un if:
Código SQL
[-]IF :COD IS NULL THEN
INSERT INTO TABLANUEVA.....
ELSE
UPDATE TABLANUEVA.....
si :COD es null haces el INSERT, si no haces el UPDATE. A ver así que tal.