Advertisement
Guest User

Untitled

a guest
Aug 17th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 8.59 KB | None | 0 0
  1. CREATE PROCEDURE [dbo].[UpdateConversationsByName]
  2.   @CampaignId INT,
  3.   @MeterLevelId INT,
  4.   @UserData VARCHAR(MAX),
  5.   @DATA VARCHAR(MAX),
  6.   @LastModifiedBy VARCHAR(50)
  7. AS
  8. BEGIN
  9.     DECLARE @trancount INT;
  10.  
  11.     SET @trancount = @@trancount;
  12.  
  13.     BEGIN TRY
  14.     IF @trancount = 0
  15.         BEGIN TRANSACTION
  16.     ELSE
  17.         SAVE TRANSACTION UpdateConversationsByName;
  18.  
  19.     DECLARE @C TABLE (
  20.       id INT,
  21.       Name VARCHAR(MAX),
  22.       [ORDER] INT
  23.     );
  24.  
  25.     DECLARE @COV TABLE (
  26.       C_Id INT,
  27.       InstanceNumber INT,
  28.       VALUE VARCHAR(MAX),
  29.       ConversationOptionId INT
  30.     );
  31.  
  32.     INSERT INTO @C
  33.     SELECT
  34.       id,
  35.       Name,
  36.       [ORDER]
  37.     FROM
  38.       OPENJSON(@DATA) WITH (
  39.         id INT '$.id',
  40.         Name VARCHAR(MAX) '$.Name',
  41.         [ORDER] INT '$.Order'
  42.       );
  43.  
  44.     INSERT INTO @COV
  45.     SELECT
  46.       C_Id,
  47.       InstanceNumber,
  48.       VALUE,
  49.       ConversationOptionId
  50.     FROM
  51.       OPENJSON(@DATA) WITH (
  52.         C_Id INT '$.id',
  53.         ConversationOptionValues NVARCHAR(MAX) '$.ConversationOptionValues' AS json
  54.       )
  55.       OUTER APPLY OPENJSON(ConversationOptionValues) WITH (
  56.         InstanceNumber NVARCHAR(MAX) '$.InstanceNumber',
  57.         VALUE VARCHAR(MAX) '$.Value',
  58.         ConversationOptionId INT '$.ConversationOptionId'
  59.       );
  60.  
  61.     DECLARE @A TABLE (
  62.       C_Id INT,
  63.       id INT,
  64.       Name VARCHAR(MAX),
  65.       Description VARCHAR(MAX),
  66.       Active BIT,
  67.       ActionTypeId INT,
  68.       [ORDER] INT
  69.     );
  70.  
  71.     DECLARE @AOV TABLE (
  72.       A_Id VARCHAR(MAX),
  73.       CriteriaInstanceNumber INT,
  74.       VALUE VARCHAR(MAX),
  75.       ActionOptionId INT
  76.     );
  77.  
  78.     INSERT INTO @A
  79.     SELECT
  80.       C_Id,
  81.       id,
  82.       Name,
  83.       Description,
  84.       Active,
  85.       ActionTypeId,
  86.       [ORDER]
  87.     FROM
  88.       OPENJSON(@DATA) WITH (
  89.         C_Id INT '$.id',
  90.         Actions NVARCHAR(MAX) '$.Actions' AS json
  91.       )
  92.       OUTER APPLY OPENJSON(Actions) WITH (
  93.         id INT '$.id',
  94.         Name NVARCHAR(MAX) '$.Name',
  95.         Description NVARCHAR(MAX) '$.Description',
  96.         Active BIT '$.Active',
  97.         ActionTypeId INT '$.ActionTypeId',
  98.         [ORDER] INT '$.Order'
  99.       );
  100.  
  101.     INSERT INTO @AOV
  102.     SELECT
  103.       A_Id,
  104.       CriteriaInstanceNumber,
  105.       VALUE,
  106.       ActionOptionId
  107.     FROM
  108.       OPENJSON(@DATA) WITH (
  109.         Actions NVARCHAR(MAX) '$.Actions' AS json
  110.       )
  111.       OUTER APPLY OPENJSON(Actions) WITH (
  112.         A_Id INT '$.id',
  113.         ActionOptionValues NVARCHAR(MAX) '$.ActionOptionValues' AS json
  114.       )
  115.       OUTER APPLY OPENJSON(ActionOptionValues) WITH (
  116.         CriteriaInstanceNumber INT '$.CriteriaInstanceNumber',
  117.         VALUE VARCHAR(MAX) '$.Value',
  118.         ActionOptionId INT '$.ActionOptionId'
  119.       );
  120.  
  121.     DECLARE @UD TABLE (
  122.       Name VARCHAR(MAX),
  123.       Overwrite BIT,
  124.       id INT,
  125.       CurrentMax INT, -- + Offset new for incrementing _New% because we can't get last index in merge/insert
  126.       Offset INT,
  127.       _Order INT IDENTITY(1, 1) -- need for case when multiple update of same action, so we need update only by latest in json (not latest id)
  128.       );
  129.  
  130.     INSERT INTO @UD
  131.     SELECT
  132.       Name,
  133.       Overwrite,
  134.       id,
  135.       CurrentMax = (
  136.         -- find action with same name + _New% format and parse this number in end. if it not exits set 0
  137.         SELECT
  138.           ISNULL(
  139.             MAX(
  140.               TRY_CONVERT(
  141.                 INT,
  142.                 SUBSTRING(
  143.                   C.Name,
  144.                   CHARINDEX('_New', C.Name) + LEN('_New'),
  145.                   LEN(C.Name)
  146.                 )
  147.               )
  148.             ),
  149.             0
  150.           )
  151.         FROM
  152.           Conversation C
  153.         WHERE
  154.           CampaignId = @CampaignId
  155.           AND MeterLevelId = @MeterLevelId
  156.       ),
  157.       Offset = (
  158.         -- increment in group of actions with same name
  159.         ROW_NUMBER() OVER (
  160.           PARTITION BY Name
  161.           ORDER BY
  162.             Name
  163.         )
  164.       )
  165.     FROM
  166.       OPENJSON(@UserData) WITH (
  167.         Name NVARCHAR(MAX) '$.Name',
  168.         Overwrite BIT '$.Overwrite',
  169.         id INT '$.id'
  170.       );
  171.     -- need for case when action not exist and we try insert multiple with same name
  172.     UPDATE
  173.       @UD
  174.     SET
  175.       Offset = Offset -1
  176.     WHERE
  177.       CurrentMax = 0
  178.       AND Name NOT IN ( -- case when insert 1 by 1 actions with yet existing same name
  179.         SELECT
  180.           Name
  181.         FROM
  182.           Conversation C
  183.         WHERE
  184.           C.CampaignId = @CampaignId
  185.           AND C.MeterLevelId = @MeterLevelId
  186.       );
  187.    
  188.     -- delete from @AOV, @A, @COV, @C rows which will not be used in multiple update of one row (without latest)
  189.     DELETE FROM
  190.       @AOV
  191.     WHERE
  192.       A_Id IN (
  193.         SELECT
  194.           id
  195.         FROM
  196.           @A
  197.         WHERE
  198.           C_Id IN (
  199.             SELECT
  200.               id
  201.             FROM
  202.               @UD
  203.             WHERE
  204.               Overwrite = 1
  205.               AND _Order NOT IN (
  206.                 SELECT
  207.                   MAX(_Order)
  208.                 FROM
  209.                   @UD
  210.                 GROUP BY
  211.                   Name
  212.               )
  213.           )
  214.       );
  215.  
  216.     DELETE FROM
  217.       @A
  218.     WHERE
  219.       C_Id IN (
  220.         SELECT
  221.           id
  222.         FROM
  223.           @UD
  224.         WHERE
  225.           Overwrite = 1
  226.           AND _Order NOT IN (
  227.             SELECT
  228.               MAX(_Order)
  229.             FROM
  230.               @UD
  231.             GROUP BY
  232.               Name
  233.           )
  234.       );
  235.  
  236.     DELETE FROM
  237.       @COV
  238.     WHERE
  239.       C_Id IN (
  240.         SELECT
  241.           id
  242.         FROM
  243.           @UD
  244.         WHERE
  245.           Overwrite = 1
  246.           AND _Order NOT IN (
  247.             SELECT
  248.               MAX(_Order)
  249.             FROM
  250.               @UD
  251.             GROUP BY
  252.               Name
  253.           )
  254.       );
  255.  
  256.     DELETE FROM
  257.       @C
  258.     WHERE
  259.       id IN (
  260.         SELECT
  261.           id
  262.         FROM
  263.           @UD
  264.         WHERE
  265.           Overwrite = 1
  266.           AND _Order NOT IN (
  267.             SELECT
  268.               MAX(_Order)
  269.             FROM
  270.               @UD
  271.             GROUP BY
  272.               Name
  273.           )
  274.       );
  275.  
  276.     DECLARE @MatchTableC TABLE (OriginalId INT, InsertedId INT);
  277.  
  278.     DECLARE @MatchTableA TABLE (OriginalId INT, InsertedId INT);
  279.  
  280.     MERGE INTO Conversation AS tgt
  281.     USING @C AS src
  282.     ON tgt.Name = src.Name
  283.     AND tgt.CampaignId = @CampaignId
  284.     AND tgt.MeterLevelId = @MeterLevelId
  285.     AND (
  286.       SELECT
  287.         Overwrite
  288.       FROM
  289.         @UD
  290.       WHERE
  291.         id = src.id
  292.     ) = 1
  293.     WHEN MATCHED
  294.     THEN
  295.     UPDATE
  296.     SET
  297.       CampaignId = @CampaignId,
  298.       MeterLevelId = @MeterLevelId,
  299.       [ORDER] = src.[ORDER],
  300.       LastModifiedBy = @LastModifiedBy,
  301.       LastModifiedDate = GETDATE()
  302.     WHEN NOT MATCHED
  303.     THEN
  304.     INSERT (
  305.         CampaignId, MeterLevelId, Name, [ORDER],
  306.         LastModifiedBy, LastModifiedDate
  307.       )
  308.     VALUES
  309.       (
  310.         @CampaignId,
  311.         @MeterLevelId,
  312.         CASE WHEN (
  313.           SELECT
  314.             CurrentMax + Offset -- if 0 - not exist, else increment _New%
  315.           FROM
  316.             @UD
  317.           WHERE
  318.             id = src.id
  319.         ) > 0 THEN CONCAT (
  320.           src.Name,
  321.           '_New',
  322.           (
  323.             SELECT
  324.               CurrentMax + Offset
  325.             FROM
  326.               @UD
  327.             WHERE
  328.               id = src.id
  329.           )
  330.         ) ELSE src.Name END,
  331.         src.[ORDER],
  332.         @LastModifiedBy,
  333.         GETDATE()
  334.       )
  335.       OUTPUT
  336.       src.id,
  337.       inserted.id
  338.       INTO @MatchTableC;
  339.  
  340.     DELETE FROM
  341.       ConversationOptionValue
  342.     WHERE
  343.       ConversationId IN (
  344.         SELECT
  345.           InsertedId
  346.         FROM
  347.           @MatchTableC
  348.       );
  349.  
  350.     INSERT INTO ConversationOptionValue (
  351.       ConversationId,
  352.       ConversationOptionId,
  353.       VALUE,
  354.       InstanceNumber,
  355.       LastModifiedBy,
  356.       LastModifiedDate
  357.     )
  358.     SELECT
  359.       m.InsertedId,
  360.       p.ConversationOptionId,
  361.       p.VALUE,
  362.       p.InstanceNumber,
  363.       @LastModifiedBy,
  364.       GETDATE()
  365.     FROM
  366.       @COV p
  367.       LEFT JOIN @MatchTableC m ON p.C_Id = m.OriginalId;
  368.  
  369.     DELETE FROM
  370.       ActionOptionValue
  371.     WHERE
  372.       ActionId IN (
  373.         SELECT
  374.           id
  375.         FROM
  376.           Action
  377.         WHERE
  378.           ConversationId IN (
  379.             SELECT
  380.               InsertedId
  381.             FROM
  382.               @MatchTableC
  383.           )
  384.       );
  385.  
  386.     DELETE FROM
  387.       Action
  388.     WHERE
  389.       ConversationId IN (
  390.         SELECT
  391.           InsertedId
  392.         FROM
  393.           @MatchTableC
  394.       );
  395.  
  396.     MERGE INTO Action AS tgt
  397.     USING @A AS src
  398.     ON 1 = 0
  399.     WHEN NOT MATCHED
  400.     THEN
  401.     INSERT (
  402.       Name,
  403.       Description,
  404.       Active,
  405.       ActionTypeId,
  406.       [ORDER],
  407.       ConversationId,
  408.       LastModifiedBy,
  409.       LastModifiedDate
  410.     )
  411.     VALUES
  412.       (
  413.         src.Name,
  414.         src.Description,
  415.         src.Active,
  416.         src.ActionTypeId,
  417.         src.[ORDER],
  418.         (
  419.           SELECT
  420.             InsertedId
  421.           FROM
  422.             @MatchTableC
  423.           WHERE
  424.             OriginalId = src.C_Id
  425.         ),
  426.         @LastModifiedBy,
  427.         GETDATE()
  428.       )
  429.       OUTPUT
  430.       src.id,
  431.       inserted.id
  432.       INTO @MatchTableA;
  433.  
  434.     INSERT INTO ActionOptionValue (
  435.       ActionId,
  436.       ActionOptionId,
  437.       VALUE,
  438.       CriteriaInstanceNumber,
  439.       LastModifiedBy,
  440.       LastModifiedDate
  441.     )
  442.     SELECT
  443.       m.InsertedId,
  444.       p.ActionOptionId,
  445.       p.VALUE,
  446.       p.CriteriaInstanceNumber,
  447.       @LastModifiedBy,
  448.       GETDATE()
  449.     FROM
  450.       @AOV p
  451.       LEFT JOIN @MatchTableA m ON p.A_Id = m.OriginalId;
  452.  
  453.     lbexit:
  454.     IF @trancount = 0
  455.         COMMIT;
  456.     END TRY
  457.     BEGIN CATCH
  458.         DECLARE @error INT,
  459.             @message VARCHAR(4000),
  460.             @xstate INT,
  461.             @errorline VARCHAR(4);
  462.  
  463.         SELECT @error = ERROR_NUMBER(),
  464.             @message = ERROR_MESSAGE(),
  465.             @xstate = XACT_STATE(),
  466.             @errorline = CAST(ERROR_LINE() AS VARCHAR(16));
  467.  
  468.         SET @message = @errorline + ': ' + @message
  469.  
  470.         IF @xstate = - 1
  471.             ROLLBACK;
  472.         IF @xstate = 1
  473.             AND @trancount = 0
  474.             ROLLBACK;
  475.         IF @xstate = 1
  476.             AND @trancount > 0
  477.             ROLLBACK TRANSACTION ImportCampaignsFast;
  478.         RAISERROR (
  479.                 'UpdateConversationsByName: %d: %s',
  480.                 16,
  481.                 1,
  482.                 @error,
  483.                 @message
  484.                 );
  485.     END CATCH
  486. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement