September 6, 2018 at 9:01 pm
dear Friends,
Kindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the it
i have 10 table that need to be deleted, and before that I insert into History_table, with this syntax
DECLARE @name as varchar(500)
DECLARE @sql as varchar(500)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM A
WHERE status = 'over_6months' and [type]='u'
--where name ='ta_B_AFFINITY_BUILD_TEST_Tes_Prod_PDS_S_MQ'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
--print @name
set @sql = 'INSERT INTO HISTORY_TABLE select * , ''' + @name +''' ,''INSERT'' AS [ACTION] ,suser_name() as [USER_NAME] ,getdate() as deletion_time FROM ' + @name
print @sql
--exec(@sql)
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
After that code, I want to make another syntax when the record at table A = table B then Delete table A
how to create it ?
thank you
September 7, 2018 at 11:33 am
Please post create table script and insert script with sample data, you've provided what you've tried already, and desired result.
September 9, 2018 at 8:42 pm
Joe Torre - Friday, September 7, 2018 11:33 AMPlease post create table script and insert script with sample data, you've provided what you've tried already, and desired result.
Hi Joe,
First thing first, I search the Table with condition over 6 months..here is the scripts
select
[STATUS] = CASE WHEN CONVERT(VARCHAR(8),MODIFY_dATE,112) < DATEADD(MONTH, -6, GETDATE()) THEN 'OVER_6MONTHS' ELSE 'STILL_USE' END, *
into Temp_Table
--SELECT *
from sys.tables
where type = 'u'
and [NAME] LIKE 'BCK_TA_%'
OR [NAME] LIKE 'TA_%'
--AND CASE CONVERT(VARCHAR(8),MODIFY_DATE,112) = WHEN MODIFY_dATE > DATEADD(MONTH, -6, GETDATE()) THEN 'OVER_6MONTHS' ELSE 'STILL_USE' END
ORDER BY NAME ASC
after that, I create History_table to insert table_name+ Rows:
CREATE TABLE [dbo].[Table_History](
[record_id] [int] NOT NULL,
[contact_info] [varchar](128) NOT NULL,
[contact_info_type] [int] NOT NULL,
[record_type] [int] NOT NULL,
[record_status] [int] NOT NULL,
[call_result] [int] NULL,
[attempt] [int] NOT NULL,
[dial_sched_time] [int] NULL,
[call_time] [int] NULL,
[daily_from] [int] NOT NULL,
[daily_till] [int] NOT NULL,
[tz_dbid] [int] NOT NULL,
[campaign_id] [int] NULL,
[agent_id] [varchar](32) NULL,
[chain_id] [int] NOT NULL,
[chain_n] [int] NOT NULL,
[group_id] [int] NULL,
[app_id] [int] NULL,
[treatments] [varchar](255) NULL,
[media_ref] [int] NULL,
[email_subject] [varchar](255) NULL,
[email_template_id] [int] NULL,
[switch_id] [int] NULL,
[anp] [float] NULL,
[citas_call_id] [varchar](5) NULL,
[citas_campaign_id] [varchar](6) NULL,
[contact_name] [varchar](50) NULL,
[custom_float_1] [float] NULL,
[custom_float_2] [float] NULL,
[custom_int_1] [int] NULL,
[custom_int_2] [int] NULL,
[custom_varchar_1] [varchar](50) NULL,
[custom_varchar_2] [varchar](50) NULL,
[custom_varchar_3] [varchar](50) NULL,
[policy_id] [varchar](100) NULL,
[premium] [float] NULL,
[product_id] [varchar](50) NULL,
[prospect_id] [varchar](20) NULL,
[sponsor_id] [varchar](10) NULL,
[sponsor_name] [varchar](60) NULL,
[table_name] [varchar](200) NULL,
[Action] varchar (20) Not Null,
[user_name] [varchar](100) NOT NULL,
[deletion] [datetime] NULL,
CONSTRAINT [TABLE_HISTORY_PK] PRIMARY KEY CLUSTERED
(
[chain_id] ASC,
[chain_n] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
[record_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
this is the sample data:
Now I insert the table ta_G_UM_Cashback_WBK_IZ_JUL17 into History_table with syntax:
DECLARE @name as varchar(500)
DECLARE @sql as varchar(500)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM A
WHERE status = 'over_6months' and [type]='u'
--where name ='ta_B_AFFINITY_BUILD_TEST_Tes_Prod_PDS_S_MQ'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
--print @name
set @sql = 'INSERT INTO HISTORY_TABLE select * , ''' + @name +''' ,''INSERT'' AS [ACTION] ,suser_name() as [USER_NAME] ,getdate() as deletion_time FROM ' + @name
print @sql
--exec(@sql)
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
the Question: after I've done with that steps,,I want to validate the Rows data..between [ta_G_UM_Cashback_WBK_IZ_JUL17] at sys.tables = [ta_G_UM_Cashback_WBK_IZ_JUL17] at History_Table..
If RowCount at sys.tables.[ta_G_UM_Cashback_WBK_IZ_JUL17] = Rowcount at History_Table.[ta_G_UM_Cashback_WBK_IZ_JUL17]
then Delete the sys.tables.[ta_G_UM_Cashback_WBK_IZ_JUL17]
how to validate it ?
All of table that I want to delete from sys.tables have the same columns name..
thank you
September 10, 2018 at 7:09 am
1- In your WHILE loop use EXECUTE sp_executeSQL instead of EXEC.
Reference: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017
2- Capture the error from your insert statement execution
3a- If no error happened, then create a dynamic SQL statement for the deletion
3b- If error happened, skip over deletion
If A is a temporary table for your first script where you capture the names, then you can replace your cursor with following approach:
1- Capture relevant rows into temporary table A
2- Delete irrelevant rows from temporary table where status <> 'over_6months'
3- WHILE EXISTS (SELECT 1 FROM A) BEGIN .... END
3A- Dynamic SQL to insert into history table
3Ba- if successful then dynamic SQL to drop originating table and pass execution time as output parameter
3Bb- update history table with execution time parameter on column deletion (I think that is what this column is for)
3C- dynamic SQL to delete name of originating table from temporary table A
The WHILE loop processes each table on its own and table A will have 0 rows at the end.
September 10, 2018 at 8:04 am
unas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the it
That cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
--Jeff Moden
Change is inevitable... Change for the better is not.
September 10, 2018 at 8:24 am
Jeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
SQL DBA,SQL Server MVP(07, 08, 09) "It's a dog-eat-dog world, and I'm wearing Milk-Bone underwear." "Norm", on "Cheers". Also from "Cheers", from "Carla": "You need to know 3 things about Tortelli men: Tortelli men draw women like flies; Tortelli men treat women like flies; Tortelli men's brains are in their flies".
September 11, 2018 at 2:13 am
ScottPletcher - Monday, September 10, 2018 8:24 AMJeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
My mistake im sorry..when table A have been copied to B all of rows and columns..then delete it..
But before I delete it, I want to make sure if total rows in table A = total rows in table B
September 11, 2018 at 5:42 am
unas_sasing - Tuesday, September 11, 2018 2:13 AMScottPletcher - Monday, September 10, 2018 8:24 AMJeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
My mistake im sorry..when table A have been copied to B all of rows and columns..then delete it..
But before I delete it, I want to make sure if total rows in table A = total rows in table B
We need another piece of information. Is there a combination of columns that will make a unique key for Table A? Of is the whole row the key? I'm assuming at this point that Table B is your "history" table.
--Jeff Moden
Change is inevitable... Change for the better is not.
September 11, 2018 at 9:34 am
Jeff Moden - Tuesday, September 11, 2018 5:42 AMunas_sasing - Tuesday, September 11, 2018 2:13 AMScottPletcher - Monday, September 10, 2018 8:24 AMJeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
My mistake im sorry..when table A have been copied to B all of rows and columns..then delete it..
But before I delete it, I want to make sure if total rows in table A = total rows in table BWe need another piece of information. Is there a combination of columns that will make a unique key for Table A? Of is the whole row the key? I'm assuming at this point that Table B is your "history" table.
Why does table B has no name column for which table A's have been deleted?
If it would have then the condition to check (if successful deletion is not good enough) before deletion is to count / sum from table A and compare to records for table A in table B.
September 11, 2018 at 9:32 pm
Jeff Moden - Tuesday, September 11, 2018 5:42 AMunas_sasing - Tuesday, September 11, 2018 2:13 AMScottPletcher - Monday, September 10, 2018 8:24 AMJeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
My mistake im sorry..when table A have been copied to B all of rows and columns..then delete it..
But before I delete it, I want to make sure if total rows in table A = total rows in table BWe need another piece of information. Is there a combination of columns that will make a unique key for Table A? Of is the whole row the key? I'm assuming at this point that Table B is your "history" table.
Table B is the history_table and it should as same as table A (columns name,total rows)
Knut Boehnert - Tuesday, September 11, 2018 9:34 AMJeff Moden - Tuesday, September 11, 2018 5:42 AMunas_sasing - Tuesday, September 11, 2018 2:13 AMScottPletcher - Monday, September 10, 2018 8:24 AMJeff Moden - Monday, September 10, 2018 8:04 AMunas_sasing - Thursday, September 6, 2018 9:01 PMKindly help me, I want to make a syntax that compares if the number of rows in table A is the same as Table B, then delete table A, but if not,update table A then delete the itThat cannot be correct. Why would you update the table that you're going to delete? Did you mean that you wanted to update Table B from table A and then delete Table A? :blink:
I guess in theory you could have a trigger on the table that you want to fire with the appropriate update(s) before dropping the table(?).
My mistake im sorry..when table A have been copied to B all of rows and columns..then delete it..
But before I delete it, I want to make sure if total rows in table A = total rows in table BWe need another piece of information. Is there a combination of columns that will make a unique key for Table A? Of is the whole row the key? I'm assuming at this point that Table B is your "history" table.
Why does table B has no name column for which table A's have been deleted?
If it would have then the condition to check (if successful deletion is not good enough) before deletion is to count / sum from table A and compare to records for table A in table B.
All Columns in table B have the same column name like table A + Add new_columns with [table_name] [varchar](200) NULL, [Action] varchar (20) Not Null, [user_name] [varchar](100) NOT NULL, [deletion] [datetime] NULL
Like Jeff said table B is the History_Table for table A.
After all data in table A have been copied/insert to table B then I would like to delete table A because not being used anymore..
One day, if some users need it table A back, I could create this table A with all information in table B (Table_History)
September 12, 2018 at 12:55 pm
Something like:
Insert Into TableB
(
TableName,
cola,
colb,
colc,
user_name,
action,
deletion
)
Select
TableName,
cola,
colb,
colc,
suser_name(),
'INSERT',
GetDate()
(
Select 'TableA' As TableName, cola, colb, colc From TableA
Except
Select TableName, cola, colb, colc From TableB
) X
Drop TableA
Wrapped in a sensible Try/Catch handler just in case something goes wrong.
September 14, 2018 at 4:41 am
andycadley - Wednesday, September 12, 2018 12:55 PMSomething like:
Insert Into TableB
(
TableName,
cola,
colb,
colc,
user_name,
action,
deletion
)
Select
TableName,
cola,
colb,
colc,
suser_name(),
'INSERT',
GetDate()
(
Select 'TableA' As TableName, cola, colb, colc From TableA
Except
Select TableName, cola, colb, colc From TableB
) X
Drop TableAWrapped in a sensible Try/Catch handler just in case something goes wrong.
Dear all,
I have already found the syntax for insert the source table (A) into history_table (B).
And also delete table A if table A = table B
Please suggest me if there is something missing or any other suggestion
thank you
Here is the syntax:
--------------------------/*SYNTAX TO INSERT*/--------------------------------------------------------
if exists (select * From sys.objects where name like '%tampung%' and type ='u')
truncate table dbo.tampung --temp table that want to be deleted
INSERT INTO dbo.tampung
select
[STATUS] = CASE WHEN CONVERT(VARCHAR(8),MODIFY_dATE,112) < DATEADD(MONTH, -6, GETDATE()) THEN 'OVER_6MONTHS' ELSE 'STILL_USE' END,
*
--SELECT *
from sys.tables
where type = 'u'
and [NAME] LIKE 'BCK_TA_%'
OR [NAME] LIKE 'TA_%'
ORDER BY NAME ASC
DECLARE @name as nvarchar(max)
DECLARE @sql as nvarchar(max)
declare @rowcount as bigint;
DECLARE db_cursor CURSOR FOR
SELECT NAME FROM DBO.TAMPUNG --TEMPTABLE
WHERE status = 'over_6months' and [type]='u'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = N'SELECT @rowcount = count(1) FROM ' + quotename(@name)
PRINT @ROWCOUNT
--exec sp_executesql @sql, N'@rowcount int out', @rowcount out
IF @rowcount <> 0
BEGIN
set @sql = 'INSERT INTO table_history select * ,''' + @name +''' ,''INSERT'' AS [ACTION] ,suser_name() as [USER_NAME] ,getdate() as deletion FROM ' + @name
print @sql
--exec SP_EXECUTESQL @sql
end
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
------------------/*SYNTAX TO DELETE*/------------------------------------------------
--declare @rowcount as int;
declare @rowcount1 as int;
declare @name_SOURCE as varchar(500);
declare @name_HIST as Nvarchar(500);
--declare @sql as nvarchar(max);
declare @sql1 as nvarchar(max);
declare @sql2 as nvarchar(max);
SELECT @name_SOURCE = NAME FROM TAMPUNG WHERE [status] = 'over_6months' and [type]='u'
SELECT @NAME_HIST = TABLE_NAME FROM table_history WHERE TABLE_NAME = @name_SOURCE
PRINT @NAME_HIST
BEGIN
set @sql = N'SELECT @rowcount = count(1) FROM ' + quotename(@NAME_SOURCE)
set @sql1 = N'SELECT @rowcount1 = count(1) FROM ' + quotename(@NAME_HIST)
exec sp_executesql @sql, N'@rowcount int out', @rowcount out;
exec sp_executesql @sql1, N'@rowcount1 int out', @rowcount1 out;
PRINT CAST(@ROWCOUNT AS VARCHAR)+' TABLE_SOURCE';
PRINT CAST(@ROWCOUNT1 AS VARCHAR)+' TABLE_HIST';
IF @ROWCOUNT = @ROWCOUNT1
set @sql2 = 'DROP TABLE dbo.' +@name_SOURCE
ELSE
PRINT 'ERROR DELETING SOURCE TABLE '+@name_SOURCE
END
PRINT @SQL2
--exec @SQL2
September 14, 2018 at 7:32 am
This is procedural code instead of set-based code. This will work.
What I mean with this statement is you think in terms of single rows (cursor) instead of a data set of tables (temporary table of statements to execute).
If you do more database "stuff" feel free to learn the difference. Jeff's articles related to RBAR (also on this site) are the best start. There are others (just want to mention out of this pool the team around Brent Ozar).
Good for you to have worked it out yourself.
September 15, 2018 at 6:09 am
Knut Boehnert - Friday, September 14, 2018 7:32 AMThis is procedural code instead of set-based code. This will work.What I mean with this statement is you think in terms of single rows (cursor) instead of a data set of tables (temporary table of statements to execute).
If you do more database "stuff" feel free to learn the difference. Jeff's articles related to RBAR (also on this site) are the best start. There are others (just want to mention out of this pool the team around Brent Ozar).Good for you to have worked it out yourself.
Hai Knut,
I did want to make a prrocedural code and this SP will work at my production servers in future..
One minus thing at my insert syntax,,the empty tables cant include in there..i still figure it out..
Perhaps any other suggestions i welcome..
Thank you..
Viewing 14 posts - 1 through 13 (of 13 total)
You must be logged in to reply to this topic. Login to reply