I have a warehouse table with 16 tons of data in it. I have a few Integer columns in it. We have to cast these into BIGINT for every query we write, because the SUM is too large to fit in an INT.
We now have a new datamart under development. So we thought, why not change all these columns into BIGINT and we have less to worry for the new set of queries.
Since the data is already loaded, I figured I would use Management Studio and change the data type. But I first get a warning:
Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.
Then I get an error:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
How do I get around this?
I think the main error you maybe running into is that the GUI is what is timing out. When you apply a big change using the Modify selection from SSMS it will timeout. If you take the same command by generating the change script in SSMS and then run as a straight SQL query it will run until completed.
to expand on OrbMan's answer:
Also, to see all the work that Management studio does when you change a table, click on the toolbar icon that looks like scroll with a diskette on it. This will show the actual SQL commands used to alter your table.
This technique worked really nicely for me.
I executed:
This resulted in this error because there was a constraint on the key:
Not to be deterred, in SQL Server Management Studio I right clicked on the constraint PK_USER_USER_ID, then selected "Script key as >> Drop and Create To >> New Query Editor Window":
This generated this script:
I then executed the first half of this script, to drop the constraint:
Now that the constraint was gone, the original change worked nicely:
I then executed the second half of the script, to add the constraint back in:
If one or more of those columns have no constraints against them (like a foreign key, index, default, rule, etc), you should be able to change each one quickly by doing
ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint
Management Studio's change SQL is rarely the most efficient and tends to favour temporary tables for anything modifying an existing column.
Not sure if this will help, but try this:
If the source data never goes over INT limit, just make a VIEW that upcasts that column to BIGINT and query against that.