Try something like this:
DECLARE @cols NVARCHAR(300)
DECLARE @dt NVARCHAR(1000)
DECLARE @pt NVARCHAR(2000)
SET @cols = STUFF((SELECT DISTINCT '],[' + [Name]
FROM A
ORDER BY '],[' + [Name]
FOR XML PATH('')),1,2,'') + ']'
SET @dt = 'SELECT B.[ID], B.[Text], B.[Value] ' +
'FROM A LEFT JOIN B ON A.[ID] = B.[ID] '
SET @pt = 'SELECT [ID], ' + @cols + ' ' +
'FROM (' + @dt + ') AS DT ' +
'PIVOT(MAX([Value]) FOR [Text] IN (' + @cols + ')) AS PT ' +
'ORDER BY [ID]'
EXEC(@pt)