I reformatted the command a bit, I think the terse nature of PowerShell shorthand makes it harder to see the problem.
Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
Select-Object -unique FileName,Value
Your original command yields one output line for each MatchInfo returned by Select-String. A MatchInfo represents a matching line of the text file. I believe you are getting an array of values when a single line in the file contains more than one matching value.
I revised it to clarify that we want one output object for each RegexMatch in each MatchInfo, which is to say one output object for each matching value.
Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
Foreach-Object {
# $_ is MatchInfo for each matching line in file
$fileName = $_.FileName
$_.Matches | Foreach-Object {
# $_ is RegexMatch for each match in line
$_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
}
} | Select-Object -unique FileName,Value