Au moins un problème :vous devez entourer votre valeur de chaîne de guillemets simples, et pour échapper ceux à l'intérieur d'une chaîne, vous devez les doubler :
WHERE ' + @pi_colName + ' = ''' + @pi_colValue + ''' AND ...
Vous pouvez également déclarer votre variable @sql comme quelque chose de plus de 100 caractères ! Il semble que votre chaîne soit tronquée.
Si les valeurs possibles pour @pi_colName sont finies, que le type de données est toujours une chaîne et que les colonnes sont compatibles avec le classement, vous pouvez faire quelque chose comme ceci et éviter le SQL dynamique :
SELECT ...
WHERE CASE @pi_colName
WHEN 'col1' THEN col1
WHEN 'col2' THEN col2
END = @pi_ColValue;