Los errores que se producen como resultado de la recompilación por lotes después de la resolución de nombres diferida no se pueden detectar en el mismo nivel en el que se produce el error. Una solución es envolver el DDL en SQL dinámico:
BEGIN TRY
EXEC(N'ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);');
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1779
BEGIN
--handle expected errors
PRINT 'Primary Key already exists. ';
END
ELSE
BEGIN
--raise other unexpected errors
THROW;
END;
END CATCH;