SELECT Row that is added or removed during last query












0














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









share|improve this question





























    0














    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









    share|improve this question



























      0












      0








      0







      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









      share|improve this question















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 3 mins ago

























      asked 10 mins ago









      SIRS

      1235




      1235






















          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          Quarter-circle Tiles

          build a pushdown automaton that recognizes the reverse language of a given pushdown automaton?

          Mont Emei