Advertisement
Guest User

Untitled

a guest
Nov 15th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.15 KB | None | 0 0
  1. ALTER PROCEDURE [mst].[Utility_SortAndPage]
  2.     @PageSize               INT,
  3.     @CurrentPage            INT,
  4.     @SortBy                 nvarchar(50),
  5.     @SortAscending          bit,
  6.     @PrimaryIDColumnName    nvarchar(100),
  7.     @SettingsXML            xml,
  8.     @TotalRecords           INT OUTPUT,
  9.     @FullSortedIDList       xml OUTPUT
  10. AS
  11.  
  12. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  13. SET NOCOUNT ON
  14.  
  15. DECLARE @SelectSql nvarchar(MAX), @ParamDefinition nvarchar(500);
  16. SELECT @SelectSql = N'SELECT @TotalRecords = COUNT(*) FROM #SortTable WITH (NOLOCK)';  
  17. SET @ParamDefinition = N'@TotalRecords int OUTPUT';
  18.  
  19. EXEC sp_executesql @SelectSql, @ParamDefinition, @TotalRecords OUTPUT;
  20.  
  21. IF @PageSize IS NULL BEGIN
  22.     SET @PageSize = @TotalRecords
  23. END
  24.  
  25. IF @CurrentPage IS NULL BEGIN
  26.     SET @CurrentPage = 1
  27. END
  28.  
  29. DECLARE @START INT, @END INT
  30. SELECT @START = ((@CurrentPage - 1) * @PageSize) + 1,
  31.     @END = @CurrentPage * @PageSize
  32.  
  33. DECLARE @SortDirection nvarchar(5)
  34. SELECT @SortDirection = CASE @SortAscending WHEN 1 THEN ' ASC' ELSE ' DESC' END
  35.  
  36. -- To avoid SQL injection on sort by column
  37. -- support mulitple columns sorting
  38. DECLARE @SortColumnCount nvarchar(50), @SortCount INT
  39. SELECT @SortCount = COUNT(DISTINCT ColA) FROM [mst].[DelimiteredString_Separate](',',@SortBy)
  40.  
  41. SELECT @SortColumnCount = COUNT(0)
  42. FROM tempDb.sys.COLUMNS
  43. WHERE [object_ID] = OBJECT_ID('tempDb..#SortTable')
  44.     AND name IN (SELECT ColA FROM [mst].[DelimiteredString_Separate](',',@SortBy))
  45.  
  46. IF @SortColumnCount = @SortCount
  47. BEGIN
  48.     DECLARE @Pos INT = CHARINDEX(',', @SortBy)
  49.     DECLARE @SortSQL nvarchar(100)
  50.  
  51.     IF @Pos > 0 BEGIN
  52.         SET @SortSQL = STUFF(@SortBy, @Pos, 0, @SortDirection)
  53.     END ELSE BEGIN
  54.         SET @SortSQL = @SortBy + @SortDirection
  55.     END
  56.  
  57.     SELECT @SelectSql = '
  58.     SELECT *
  59.     FROM (
  60.         SELECT ROW_NUMBER() OVER(ORDER BY ' + @SortSQL + ') AS I_ID, *
  61.         FROM #SortTable WITH (NOLOCK)
  62.     ) SubSort
  63.     WHERE I_ID BETWEEN ' + CAST(@START AS nvarchar(10)) + ' AND ' + CAST(@END AS nvarchar(10)) + '
  64.     ORDER BY I_ID
  65.     OPTION (RECOMPILE)'
  66.  
  67.     EXEC sp_executesql @SelectSql
  68.  
  69.     IF @PrimaryIDColumnName IS NOT NULL
  70.     BEGIN
  71.         SELECT @SelectSql = '
  72.         SELECT @FullSortedIDList = (
  73.             SELECT ' + @PrimaryIDColumnName + ' AS ''@ID'',
  74.                    ROW_NUMBER() OVER(ORDER BY ' + @SortSQL + ') AS ''@RowNumber''
  75.             FROM #SortTable WITH (NOLOCK)
  76.             ORDER BY ' + @SortSQL + '
  77.             FOR XML PATH (''Item''), ROOT(''Items''), Type
  78.         )'
  79.        
  80.         SET @ParamDefinition = N'@FullSortedIDList xml OUTPUT';
  81.  
  82.         EXEC sp_executesql @SelectSql, @ParamDefinition, @FullSortedIDList = @FullSortedIDList OUTPUT
  83.     END
  84. END
  85.  
  86.  
  87. ALTER FUNCTION [mst].[DelimiteredString_Separate]
  88. (   @Delim nvarchar(50),
  89.     @Changes nvarchar(MAX)
  90. )
  91.  
  92. RETURNS
  93.    
  94.     @TempTable TABLE
  95. (
  96.     ColA nvarchar(250)
  97. )
  98.    
  99. AS
  100. BEGIN
  101.     DECLARE @CHANGE nvarchar(250)
  102.     DECLARE @INDEX INT
  103.     DECLARE @ColAValue nvarchar(250)
  104.  
  105.     SET @CHANGE = NULL
  106.  
  107.     WHILE (@Changes IS NOT NULL AND @Changes <> '')
  108.     BEGIN
  109.         SET @INDEX = CharIndex(@Delim, @Changes, 0)
  110.  
  111.         IF (@INDEX = 0)
  112.         BEGIN
  113.             SET @CHANGE = @Changes
  114.             SET @Changes = NULL
  115.         END
  116.         ELSE
  117.         BEGIN
  118.             SET @CHANGE = LEFT(@Changes, @Index-1)
  119.             SET @Changes = SUBSTRING(@Changes, @INDEX+1, LEN(@Changes))
  120.         END
  121.         INSERT INTO @TempTable
  122.         VALUES (@CHANGE)
  123.     END
  124. RETURN
  125. END
  126. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement