About Me

My photo
Mumbai, Maharastra, India
He has more than 7.6 years of experience in the software development. He has spent most of the times in web/desktop application development. He has sound knowledge in various database concepts. You can reach him at viki.keshari@gmail.com https://www.linkedin.com/in/vikrammahapatra/ https://twitter.com/VikramMahapatra http://www.facebook.com/viki.keshari

Search This Blog

Showing posts with label Cursor. Show all posts
Showing posts with label Cursor. Show all posts

Saturday, June 8, 2013

MERGE WHEN MATCHED


MERGE statement can be use to modify data in a target table based on data in a source table. Merge joins the target to the source by using a column common in both tables, such as parent-child key column. You can then insert, modify, or delete data from the target table, all in one statement, according to how the rows match up as a result of the join.

The MERGE statement comes up with many clauses that facilitate the different types of data modifications.
In the first part of article we will look the When MATCHED clause later in next part we will see When NOT MATCHED [Source]/[Target] .

To facilitate our article, let’s take an example and demonstrate how it work, we are here creating two tables MarblesCounts_KancheKhelega as target table and MarblePurchased_ChalKancheLene as source table

create table dbo.MarblesCounts_KancheKhelega  -- target
(
  marble_id int not null primary key,
  marble_color varchar(40) not null ,
  marble_count int not null
    constraint MarbleCount_Default_1 default 0
);
Command(s) completed successfully.

create table dbo.MarblePurchased_ChalKancheLene  -- source
(
  marble_id int not null primary key,
  marble_color varchar(40) not null,
  marble_count int not null
    constraint MarbleCount_Default_2 default 0
);

Tables are in place let’s inserts few records in it.

insert into MarblesCounts_KancheKhelega values
  (1, 'White wale bade Kanche', 6),
  (2, 'Pale Yellow wale Dimond Kanche', 3),
  (3, 'Red Ramesh ke kanche', 0),
  (5, 'Green Suresh ke churaye kanche', 0),
  (6, 'Purple Kamal se jite kanche', 0),
  (8, 'Blue har game jitane wala lucky kanche', 4);
(6 row(s) affected)

insert MarblePurchased_ChalKancheLene values
  (1, 'White wale bade Kanche', 3),
  (3, 'Red Ramesh ke kanche', 0),
  (4, 'Grey bade unlucky kanche', 4),
  (5, 'Green Suresh ke churaye kanche', 5),
  (7, 'Silver bade expensive Kanche', 8);
(5 row(s) affected)

Querying the table to see the inserted records.

select * from  MarblesCounts_KancheKhelega

marble_id   marble_color                             marble_count
----------- ---------------------------------------- ------------
1           White wale bade Kanche                   6
2           Pale Yellow wale Dimond Kanche           3
3           Red Ramesh ke kanche                     0
5           Green Suresh ke churaye kanche           0
6           Purple Kamal se jite kanche              0
8           Blue har game jitane wala lucky kanche   4

select * from MarblePurchased_ChalKancheLene

marble_id   marble_color                             marble_count
----------- ---------------------------------------- ------------
1           White wale bade Kanche                   3
3           Red Ramesh ke kanche                     0
4           Grey bade unlucky kanche                 4
5           Green Suresh ke churaye kanche           5
7           Silver bade expensive Kanche             8

Since we have table with data pupulated, now it is the time to jump into MERGE and see how it works
WHEN MATCHED Clause

The first MERGE clause we’ll look at is WHEN MATCHED. You should use this clause when you want to update or delete rows in the target table that match rows in the source table. Rows are considered matching when the joined column values are the same.

For example, if the marble_id value in the MarblesCounts_KancheKhelega table matches the marble_id  value in the MarblePurchased_ChalKancheLene table, the rows are considered to match, regardless of the other values in the matching rows. When rows do match, you can use the WHEN MATCHED clause to modify data in the target table. Lets look at an example to demonstrate how this works.

In the following MERGE statement, I join the MarblesCounts_KancheKhelega table (the target) to the MarblePurchased_ChalKancheLene table (the source) and then use a WHEN MATCHED clause to update the marble_count column in the target table:

