Procédure stockée EXEC vs sp_executesql différence?

J'ai écrit deux procédure stockée avec un sp_executesql et d'autres n'ont pas sp_executesql
les deux sont en cours d'exécution correctement mêmes résultats, je n'ai pas quelle est la différence entre

EXEC (@SQL) vs EXEC sp_executesql @SQL, N'@eStatus de type varchar(12)',
@eStatus = @Status

et Comment EXEC(@SQL) est sujette à l'injection SQL et sp_executesql @SQL...... n'est-ce pas?

Ci-dessous la Procédure Stockée sans sp_executesql

ALTER proc USP_GetEmpByStatus
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print (@SQL)
EXEC (@SQL)
END

EXEC USP_GetEmpByStatus 'Active'

Ci-dessous la procédure stockée avec sp_executesql

create proc USP_GetEmpByStatusWithSpExcute
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'JProCo.dbo.Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print @SQL
exec sp_executesql @SQL, N'@eStatus varchar(12)', @eStatus = @Status
END

EXEC USP_GetEmpByStatusWithSpExcute 'Active'