January 8, 2020 at 11:18 am
Hi, there is a requirement for me to clear all the tables of the database which I am using now. There are around 100 tables in the database. Lots of unwanted data is inserted to these tables, it needs to be cleared. Most of the tables have IDENTITY (1,1) property assigned on the ID column.
I found like the following scripts will clear the data and the identity of the ID column in each table will start from 1.
Kindly advise me whether this will work or suggest if there is a better way. Thanks.
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO
January 8, 2020 at 11:45 am
I can't see why that wouldn't work. But don't take my word for it - have you actually tried it? Bear in mind that sp_MSForEachTable is an undocumented stored procedure. That doesn't mean that you shouldn't use it - just bear in mind that it could change or be removed from the product at an time, however unlikely that may be.
John
January 8, 2020 at 1:31 pm
I wouldn't worry about sp_MSForEachTable going away.
However, if we're really doing this all the time, nuking the entire database. What about just having an empty one available and run a restore. That will take a lot less time even than this. Especially for an empty database. It'll be safer and faster. The only gotcha would be that as the data structures change, you'll have to ensure that you get updated backups of your empty database.
Alternatively, even better I'd say, since your database code is all in source control (right?), just drop the database and recreate it on the spot. That would work even better than the backup plan. Less maintenance and headache.
BTW, if you said "no" that your database was not in source control, there's today's project.
"The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood"
- Theodore Roosevelt
Author of:
SQL Server Execution Plans
SQL Server Query Performance Tuning
January 8, 2020 at 2:06 pm
Another possibility is extracting a DACPAC for the DB in question and building an empty one from that.
The absence of evidence is not evidence of absence.
Martin Rees
You can lead a horse to water, but a pencil must be lead.
Stan Laurel
January 8, 2020 at 2:30 pm
Another possibility is extracting a DACPAC for the DB in question and building an empty one from that.
I generally dislike DACPAC, but this might be a great use of it.
"The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood"
- Theodore Roosevelt
Author of:
SQL Server Execution Plans
SQL Server Query Performance Tuning
January 8, 2020 at 4:06 pm
Phil Parkin wrote:Another possibility is extracting a DACPAC for the DB in question and building an empty one from that.
I generally dislike DACPAC, but this might be a great use of it.
Using sqlpackage: https://docs.microsoft.com/en-us/sql/tools/sqlpackage?view=sql-server-ver15
an extract followed by publish
January 8, 2020 at 9:50 pm
If you TRUNCATE all tables, you better have a script handy to repopulate ALL your necessary reference tables. 😉
--Jeff Moden
Change is inevitable... Change for the better is not.
January 8, 2020 at 11:28 pm
If you TRUNCATE all tables, you better have a script handy to repopulate ALL your necessary reference tables. 😉
Aren't those already in source control too?
"The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood"
- Theodore Roosevelt
Author of:
SQL Server Execution Plans
SQL Server Query Performance Tuning
January 9, 2020 at 9:51 am
DELETE will be happening as TRUNCATE is not supported, even though I disabled the table constraints. Si I have replaced DELETE instead of TRUNCATE.
I have tested this script by executing in my local database & it is working fine. DELETE is working & it has cleared data from all the tables.
I have taken backup of the database before executing this script.
January 9, 2020 at 1:13 pm
I submitted a script to truncate tables that have referencing foreign keys. It doesn't do anything with triggers though I'm sure it can fairly easily be amended to do that. You just call the SP with the table name and schema and it will truncate the table and recreate the foreign keys. When you truncate a table it resets the identity columns, delete does not do this, also truncate can be orders of magnitude faster than a delete.
January 9, 2020 at 4:17 pm
I use a very archaic method -
select 'delete from '+name from sys.tables where type='u' and name <>'sysdiagrams' and name not in (lookuptable1','lookuptable2'..... etc)
copy the results into excel and put them in the right order for your foreign keys - then save your script and execute it.....
I know it's old, but the first time you run your script it will show you your dependencies and force you into a really simple script you can re-use as a proc and a sql agent job
do the same script with dbcc checkident (reseed) and you can reseed only the tables you choose in your where clause
like I said it's archaic but it's been with me since sql 6.5
MVDBA
January 10, 2020 at 9:27 am
Thanks for the replies. From your expert comments, I could reckon that the query I am using can be changed to the following one, which will serve my purpose.
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
-----Will execute the following query for reseting the identity for the tables which need to reset the existing identuty value
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
-------------------------------------------------------------------------------------------------------------------------------
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO
January 10, 2020 at 9:33 am
All you've done is change TRUNCATE to DELETE, right? That's going to run slower and use more log space, and mean you have to do the extra step of reseeding the identities. How many tables need to have the identity reseeded and how many need to have it left as it is?
John
January 10, 2020 at 9:40 am
All you've done is change TRUNCATE to DELETE, right? That's going to run slower and use more log space, and mean you have to do the extra step of reseeding the identities. How many tables need to have the identity reseeded and how many need to have it left as it is?
John
that was kind of why I do it my way - what if someone adds a new table (doesn't tell you)
you can easily stick a small script in at the end to show which tables still have data (then go and shout at someone for not giving you release notes 🙂 )
MVDBA
January 10, 2020 at 12:02 pm
Yes, I am replacing TRUNCATE with DELETE. There are around 150 tables in total & for around 80 tables I have to reset the identity. Rest, of the tables, I can leave as it is.
Viewing 15 posts - 1 through 15 (of 16 total)
You must be logged in to reply to this topic. Login to reply