Pelo menos um problema:você deve cercar seu valor de string com aspas simples e, para escapar daqueles dentro de uma string, você precisa dobrá-los:
WHERE ' + @pi_colName + ' = ''' + @pi_colValue + ''' AND ...
Você também pode declarar sua variável @sql como algo maior que 100 caracteres! Parece que sua string está sendo truncada.
Se os valores possíveis para @pi_colName forem finitos, o tipo de dados é sempre string e as colunas são compatíveis com agrupamento, você pode fazer algo assim e evitar SQL dinâmico:
SELECT ...
WHERE CASE @pi_colName
WHEN 'col1' THEN col1
WHEN 'col2' THEN col2
END = @pi_ColValue;