merge MarblesCounts_KancheKhelega kc
using MarblePurchased_ChalKancheLene ckk
on kc.marble_id = ckk.marble_id
when MATCHED then
  update
  set kc.marble_count = kc.marble_count + ckk.marble_count;

select * from MarblesCounts_KancheKhelega;

marble_id   marble_color                             marble_count
----------- ---------------------------------------- ------------
1           White wale bade Kanche                   9
2           Pale Yellow wale Dimond Kanche           3
3           Red Ramesh ke kanche                     0
5           Green Suresh ke churaye kanche           5
6           Purple Kamal se jite kanche              0
8           Blue har game jitane wala lucky kanche   4

(6 row(s) affected)

Suppose you want to remove from the MarblesCounts_KancheKhelega table any marble whose Quantity value is 0 in both the target and source tables. You can easily delete such rows by adding a second WHEN MATCHED clause to your MATCH statement, as shown in the following example

merge MarblesCounts_KancheKhelega kc
using MarblePurchased_ChalKancheLene ckk
on kc.marble_id = ckk.marble_id
when MATCHED AND
  kc.marble_count + ckk.marble_count = 0 then
  delete
when MATCHED then
  update
  set kc.marble_count = kc.marble_count + ckk.marble_count;

select * from MarblesCounts_KancheKhelega;

marble_id   marble_color                             marble_count
----------- ---------------------------------------- ------------
1           White wale bade Kanche                   12
2           Pale Yellow wale Dimond Kanche           3
5           Green Suresh ke churaye kanche           10
6           Purple Kamal se jite kanche              0
8           Blue har game jitane wala lucky kanche   4

(5 row(s) affected)

So here we can see those records whose marble_id matched in both the table and whose sum of marble count in MarblesCounts_KancheKhelega and MarblePurchased_ChalKancheLene are removed.

Programming is the fuel of Saturday and Sunday 

Post Reference: Vikram Aristocratic Elfin Share

Tuesday, May 22, 2012

Cursoring CTE : Using Cursor with CTE


When I tried to create cursor with the result of CTE, I was greated with the following error:

Incorrect syntax near the keyword 'declare'.

My piece of code was like below:

with myCTE(objId, name) as
(
      select top 5 object_id, name from sys.columns
)

declare myCur cursor for
Select objId, name From myCTE

Msg 156, Level 15, State 1, Line 6
Incorrect syntax near the keyword 'declare'.

This means my expected syntax was incorrect, after a few minute of google I found in one of the blog that  the declare cursor statement needs to be on the top of CTE declarations. So, here’s the correct syntax to define cursor with CTEs:

declare @objId int
declare @name varchar(10)

declare myCur cursor for
with myCTE(objId, name) as
(
      select top 4 object_id, name from sys.columns
)
Select objId, name From myCTE

Open myCur
Fetch next from myCur into @objId, @name

while @@fetch_status <> -1
begin
    print @objId
      print @name
      Fetch next from myCur into @objId, @name
end

close myCur
deallocate myCur
------------OUTPUT---------
117575457
xserver_na
117575457
xdttm_ins
117575457
xdttm_last
117575457
xfallback_

cool finicky learn… 

Post Reference: Vikram Aristocratic Elfin Share

Sunday, June 12, 2011

Fun with CURSOR, print all your SP

Use cursor to print all stored procedure in your database as a text. Use the code below to get all your SP in current database.

USE MyDatabase
GO
DECLARE @proc_Name VARCHAR(100)

DECLARE @mySP_cursor CURSOR FOR
SELECT s.name FROM sysobjects s WHERE type = 'P'

OPEN @mySP_cursor 
FETCH NEXT FROM @mySP_cursor  INTO @proc_Name

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_HelpText @procName
    FETCH NEXT FROM @mySP_cursor  INTO @proc_Name
END
CLOSE @mySP_cursor 
DEALLOCATE @mySP_cursor 
GO 


Happy coding... :)

Post Reference: Vikram Aristocratic Elfin Share