Advertisement
seregak

SQLUGChallenge2015 Setup

Dec 10th, 2015
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 14.66 KB | None | 0 0
  1. /*
  2.  
  3. SQLUGChallenge2015
  4.  
  5. Author      : Sergey Klimkevich
  6. Company     : ThomasCook
  7. Version     : Domino
  8.  
  9.  
  10. */
  11.  
  12. SET NOCOUNT ON
  13. GO
  14.  
  15. --/* Cleanup code
  16.  
  17. IF EXISTS(SELECT * FROM sys.services AS s WHERE s.name = 'SendService') DROP SERVICE SendService
  18. IF EXISTS(SELECT * FROM sys.service_queues AS sq WHERE sq.name = 'SendQueue') DROP QUEUE SendQueue
  19. GO
  20.  
  21. DECLARE @SQL NVARCHAR(MAX)
  22.     ,@amount TINYINT = 16
  23.  
  24. WHILE @amount > 0
  25. BEGIN
  26.     SELECT
  27.         @SQL = CONCAT('IF EXISTS(SELECT * FROM sys.services AS s WHERE s.name = ''ProcessCardFlowService',@amount,''') DROP SERVICE ProcessCardFlowService',@amount,';',CHAR(10))
  28.         ,@SQL+= CONCAT('IF EXISTS(SELECT * FROM sys.service_queues AS sq WHERE sq.name = ''ProcessCardFlowQueue',@amount,''') DROP QUEUE ProcessCardFlowQueue',@amount,';',CHAR(10))
  29.         ,@SQL+= CONCAT('IF OBJECT_ID(''dbo.ProcessCardFlowActivation',@amount,''') IS NOT NULL DROP PROCEDURE dbo.ProcessCardFlowActivation',@amount,';',CHAR(10))
  30.         ,@amount -=1
  31.     EXEC (@SQL)
  32.  
  33. END
  34. GO
  35.  
  36.  
  37. IF OBJECT_ID('dbo.ProcessCardFlow') IS NOT NULL DROP PROCEDURE dbo.ProcessCardFlow
  38. IF OBJECT_ID('dbo.[ProcessCardFlowWorker]') IS NOT NULL DROP PROCEDURE dbo.[ProcessCardFlowWorker]
  39. IF OBJECT_ID('dbo.WaitForBackgroundProcessToFinish') IS NOT NULL DROP PROCEDURE dbo.WaitForBackgroundProcessToFinish
  40. IF OBJECT_ID('dbo.PopulateSplitList') IS NOT NULL DROP PROCEDURE dbo.PopulateSplitList
  41. IF OBJECT_ID('dbo.MainRun') IS NOT NULL DROP PROCEDURE dbo.MainRun
  42. GO
  43.  
  44.  
  45. IF EXISTS(SELECT * FROM sys.service_contracts AS sc WHERE sc.name = '//SQLugChallenge2015/Contract') DROP CONTRACT [//SQLugChallenge2015/Contract]
  46. IF EXISTS(SELECT * FROM sys.service_message_types AS smt WHERE smt.name = '//SQLugChallenge2015/StartBackgroundThread') DROP MESSAGE TYPE [//SQLugChallenge2015/StartBackgroundThread]
  47. IF EXISTS(SELECT * FROM sys.service_message_types AS smt WHERE smt.name = '//SQLugChallenge2015/StartProcessingCardFlow') DROP MESSAGE TYPE [//SQLugChallenge2015/StartProcessingCardFlow]
  48.  
  49.  
  50. IF OBJECT_ID('dbo.StatusCards', 'U') IS NOT NULL DROP TABLE dbo.StatusCards
  51. IF OBJECT_ID('dbo.SplitList', 'U') IS NOT NULL DROP TABLE dbo.SplitList
  52. IF OBJECT_ID('dbo.DlgHandle', 'U') IS NOT NULL DROP TABLE dbo.DlgHandle
  53. IF OBJECT_ID('dbo.ProcessCardFlowResult', 'U') IS NOT NULL DROP TABLE dbo.ProcessCardFlowResult
  54.  
  55.  
  56. IF EXISTS(SELECT * FROM sys.types WHERE name = 'CardFlowType') DROP TYPE dbo.CardFlowType
  57.  
  58. --*/
  59.  
  60.  
  61. /******************************************************************************************************
  62. --*****************************************************************************************************
  63. -- Create Objects
  64. --*****************************************************************************************************
  65. --*****************************************************************************************************/
  66.  
  67. -- ALTER DATABASE CURRENT SET NEW_BROKER WITH ROLLBACK IMMEDIATE
  68.  
  69. CREATE MESSAGE TYPE [//SQLugChallenge2015/StartBackgroundThread] VALIDATION = NONE
  70. CREATE MESSAGE TYPE [//SQLugChallenge2015/StartProcessingCardFlow]
  71.  
  72.  
  73. CREATE CONTRACT [//SQLugChallenge2015/Contract]
  74. (
  75. [//SQLugChallenge2015/StartBackgroundThread] SENT BY INITIATOR,
  76. [//SQLugChallenge2015/StartProcessingCardFlow] SENT BY INITIATOR
  77. )
  78. GO
  79.  
  80. CREATE TYPE dbo.CardFlowType AS TABLE(
  81. CardID INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 262144)
  82. ,RankPoint TINYINT NOT NULL
  83. ) WITH (MEMORY_OPTIMIZED = ON)
  84. GO
  85.  
  86.  
  87. CREATE TABLE dbo.StatusCards (
  88.     [CardID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1048576), --4194304
  89.     [STATUS] CHAR(1) NOT NULL
  90. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
  91. GO
  92.  
  93.  
  94. CREATE TABLE dbo.ProcessCardFlowResult (
  95.     ListID INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 32),
  96.     RunningSum TINYINT NOT NULL,
  97.     MayWithdraw10Points BIT NOT NULL,
  98.     CardNo TINYINT NOT NULL,
  99.     B INT NOT NULL,
  100.     L INT NOT NULL,
  101.     S INT NOT NULL,
  102.     W INT NOT NULL
  103. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
  104.  
  105. INSERT dbo.ProcessCardFlowResult (ListID, RunningSum, MayWithdraw10Points, CardNo, B, L, S, W)
  106.     VALUES (0, 0, 0, 1, 0, 0, 0, 0);
  107. GO
  108.  
  109.  
  110. CREATE TABLE dbo.SplitList (
  111.     [id] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 256),
  112.     [from_cid] INT NOT NULL,
  113.     [to_cid] INT NOT NULL,
  114.     [NextProcessDlgHandle] UNIQUEIDENTIFIER NULL
  115. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
  116. GO
  117.  
  118.  
  119. CREATE TABLE dbo.DlgHandle (
  120.     [ListID] TINYINT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 64),
  121.     [DlgHandle] UNIQUEIDENTIFIER NULL
  122. ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
  123. GO
  124.  
  125.  
  126.  
  127.  
  128.  
  129. CREATE PROCEDURE dbo.WaitForBackgroundProcessToFinish
  130. (
  131.     @NumberOfUpdateThreads TINYINT
  132. )
  133. AS
  134. BEGIN
  135.     SET NOCOUNT ON;
  136.  
  137.     DECLARE @DlgHandle UNIQUEIDENTIFIER,
  138.             @MsgType SYSNAME,
  139.             @Msg VARBINARY(MAX),
  140.             @x TINYINT = 0
  141.  
  142.     WHILE 1=1
  143.     BEGIN
  144.         BEGIN TRANSACTION;
  145.         WAITFOR
  146.         (
  147.         RECEIVE TOP (1)
  148.         @DlgHandle = conversation_handle,
  149.         @MsgType = message_type_name,
  150.         @Msg = message_body
  151.         FROM dbo.[SendQueue]
  152.         ), TIMEOUT 30000;
  153.  
  154.         IF @DlgHandle IS NOT NULL
  155.         BEGIN
  156.  
  157.             IF @MsgType = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
  158.             BEGIN
  159.                 END CONVERSATION @DlgHandle;
  160.  
  161.                 SET @x += 1
  162.  
  163.                 IF @x = @NumberOfUpdateThreads
  164.                 BEGIN
  165.                     TRUNCATE TABLE dbo.DealerStatus
  166.                     DECLARE
  167.                         @_B INT,
  168.                         @_L INT,
  169.                         @_S INT,
  170.                         @_W INT
  171.  
  172.                     SELECT             
  173.                         @_B = pcfr.B,
  174.                         @_L = pcfr.L,
  175.                         @_S = pcfr.S,
  176.                         @_W = pcfr.W
  177.                     FROM ProcessCardFlowResult pcfr
  178.                     WHERE pcfr.ListID = @NumberOfUpdateThreads
  179.  
  180.                     INSERT dbo.DealerStatus ([STATUS], Deals)
  181.                     VALUES
  182.                         ('B', @_B),
  183.                         ('L', @_L),
  184.                         ('S', @_S),
  185.                         ('W', @_W)
  186.  
  187.                     COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON);
  188.                     BREAK;
  189.                 END
  190.             END
  191.             ELSE
  192.             IF @MsgType = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
  193.             BEGIN
  194.                 END CONVERSATION @DlgHandle;
  195.                 DECLARE @error INT;
  196.                 DECLARE @description NVARCHAR(4000);
  197.                 WITH XMLNAMESPACES ('http://schemas.microsoft.com/SQL/ServiceBroker/Error' AS ssb)
  198.                 SELECT
  199.                     @error = CAST(@Msg AS XML).VALUE(
  200.                     '(//ssb:Error/ssb:Code)[1]', 'INT'),
  201.                     @description = CAST(@Msg AS XML).VALUE(
  202.                     '(//ssb:Error/ssb:Description)[1]', 'NVARCHAR(4000)')
  203.                 RAISERROR (N'Received error Code:%i Description:"%s"',
  204.                 16, 1, @error, @description) WITH LOG;
  205.             END
  206.         END
  207.         COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON);
  208.     END -- while
  209. END
  210. GO
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220. CREATE PROCEDURE dbo.ProcessCardFlow
  221. (
  222.     @ListID INT,
  223.     @flow dbo.CardFlowType READONLY
  224. )
  225. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
  226. AS
  227. BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english', DELAYED_DURABILITY = ON)
  228.     DECLARE @RankPoint TINYINT = 0,
  229.             @CurrentStatus CHAR(1) = ' ',
  230.             @from_CardID INT,
  231.             @to_CardID INT,
  232.             @RunningSum TINYINT,
  233.             @MayWithdraw10Points BIT,
  234.             @CardNo TINYINT,
  235.             @_B INT,
  236.             @_L INT,
  237.             @_S INT,
  238.             @_W INT
  239.  
  240.     SELECT
  241.         @RunningSum = RunningSum,
  242.         @MayWithdraw10Points = MayWithdraw10Points,
  243.         @CardNo = CardNo,
  244.         @_B = B,
  245.         @_L = L,
  246.         @_S = S,
  247.         @_W = W
  248.     FROM dbo.ProcessCardFlowResult pcfr
  249.         WHERE pcfr.ListID = @ListID - 1
  250.  
  251.     SELECT
  252.         @from_CardID = sl.from_cid,
  253.         @to_CardID = sl.to_cid
  254.     FROM dbo.SplitList sl
  255.         WHERE sl.id = @ListID
  256.  
  257.     WHILE @from_CardID <= @to_CardID
  258.     BEGIN
  259.  
  260.         SELECT
  261.             @RankPoint = c.RankPoint
  262.         FROM @flow c
  263.         WHERE
  264.             c.CardID = @from_CardID
  265.  
  266.         IF @RankPoint > 10
  267.             SET @RankPoint = 10
  268.         ELSE
  269.         IF @RankPoint = 1
  270.             IF @MayWithdraw10Points = 0
  271.                 SELECT
  272.                     @RankPoint = 11
  273.                     ,@MayWithdraw10Points = 1
  274.  
  275.         SET @RunningSum += @RankPoint
  276.  
  277.         IF @RunningSum > 21
  278.             AND @MayWithdraw10Points = 1
  279.             SELECT
  280.                 @RunningSum -= 10
  281.                 ,@MayWithdraw10Points = 0
  282.  
  283.         IF @RunningSum > 16
  284.         BEGIN
  285.             IF (@RunningSum = 21)
  286.                 IF (@CardNo = 2)
  287.                     SELECT @CurrentStatus = 'B', @_B += 1
  288.                 ELSE
  289.                     SELECT @CurrentStatus = 'W', @_W += 1
  290.             ELSE IF @RunningSum > 21
  291.                 SELECT @CurrentStatus = 'L', @_L += 1
  292.             ELSE
  293.                 SELECT @CurrentStatus = 'S', @_S += 1
  294.  
  295.             INSERT dbo.StatusCards
  296.                 VALUES (@from_CardID, @CurrentStatus)
  297.  
  298.             SELECT
  299.                 @RunningSum = 0
  300.                 ,@CardNo = 1
  301.                 ,@MayWithdraw10Points = 0
  302.         END
  303.         ELSE
  304.             SET @CardNo += 1
  305.  
  306.         SET @from_CardID += 1
  307.     END --while
  308.  
  309.     INSERT dbo.ProcessCardFlowResult (ListID, RunningSum, MayWithdraw10Points, CardNo, B, L, S, W)
  310.         SELECT
  311.             @ListID,
  312.             @RunningSum,
  313.             @MayWithdraw10Points,
  314.             @CardNo,
  315.             @_B,
  316.             @_L,
  317.             @_S,
  318.             @_W
  319.  
  320. END --proc dbo.ProcessCardFlow
  321. GO
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330. CREATE PROCEDURE dbo.[ProcessCardFlowWorker]
  331. (
  332.     @wid TINYINT
  333. )
  334. AS
  335. BEGIN
  336.     SET NOCOUNT ON;
  337.  
  338.  
  339.     DECLARE @DlgHandle UNIQUEIDENTIFIER,
  340.             @MsgType SYSNAME,
  341.             @error_number INT,
  342.             @error_message NVARCHAR(4000),
  343.             @xact_state INT,
  344.             @ParmDefinition NVARCHAR(4000),
  345.             @SQLString NVARCHAR(4000),
  346.             @from_CardID INT,
  347.             @to_CardID INT,
  348.             @flow dbo.CardFlowType,
  349.             @NextWorkerDlgHandle UNIQUEIDENTIFIER
  350.  
  351.     WHILE 1=1
  352.     BEGIN
  353.         IF NOT (@DlgHandle IS NOT NULL AND @wid = 1)
  354.         BEGIN
  355.             SELECT @SQLString = CONCAT('
  356.             WAITFOR
  357.             (
  358.                 RECEIVE TOP (1) @DlgHandleOUT = conversation_handle,
  359.                 @MsgTypeOUT = message_type_name
  360.                 FROM dbo.[ProcessCardFlowQueue',@wid,']
  361.             ), TIMEOUT 10000;
  362.             ')
  363.             ,@ParmDefinition = '@DlgHandleOUT UNIQUEIDENTIFIER OUTPUT,@MsgTypeOUT SYSNAME OUTPUT'
  364.  
  365.             EXECUTE sp_executesql @SQLString, @ParmDefinition, @DlgHandleOUT = @DlgHandle OUTPUT, @MsgTypeOUT = @MsgType OUTPUT
  366.  
  367.         END
  368.  
  369.         IF @DlgHandle IS NULL BREAK
  370.  
  371.         IF @MsgType = N'//SQLugChallenge2015/StartBackgroundThread'
  372.         BEGIN
  373.  
  374.             SELECT
  375.                 @from_CardID = sl.from_cid,
  376.                 @to_CardID = sl.to_cid,
  377.                 @NextWorkerDlgHandle = sl.NextProcessDlgHandle
  378.             FROM dbo.SplitList sl
  379.             WHERE sl.id=@wid
  380.    
  381.             IF @NextWorkerDlgHandle IS NOT NULL
  382.             BEGIN
  383.                 IF @wid > 1
  384.                 BEGIN
  385.                     WAITFOR DELAY '00:00:00.01'
  386.                 END
  387.  
  388.                 ;SEND ON CONVERSATION @NextWorkerDlgHandle MESSAGE TYPE [//SQLugChallenge2015/StartBackgroundThread]
  389.             END
  390.  
  391.             BEGIN TRANSACTION
  392.          
  393.                 INSERT @flow (CardID, RankPoint)
  394.                 SELECT ch.CardID, ch.[Rank]
  395.                 FROM dbo.CardHistory ch WITH (PAGLOCK)
  396.                 WHERE ch.CardID >= @from_CardID AND ch.CardID <= @to_CardID
  397.  
  398.             COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON)
  399.  
  400.             IF @wid = 1
  401.             BEGIN
  402.                 SET @MsgType = N'//SQLugChallenge2015/StartProcessingCardFlow'
  403.             END
  404.  
  405.         END
  406.         ELSE
  407.         IF @MsgType = N'//SQLugChallenge2015/StartProcessingCardFlow'
  408.         BEGIN
  409.    
  410.             BEGIN TRANSACTION
  411.  
  412.                 EXEC dbo.ProcessCardFlow @wid, @flow
  413.  
  414.                 IF @NextWorkerDlgHandle IS NOT NULL
  415.                 BEGIN
  416.                     ;SEND ON CONVERSATION @NextWorkerDlgHandle MESSAGE TYPE [//SQLugChallenge2015/StartProcessingCardFlow];
  417.                 END
  418.  
  419.             COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON)
  420.  
  421.             ------------------------------------------------------
  422.             -- UpdateStatus
  423.             ------------------------------------------------------
  424.             BEGIN TRANSACTION
  425.  
  426.                 UPDATE h
  427.                 SET STATUS = u.[STATUS]
  428.                 FROM dbo.StatusCards u
  429.                 JOIN dbo.CardHistory h WITH (PAGLOCK)
  430.                     ON h.CardID = u.CardID
  431.                 WHERE u.CardID >= @from_CardID
  432.                 AND u.CardID < @to_CardID
  433.  
  434.                 IF @NextWorkerDlgHandle IS NULL
  435.                 BEGIN
  436.                     UPDATE h
  437.                     SET STATUS = u.[STATUS]
  438.                     FROM dbo.SplitList sl
  439.                     JOIN dbo.StatusCards u
  440.                         ON sl.to_cid = u.CardID
  441.                     JOIN dbo.CardHistory h
  442.                         ON h.CardID = u.CardID
  443.                 END
  444.  
  445.                 END CONVERSATION @DlgHandle
  446.  
  447.             COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON)            
  448.  
  449.             BREAK
  450.            
  451.         END --IF @MsgType = N'//SQLugChallenge2015/StartProcessingCardFlow'
  452.  
  453.     END --while
  454.  
  455. END --dbo.[ProcessCardFlowWorker]
  456.  
  457.  
  458. GO
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467. CREATE PROCEDURE dbo.PopulateSplitList
  468. (
  469.     @tot INT,
  470.     @nob TINYINT OUTPUT
  471. )
  472. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
  473. AS
  474. BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english', DELAYED_DURABILITY = ON)
  475.  
  476.     DECLARE @batch_size INT,
  477.             @NextProcessDlgHandle UNIQUEIDENTIFIER,
  478.             @x TINYINT = 1
  479.  
  480.     SELECT @nob = 16, @batch_size = @tot / @nob
  481.  
  482.     IF @tot < 84032
  483.     BEGIN
  484.         INSERT dbo.SplitList (id, from_cid, to_cid)
  485.         SELECT 1, 1, @tot
  486.  
  487.         SELECT @nob = 1
  488.     END
  489.     ELSE
  490.     BEGIN
  491.         SELECT @batch_size = @batch_size + 506 - @batch_size%506
  492.    
  493.         WHILE (@x - 1) * @batch_size + @batch_size < @tot
  494.         BEGIN
  495.             SELECT @NextProcessDlgHandle = dh.DlgHandle FROM dbo.DlgHandle AS dh WHERE dh.ListID = @x + 1
  496.  
  497.             INSERT dbo.SplitList (id, from_cid, to_cid, NextProcessDlgHandle)
  498.             SELECT  @x,
  499.                     (@x - 1) * @batch_size + 1,
  500.                     (@x - 1) * @batch_size + @batch_size,
  501.                     @NextProcessDlgHandle
  502.  
  503.             SET @x += 1
  504.         END
  505.  
  506.         INSERT dbo.SplitList (id, from_cid, to_cid)
  507.         SELECT  @x,
  508.                 (@x - 1) * @batch_size + 1,
  509.                 @tot    
  510.     END
  511. END
  512. GO
  513.  
  514.  
  515.  
  516.  
  517.  
  518. CREATE QUEUE [dbo].[SendQueue]
  519. CREATE SERVICE [SendService] ON QUEUE [dbo].[SendQueue];
  520. GO
  521.  
  522.  
  523.  
  524. DECLARE @SQL NVARCHAR(MAX) = '', @amount TINYINT = 16
  525.  
  526. WHILE @amount > 0
  527. BEGIN
  528.     SELECT
  529.         @SQL = CONCAT('CREATE PROCEDURE dbo.[ProcessCardFlowActivation',@amount,'] AS EXEC dbo.[ProcessCardFlowWorker] ',@amount,';',CHAR(10))
  530.     ,@amount -=1
  531.     EXEC (@SQL)
  532.  
  533. END
  534. GO
  535.  
  536.  
  537. DECLARE @SQL NVARCHAR(MAX)
  538.     ,@amount TINYINT = 16
  539.     ,@x INT = 1
  540.  
  541. WHILE @x <= @amount
  542. BEGIN
  543.     SELECT
  544.         @SQL = CONCAT('DECLARE @ProcessCardFlowDlgHandle UNIQUEIDENTIFIER;', CHAR(10))
  545.         ,@SQL += CONCAT('CREATE QUEUE [dbo].[ProcessCardFlowQueue',@x,'] WITH ACTIVATION (STATUS = ON, MAX_QUEUE_READERS = 1, PROCEDURE_NAME = dbo.[ProcessCardFlowActivation',@x,'],EXECUTE AS OWNER);',CHAR(10))
  546.         ,@SQL += CONCAT('CREATE SERVICE [ProcessCardFlowService',@x,'] ON QUEUE [dbo].[ProcessCardFlowQueue',@x,'] ([//SQLugChallenge2015/Contract]);',CHAR(10))
  547.         ,@SQL += CONCAT('BEGIN DIALOG @ProcessCardFlowDlgHandle FROM SERVICE [SendService] TO SERVICE ''ProcessCardFlowService',@x,''' ON CONTRACT [//SQLugChallenge2015/Contract] WITH ENCRYPTION = OFF;',CHAR(10))
  548.         ,@SQL += CONCAT('INSERT dbo.DlgHandle (ListID, DlgHandle) VALUES (',@x,',@ProcessCardFlowDlgHandle);',CHAR(10))
  549.         ,@x +=1
  550.     EXEC(@SQL)
  551. END
  552. GO
  553.  
  554.  
  555.  
  556.  
  557.  
  558. CREATE PROCEDURE dbo.MainRun
  559. AS
  560. BEGIN
  561.     SET NOCOUNT ON;
  562.  
  563.     DECLARE @tot INT,
  564.             @nob TINYINT
  565.        
  566.     BEGIN TRANSACTION
  567.  
  568.     SELECT TOP (1) @tot = ch.CardID
  569.     FROM dbo.CardHistory AS ch
  570.     ORDER BY ch.CardID DESC
  571.  
  572.     EXEC dbo.PopulateSplitList  @tot = @tot,
  573.                                 @nob = @nob OUT
  574.  
  575.     DECLARE @FirstProcessCardFlowDlgHandle UNIQUEIDENTIFIER
  576.  
  577.     SELECT
  578.         @FirstProcessCardFlowDlgHandle=dh.DlgHandle
  579.     FROM dbo.DlgHandle dh
  580.     WHERE dh.ListID = 1
  581.  
  582.     ;SEND ON CONVERSATION @FirstProcessCardFlowDlgHandle MESSAGE TYPE [//SQLugChallenge2015/StartBackgroundThread]
  583.  
  584.     COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON)  
  585.  
  586.     EXEC dbo.WaitForBackgroundProcessToFinish @NumberOfUpdateThreads = @nob
  587.  
  588. END
  589. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement