SQL Server попытается преобразовать столбец nvarchar в целое число, соответствующее литеральному типу идентификатора, и, как вы видели, он не будет летать - вместо этого вам нужно будет передать идентификатор как литерал nvarchar.Один из способов сделать это - заключить в одинарные кавычки и N
:
Data = pd.read_sql_query("SELECT * from Data where [ID] = N'" + id + "'" ,engine)
Но такие методы работы со строками делают ваш код уязвимым для атак SQL-инъекций.Лучше было бы передать идентификатор в качестве параметра:
Data = pd.read_sql_query("SELECT * from Data where [ID] = %s", engine, params=(id,))