La requête dynamique est la (seule) solution et ce n'est pas si compliqué :
DECLARE @query NVARCHAR(MAX) = '';
SELECT @query = @query + '
UNION
SELECT ItemID, Price, Size, Formula, ' + Formula + ' AS CalcValue FROM YourTable WHERE Formula = ''' + Formula + ''' '
FROM YourTable;
SET @query = STUFF(@query,1,8,'');
PRINT @query;
EXEC (@query);
Mais vous devez être conscient du risque d'erreurs. Si la valeur de la colonne Formule n'est pas valide, la requête de formule s'interrompt.
modifier :aller avec UNION
au lieu de UNION ALL
car la même formule apparaît sur plusieurs lignes
modifier2 :Plan B - Au lieu d'exécuter plusieurs requêtes de sélection identiques et de différencier les résultats, il est préférable de créer des formules distinctes au début :
DECLARE @query NVARCHAR(MAX) = '';
WITH CTE_DistinctFormulas AS
(
SELECT DISTINCT Formula FROM YourTable
)
SELECT @query = @query + '
UNION ALL
SELECT ItemID, Price, Size, Formula, ' + Formula + ' AS CalcValue FROM YourTable WHERE Formula = ''' + Formula + ''' '
FROM CTE_DistinctFormulas;
SET @query = STUFF(@query,1,12,'');
PRINT @query;
EXEC (@query);
SQLFiddle DEMO 2 - ajout de quelques lignes supplémentaires