Joe Webb

Musing and observations about SQL Server, other technogies, and sometimes just life in general
posts - 85, comments - 393, trackbacks - 0

My Links

News

This blog has moved!

Click here for the new location.

Follow me on Twitter
Add to Technorati Favorites

Search this Blog
 




Archives

Post Categories

About me

Adding a column to every table in a database

Despite the best laid plans, sometimes circumstances or project scope change and the definition of one or more tables in your database must be altered after they have been created. It's just a fact of life for a DBA.

Frequently these changes affect more than one database in your environment. The development, test, and eventually even the production databases must have their definitions updated to reflect the newly implemented changes.

For cases like this, I generally prefer to script out the necessary changes rather than using the Management Studio tools. Scripting reduces the likelihood of an unintentionally errant change while updating the 100+ tables in the database. If one database or table is done correctly, you can be assured that the rest are in order as well. That's not to say you shouldn't test; you should. But the changes will be much more consistent when they are implemented via a script rather than by hand.

Recently I was tasked with adding a column to every user table in a database. There were lots of tables in this database and doing it by hand was not a good alternative. Of course if the changes were successful in Dev, they would need to propagated to Test and Production as well. So, I used T-SQL to dynamically create a script for me.

There a number of ways to accomplish this. A cursor or a while loop come to mind. However, since I knew that the new column name did not exist in any of the tables, I could use a shortcut and make use of the sp_msforeachtable system stored procedure. I described its use in a prior blog.

The first step is to use the stored procedure to generate T-SQL code to implement the change. For this example, we want to add a datetime column called Date_Created to each table in the AdventureWorks database. In a new query window, type the following code.

USE AdventureWorks;
EXEC sp_msforeachtable
    'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;

When this script is executed, the Messages pane of the query window is filled with a list of DDL (Data Definition Language) statements to implement our change. The output is shown in the following figure.

AlterTable-2008-01-15

After reviewing these DDL statement to ensure they are indeed what we wish to do, we can then copy and paste them into a query window for execution.

Of course this implementation doesn't have error handling. If a column by that name already exists, the DDL statement will fail for that table. If you are unsure whether a column already exists, you should use one of the other implementations (cursor, while, etc) so you can check for the presence of the column before issuing the ALTER TABLE statement.

I hope you find this useful. If you have any favorite scripting techniques or comments on this one, please feel free to share in the comments section below.

Cheers!

Joe

kick it on DotNetKicks.com

Print | posted on Thursday, January 15, 2009 8:59 AM | Filed Under [ T-SQL ]

Feedback

Gravatar

# re: Adding a column to every table in a database

Just a thought - GetDate should never be used in a database, either explicitly or as a default. Even if your application only ever deals with one time-zone, you can still end up with ambiguous values when the clocks go back.
1/19/2009 7:35 AM | Richard
Gravatar

# re: Adding a column to every table in a database

Thanks for your article. While I do not specifically need to do this right now, I sincerely appreciate your approach to the problem. That helps me very much. Thanks again.
1/23/2009 9:07 AM | Stephen S Sibert
Gravatar

# re: Adding a column to every table in a database

To Richard:
You are completely right but in some cases database needs to deal with the time. I new one database a part of order processing system that was so tightly dependent on the time that if you run a stored procedure within 1 second 2 times you will see completely different effects. but there was no other choise except deal with application every time you need date, which whould slow down system in 1000 times
2/17/2009 8:27 AM | Remote DBA
Gravatar

# re: Adding a column to every table in a database

Great Idea, thank you, sp_msforeachtable looks very handy!

Unfortunately trying this in SQL 2005 studio, nothing prints besides "Command(s) completed successfully." in the messages window.
I think you may need to insert the table name into a temp table then use a second select statement to get all the actual ALTER TABLE commands printed out.
2/23/2009 12:20 PM | omhoge
Gravatar

# re: Adding a column to every table in a database

The way you've dealt with this issue is exemplary. I appreciate the fact that you've shared it so other people can benefit.
5/20/2009 6:22 PM | Paddy Power
Gravatar

# re: Adding a column to every table in a database

Bravo in the simplicity of such a powerful example. You saved me a bunch of time going forward in any development with this handy manipulation. Go eat some Oreos!
8/28/2009 10:53 AM | Mike Anderson
Gravatar

# re: Adding a column to every table in a database

Thanks for such a beautifully composed, informative article.I think your designing work to this is really great .I really appreciate your work to this site.So thanks for it.I hope you can continue this type of hard work to this site in future also..Because this blog is really very informative and it helps me lot.
3/22/2010 12:23 AM | Regeln von Slots
Gravatar

# re: Adding a column to every table in a database

Thanks Kevin & everyone for the kind words. I'm glad you've found this info useful.

By the way, I've moved my blog to a new location - http://www.webbtechsolutions.com/blog.
3/23/2010 7:41 AM | Joe Webb

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 5 and 6 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET