SELECT Row that is added or removed during last query
I want to sync the table every few minutes to remote database, I want it to as efficient as possible. So I write this stored procedure that will only return rows that is added or removed after the last query.
Basically, this stored procedure will return something like this:
190107080001 | REMOVED | NULL | NULL | NULL | NULL | NULL |
190107080005 | ADDED | 225545 | Name2 | 5 | Specialist2 | 26 |
190107080108 | ADDED | 230139 | Name3 | 8 | Specialist3 | 44 |
Note: the [key]
is actually simple hashed value from the row itself, the remote database will use the [key]
as Identity,
Actually I do not have problem with this code until now, but I think my implementation is not effective enough considering I will execute this query 24/7.
CREATE PROCEDURE [dbo].[GetMonthlySchedules]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
----------------------------------------------------------------
-- Select new record and save it to temporary table
----------------------------------------------------------------
SELECT [key]
, id
, therapist
, therapistId
, specialist
, specialistId
INTO #Temp_MonthSchedule
FROM doc
INNER JOIN spe ON doc.specialistId = spe.Id
INNER JOIN lis ON doc.Id = lis.DocId
WHERE lis.Dt >= DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
AND lis.Dt <= DATEADD(mm, 1, DATEDIFF(dd, 0, GETDATE()))
----------------------------------------------------------------
-- Select the different between old and new records to return it later
----------------------------------------------------------------
SELECT ISNULL(old.[key], new.[key]) AS [key]
, CASE WHEN old.Id IS NULL THEN 'ADDED' WHEN new.Id IS NULL THEN 'REMOVED' END AS operation
, new.id, new.therapist, new.therapistId, new.specialist, new.specialistId
INTO #Temp_MonthScheduleDiff
FROM ComparerMonthSchedule AS old
FULL OUTER JOIN #Temp_MonthSchedule AS new
ON old.[key] = new.[key]
WHERE old.id IS NULL
OR new.id IS NULL
----------------------------------------------------------------
-- Replace old record with new record
----------------------------------------------------------------
DELETE FROM ComparerMonthSchedule
INSERT INTO ComparerMonthSchedule SELECT * FROM #Android_Temp_MonthSchedule
----------------------------------------------------------------
-- Return records
----------------------------------------------------------------
SELECT * FROM #Temp_MonthScheduleDiff
----------------------------------------------------------------
-- Delete temporal table
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#Temp_TodaySchedule') IS NOT NULL BEGIN DROP TABLE #Temp_TodaySchedule END;
IF OBJECT_ID('tempdb..#Temp_TodayScheduleDiff') IS NOT NULL BEGIN DROP TABLE #Temp_TodayScheduleDiff END;
END
performance sql sql-server
add a comment |
I want to sync the table every few minutes to remote database, I want it to as efficient as possible. So I write this stored procedure that will only return rows that is added or removed after the last query.
Basically, this stored procedure will return something like this:
190107080001 | REMOVED | NULL | NULL | NULL | NULL | NULL |
190107080005 | ADDED | 225545 | Name2 | 5 | Specialist2 | 26 |
190107080108 | ADDED | 230139 | Name3 | 8 | Specialist3 | 44 |
Note: the [key]
is actually simple hashed value from the row itself, the remote database will use the [key]
as Identity,
Actually I do not have problem with this code until now, but I think my implementation is not effective enough considering I will execute this query 24/7.
CREATE PROCEDURE [dbo].[GetMonthlySchedules]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
----------------------------------------------------------------
-- Select new record and save it to temporary table
----------------------------------------------------------------
SELECT [key]
, id
, therapist
, therapistId
, specialist
, specialistId
INTO #Temp_MonthSchedule
FROM doc
INNER JOIN spe ON doc.specialistId = spe.Id
INNER JOIN lis ON doc.Id = lis.DocId
WHERE lis.Dt >= DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
AND lis.Dt <= DATEADD(mm, 1, DATEDIFF(dd, 0, GETDATE()))
----------------------------------------------------------------
-- Select the different between old and new records to return it later
----------------------------------------------------------------
SELECT ISNULL(old.[key], new.[key]) AS [key]
, CASE WHEN old.Id IS NULL THEN 'ADDED' WHEN new.Id IS NULL THEN 'REMOVED' END AS operation
, new.id, new.therapist, new.therapistId, new.specialist, new.specialistId
INTO #Temp_MonthScheduleDiff
FROM ComparerMonthSchedule AS old
FULL OUTER JOIN #Temp_MonthSchedule AS new
ON old.[key] = new.[key]
WHERE old.id IS NULL
OR new.id IS NULL
----------------------------------------------------------------
-- Replace old record with new record
----------------------------------------------------------------
DELETE FROM ComparerMonthSchedule
INSERT INTO ComparerMonthSchedule SELECT * FROM #Android_Temp_MonthSchedule
----------------------------------------------------------------
-- Return records
----------------------------------------------------------------
SELECT * FROM #Temp_MonthScheduleDiff
----------------------------------------------------------------
-- Delete temporal table
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#Temp_TodaySchedule') IS NOT NULL BEGIN DROP TABLE #Temp_TodaySchedule END;
IF OBJECT_ID('tempdb..#Temp_TodayScheduleDiff') IS NOT NULL BEGIN DROP TABLE #Temp_TodayScheduleDiff END;
END
performance sql sql-server
add a comment |
I want to sync the table every few minutes to remote database, I want it to as efficient as possible. So I write this stored procedure that will only return rows that is added or removed after the last query.
Basically, this stored procedure will return something like this:
190107080001 | REMOVED | NULL | NULL | NULL | NULL | NULL |
190107080005 | ADDED | 225545 | Name2 | 5 | Specialist2 | 26 |
190107080108 | ADDED | 230139 | Name3 | 8 | Specialist3 | 44 |
Note: the [key]
is actually simple hashed value from the row itself, the remote database will use the [key]
as Identity,
Actually I do not have problem with this code until now, but I think my implementation is not effective enough considering I will execute this query 24/7.
CREATE PROCEDURE [dbo].[GetMonthlySchedules]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
----------------------------------------------------------------
-- Select new record and save it to temporary table
----------------------------------------------------------------
SELECT [key]
, id
, therapist
, therapistId
, specialist
, specialistId
INTO #Temp_MonthSchedule
FROM doc
INNER JOIN spe ON doc.specialistId = spe.Id
INNER JOIN lis ON doc.Id = lis.DocId
WHERE lis.Dt >= DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
AND lis.Dt <= DATEADD(mm, 1, DATEDIFF(dd, 0, GETDATE()))
----------------------------------------------------------------
-- Select the different between old and new records to return it later
----------------------------------------------------------------
SELECT ISNULL(old.[key], new.[key]) AS [key]
, CASE WHEN old.Id IS NULL THEN 'ADDED' WHEN new.Id IS NULL THEN 'REMOVED' END AS operation
, new.id, new.therapist, new.therapistId, new.specialist, new.specialistId
INTO #Temp_MonthScheduleDiff
FROM ComparerMonthSchedule AS old
FULL OUTER JOIN #Temp_MonthSchedule AS new
ON old.[key] = new.[key]
WHERE old.id IS NULL
OR new.id IS NULL
----------------------------------------------------------------
-- Replace old record with new record
----------------------------------------------------------------
DELETE FROM ComparerMonthSchedule
INSERT INTO ComparerMonthSchedule SELECT * FROM #Android_Temp_MonthSchedule
----------------------------------------------------------------
-- Return records
----------------------------------------------------------------
SELECT * FROM #Temp_MonthScheduleDiff
----------------------------------------------------------------
-- Delete temporal table
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#Temp_TodaySchedule') IS NOT NULL BEGIN DROP TABLE #Temp_TodaySchedule END;
IF OBJECT_ID('tempdb..#Temp_TodayScheduleDiff') IS NOT NULL BEGIN DROP TABLE #Temp_TodayScheduleDiff END;
END
performance sql sql-server
I want to sync the table every few minutes to remote database, I want it to as efficient as possible. So I write this stored procedure that will only return rows that is added or removed after the last query.
Basically, this stored procedure will return something like this:
190107080001 | REMOVED | NULL | NULL | NULL | NULL | NULL |
190107080005 | ADDED | 225545 | Name2 | 5 | Specialist2 | 26 |
190107080108 | ADDED | 230139 | Name3 | 8 | Specialist3 | 44 |
Note: the [key]
is actually simple hashed value from the row itself, the remote database will use the [key]
as Identity,
Actually I do not have problem with this code until now, but I think my implementation is not effective enough considering I will execute this query 24/7.
CREATE PROCEDURE [dbo].[GetMonthlySchedules]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
----------------------------------------------------------------
-- Select new record and save it to temporary table
----------------------------------------------------------------
SELECT [key]
, id
, therapist
, therapistId
, specialist
, specialistId
INTO #Temp_MonthSchedule
FROM doc
INNER JOIN spe ON doc.specialistId = spe.Id
INNER JOIN lis ON doc.Id = lis.DocId
WHERE lis.Dt >= DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
AND lis.Dt <= DATEADD(mm, 1, DATEDIFF(dd, 0, GETDATE()))
----------------------------------------------------------------
-- Select the different between old and new records to return it later
----------------------------------------------------------------
SELECT ISNULL(old.[key], new.[key]) AS [key]
, CASE WHEN old.Id IS NULL THEN 'ADDED' WHEN new.Id IS NULL THEN 'REMOVED' END AS operation
, new.id, new.therapist, new.therapistId, new.specialist, new.specialistId
INTO #Temp_MonthScheduleDiff
FROM ComparerMonthSchedule AS old
FULL OUTER JOIN #Temp_MonthSchedule AS new
ON old.[key] = new.[key]
WHERE old.id IS NULL
OR new.id IS NULL
----------------------------------------------------------------
-- Replace old record with new record
----------------------------------------------------------------
DELETE FROM ComparerMonthSchedule
INSERT INTO ComparerMonthSchedule SELECT * FROM #Android_Temp_MonthSchedule
----------------------------------------------------------------
-- Return records
----------------------------------------------------------------
SELECT * FROM #Temp_MonthScheduleDiff
----------------------------------------------------------------
-- Delete temporal table
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#Temp_TodaySchedule') IS NOT NULL BEGIN DROP TABLE #Temp_TodaySchedule END;
IF OBJECT_ID('tempdb..#Temp_TodayScheduleDiff') IS NOT NULL BEGIN DROP TABLE #Temp_TodayScheduleDiff END;
END
performance sql sql-server
performance sql sql-server
edited 1 min ago
asked 8 mins ago
SIRS
1235
1235
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210960%2fselect-row-that-is-added-or-removed-during-last-query%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210960%2fselect-row-that-is-added-or-removed-during-last-query%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown