• Because altering a table is not as simple as altering a sproc.

    Altering a sproc is basically replacing it from the ground up. Altering a table is less simple. It can add, remove, or change columns. The system would have to assume that columns with the same name are being changed to a new data type. Which would work if we were all perfect, but the chance for human error increases exponential. A simple typo could result in one column being deleted (and all its data being lost), and a new column being created. And that would not allow for a column name change.

    It might be doable, with a more complex syntax, to allow for renaming of columns and prevent accidental data loss something like:

    CREATE TABLE MyTable

    ( MyInt int

    );

    ALTER TABLE MyTable

    ( [MyInt] => MyInt int

    , [] => MyChar varchar(50)

    );

    That explicitly maps the old columns to the new. If the old column is spelled wrong it could throw an error. And if the new column name is spelled wrong, at least the data is preserved and can be changed back at a later date.