Quick suggestion, add DISTINCT to the select otherwise the two data/entity nodes will always produce duplicate output
😎
DECLARE @XMLXML = '<xml as above>'
DECLARE @SQL nvarchar(max) =
'SELECT DISTINCT '
+(
SELECT ',''' + T.FieldValue+ ''' as '+quotename(T.FieldCode)
FROM (
SELECTT.X.value('@code', 'nvarchar(128)') as FieldCode
,T.X.value('@value', 'nvarchar(128)') as FieldValue
FROM@XML.nodes('/data/entity[1]/fields/field') as T(X)
) AS T
FOR XML PATH(''), TYPE
).value('substring(text()[1], 2)', 'nvarchar(max)')+' '+
' FROM @XML.nodes(''/data/entity'') as T(X)';
SELECT @SQL
exec sp_executesql @SQL, N'@XML xml', @XML;