This code is tested and it works:
Create a cursor that selects all of the table/column names where column = ID (we didn't need a column variable since you are only targeting 'ID', but I included it in case you or someone else needs more functionality).
Once you have that information stored, you can loop through the cursor and execute the dynamic SQL. Note that this is susceptible to SQL-injection, as is the case with practically all dynamic SQL.
This approach will give you a separate datatable for each table that has a column ID - even if there are no ID columns that meet your conditions (you'll just get a blank datatable for those).
Also, you can change the size of the variables as needed.
Please let me know if you need any clarification or modifications.
DECLARE @TableName varchar(255), @ColumnName varchar(255), @SQL varchar(1000)
DECLARE TempCursor CURSOR FOR
SELECT T.[name] AS [TableName], C.[name] AS [ColumnName]
FROM sys.tables T
JOIN sys.columns C
ON T.object_id = C.object_id
WHERE C.[name] = 'ID'
OPEN TempCursor
FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'SELECT * FROM ' + @TableName
SET @SQL = @SQL + ' WHERE ' + @ColumnName + ' like ''a%'''
EXECUTE (@SQL)
FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName
END
CLOSE TempCursor
DEALLOCATE TempCursor