Advertisement
Guest User

Untitled

a guest
Aug 29th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.43 KB | None | 0 0
  1. DECLARE @qt_st INT;
  2. DECLARE @sp_bdy NVARCHAR(MAX);
  3. DECLARE @qt_bdy NVARCHAR(MAX);
  4. DECLARE @cur_pst INT;
  5. DECLARE @to_search INT;
  6.  
  7. -- first pass stripping HTML tags, adapted from https://stackoverflow.com/a/457725/
  8. DECLARE @sta_string INT;
  9. DECLARE @end_string INT;
  10. DECLARE @len_string INT;
  11. DECLARE @stripped_body NVARCHAR(MAX);
  12. DECLARE @stripped_spoiler NVARCHAR(MAX);
  13.  
  14.  
  15. -- at first, all posts containing spoilers are heaped into a temporary table, to improve performance
  16. SELECT TOP 10
  17. p.Id,
  18. p.Body,
  19. 1 AS sp_amnt,
  20. 1 AS bdy_amnt,
  21. p.CreationDate
  22.  
  23. INTO #temp_posts
  24.  
  25. FROM Posts AS p
  26.  
  27. WHERE ( CHARINDEX('<blockquote class="spoiler">', p.Body) > 0) AND ( p.PostTypeId = 1 );
  28.  
  29.  
  30. -- iterates across every single post in the temporary table
  31. -- second try using a cursor. Thanks to inspiration by @rene
  32.  
  33. DECLARE posts_cursor CURSOR
  34. FOR
  35. SELECT tmp.Id, tmp.Body -- tmp.bdy_amnt, tmp.sp_amnt
  36. FROM #temp_posts AS tmp
  37. FOR UPDATE OF tmp.bdy_amnt, tmp.sp_amnt;
  38.  
  39. OPEN posts_cursor;
  40.  
  41. FETCH FROM posts_cursor
  42. INTO @cur_pst, @qt_bdy;
  43.  
  44.  
  45. WHILE @@FETCH_STATUS = 0
  46.   BEGIN
  47.  
  48.     SET @qt_st = 1;
  49.     SET @to_search = 1;
  50.     WHILE @qt_st != 0 AND @qt_st IS NOT NULL
  51.       BEGIN
  52.             SET @qt_st = CHARINDEX('<blockquote class="spoiler">', @qt_bdy, @to_search);
  53.             SET @to_search = @to_search + @qt_st;
  54.         IF @to_search >= LEN(@qt_bdy)
  55.             SET @qt_st = 0;
  56.         IF @qt_st != 0 AND @qt_st IS NOT NULL
  57.           SET @sp_bdy = @sp_bdy + SUBSTRING(@qt_bdy, @qt_st,CHARINDEX('</blockquote>', @qt_bdy, @qt_st) - @qt_st);
  58.       END
  59.     -- first pass attempting to strip HTML tags before processing, adapted from https://stackoverflow.com/a/457725/
  60.    
  61.     SET @stripped_body = @qt_bdy;
  62.     SET @sta_string = CHARINDEX('<',@stripped_body)
  63.     SET @end_string = CHARINDEX('>',@stripped_body,CHARINDEX('<',@stripped_body))
  64.     SET @len_string = (@end_string - @sta_string) + 1
  65.     WHILE @sta_string > 0 AND @end_string > 0 AND @len_string > 0
  66.       BEGIN
  67.           SET @stripped_body = STUFF(@stripped_body,@sta_string,@len_string,'');
  68.           SET @sta_string = CHARINDEX('<',@stripped_body);
  69.           SET @end_string = CHARINDEX('>',@stripped_body,CHARINDEX('<',@stripped_body));
  70.           SET @len_string = (@end_string - @sta_string) + 1;
  71.       END  
  72.      
  73.     SET @stripped_spoiler = @sp_bdy;
  74.     SET @sta_string = CHARINDEX('<',@stripped_spoiler)
  75.     SET @end_string = CHARINDEX('>',@stripped_spoiler,CHARINDEX('<',@stripped_spoiler))
  76.     SET @len_string = (@end_string - @sta_string) + 1
  77.     WHILE @sta_string > 0 AND @end_string > 0 AND @len_string > 0
  78.       BEGIN
  79.           SET @stripped_spoiler = STUFF(@stripped_spoiler,@sta_string,@len_string,'');
  80.           SET @sta_string = CHARINDEX('<',@stripped_spoiler);
  81.           SET @end_string = CHARINDEX('>',@stripped_spoiler,CHARINDEX('<',@stripped_spoiler));
  82.           SET @len_string = (@end_string - @sta_string) + 1;
  83.       END  
  84.       UPDATE #temp_posts SET sp_amnt = LEN(LTRIM(RTRIM(stripped_spoiler))), bdy_amnt = LEN(LTRIM(RTRIM(@stripped_body))) WHERE CURRENT OF posts_cursor;
  85.    
  86.     FETCH FROM posts_cursor
  87.     INTO @cur_pst, @qt_bdy;
  88.   END
  89.  
  90. CLOSE posts_cursor;
  91. DEALLOCATE posts_cursor;
  92.  
  93. SELECT
  94.  
  95. Id AS [Post Link],
  96. CreationDate AS [Post DATE],
  97. bdy_amnt AS [Lenght OF Post (chars)],
  98. sp_amnt AS [Spoiler Content (chars)],
  99. ( sp_amnt * 100 / bdy_amnt ) AS [Percent Spoiler]
  100.  
  101. FROM #temp_posts
  102.  
  103. ORDER BY ( sp_amnt * 100 / bdy_amnt ) DESC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement